Team — Sathwik Aala, Ravi Teja, Deepesh
Duration — 45 days
Course — Interaction Design Practice
Executive summary
User research findings
Low and high-fidelity prototypes
Usability evaluation report
Sharecode is a programming editor that is specifically designed for undergraduate students in a classroom setting. Using this editor, students collaborate with one another and receive comments on their code. Additionally, this editor helps instructors understand where the students are facing difficulty and enable them to help them accordingly. This project was a part of my Human-Computer Interaction graduate course.
I collaborated with 2 of my classmates in researching and designing this project. The higher-level UX design process we followed is shown below.
Dashboard that shows the overall performance of the class and areas that needs improvement.
Dashboard that shows the overall grade, performance on different assignments, and to-do list.
Using code history, instructors and other reviewers view and understand where exactly the student is having difficulty.
Instructor uses and grades the assignments within the sharecode editor. Students visualize here where exactly they lost points.
Students can share their code with others and seek code reviews. Reviewers here comment or provide alternate code to help them.
Students view all the comments they received from the reviewers. Students select and view each comment with the code block on which it is commented.
We began our research by studying the existing teaching methodologies of learning a programming language or a skill. As a result, we explored various research papers, articles, and journals regarding programming education. Considering the project's time and scope, we decided to focus only on undergraduate students in a classroom setting.
Our research found that about 9.8% of undergraduate students in computer science or programming majors drop-out before finishing their course. We learned that many online tutorials help understand the basics but do not provide the practical knowledge required to code a solution. Also, other resources such as Stackoverflow, Github, etc. are not beginner-friendly. As a result, we conducted user research that helps newcomers learn a programming language effectively.
To understand more about the teaching techniques, areas of improvement in undergraduate programming education, we interviewed 12 students, two professors, and a Teaching Assistant. We tried to understand the fundamental problems of a programming class and why some students donot score high enough in the assignments to pass the course. Some of the insights and comments from the interviewees are listed below.
01
"I have trouble translating the theory and class exercises we learn to actual code. I can do better if I have some help."
"My friend helps me with the assignments all the time. He usually points me into the direction I should be going."
02
"I want to see the students’ performance to the rubric level. This can help me create a proper plan of action."
"Having a higher level view of the grades of overall class can help me understand where they need my help the most."
03
"If I am not with my friend, I send him my entire code and he runs it in his system to see what’s wrong. This takes time."
"I usually wait until TA hours to get a review. That is the only time I can get someone to take a look at my assignment."
04
"If I can see the all the steps the student has taken in writing that piece of code, I can understand where they had trouble."
"Many students don’t understand the rubric. Every time I release grades, they come and ask me where they lost points."
05
"In the beginning, students usually do not write efficient code. They need practice and help to get better at coding."
"I always provide solution code after every assignment. Using that, students understand an alternate way of solving the problem."
Using the Affinity Diagramming technique, we organized all the information collected from interviews and literature review to create patterns and insights as below
Along with the analysis, we also performed a secondary research on our problem statement. We tried to understand what solutions are present in the market, which solve programming students' problems. We went through some research papers and articles to gather data that we felt would be relevant to our project. One of the research articles which played a crucial role in our project is here.
Based on the user research we conducted, we created three personas we thought would represent our target users as shown below.
Using the personas and the insights we derived, we brainstormed numerous ideas that we thought would address our problem space. We then started filtering them based on technical, economic, and social feasibility. We combined the best part of some ideas so that they serve the purpose of helping students and instructors in a programming class. We tested and analyzed many ideas to decide on the final design solution.
Our final design solution was to build a code editor for students and instructors of an undergraduate programming class. This editor allow students to write and share their code with other students who are the reviewers. The reviewers then comment on the student's code with the help of their code history. When students share their coding assignments with instructors, they receive grades and comments in the editor.
This code editor was incorporated as an extension of Canvas, which is a Learning Management System (LMS) that most of the universities in the United States use. Since Canvas provides APIs to build third-party extensions, we were sure about our design solution's feasibility.
After brainstorming and deciding on the final idea, we were skeptical of whether implementing code history can help reviewers understand where a student has difficulty coding. So, I put my Javascript coding skills into use and created a small mockup. I tested it with six students and found that code history can help reviewers provide proper guidance and comments. Below is the code I wrote for the mock up.
function debounce(cb, interval, immediate) {
var timeout;
return function() {
var context = this, args = arguments;
var later = function() {
timeout = null;
if (!immediate) cb.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, interval);
if (callNow) cb.apply(context, args);
};
};
function keyPressCallback() {
var target = document.getElementById('target');
var input = document.getElementById('input');
var para = document.createElement("P");
para.innerHTML = input.value;
target.appendChild(para);
}
document.getElementById('input').onkeypress = debounce(keyPressCallback, 500);
After the feasibility testing, we created storyboards to get a better idea of the solution and to fill any gaps we find. They are as below
1. A student getting help from his classmates
Student wants to improve his knowledge in coding
Student finds the code too difficult to write
Student invites his friend for help
The student's friend suggests him to share his code for review
The student's friend is effectively able to guide him
Student's doubts have been cleared and he feels that he learnt something useful.
2. Student and Instructor working together to resolve doubts
The professor receives an email from the student, asking him a doubt
The professor wants the student to share the code via the collaborative platform to help the student with the code.
The professor receives an email from the student with the link to work collaboratively.
The professor helps the student with his code.
The professor is happy to have helped the student to complete his assignment, which would help him get better grades.
3. Student sharing code context with the instructor
Professor is grading his students' work and came across a student's work which is not up to the mark
Student has a hard time understanding how to code and have difficulties in assignment work
Student meets his instructor to get some help from him to better his grades
Student is talking to his classmate regarding his problem and he is suggesting a solution to his problem
Student started using the new editor for his assignment
Student meets his Instructor to understand where he is going wrong while writing the code.
4. Professor finds it easy to understand where exactly student is facing trouble.
Professor is looking at student's code history and making sense of his thought process
Student received a detailed feedback on his past assignment from his professor
Professor understood his students' problem and trying to figure out a solution
After storyboarding, we started sketching our design solution on paper. After multiple iterations the prototypes are as below.
Login Screen for Teachers and Students
Student Portal Landing Page with Code Editor
Grouping of code blocks to access features
Options to Add Context or view Code Edits
Adding Context, Rationale behind the code
Sharing for collaboration or Code review
Viewing Code Edit history made in the code block
Overall Code Edit of the project
Instructor's grading portal
Rubric grading against the relevant code block
Feedback / Alternative code suggestion
After creating paper prototypes, we began evaluation right away. We used techniques such as Cognitive Walkthrough and Heuristic Analysis to evaluate the usability of our paper prototype. Based on the results of the evaluation, we made changes and iterated them. Most of the changes we made are of changing the layout of the editor and not the functionality of them.
We used Figma for designing high-fidelity screens and also for prototyping. In this stage, there were several iterations of the screens based on the aestheics and usability. Below are final screens we designed.
Instructor's sign in
Student's sign in
Instructor's dashboard
Student's dashboard
Instructor viewing a student's code
Student viewing their code
Instructor highlighting a code block for options
Student sharing thier code with others
Student highlighting a code block for options
Reviewer highlighting a code block to see code history
Reviewer highlighting a code block to add comments
Instructor highlighting a code block and adding grade
Student viewing grade/rubric for a code block
Students viewing all the comments
After creating high-fidelity prototypes, we began working on usability testing. Six users and three user experience designers participated in our usability testing and evaluation sessions. We created three tasks with the editor and performed think-aloud usability evaluations with the users. Later, we asked the participants to fill a post-task questionnaire to understand their experience.
01
Student participants who have used the product felt that the editor can definitely help them in learning programming skills easily.
02
Teaching Assistants liked the idea of selecting a code block and grading it using the rubric. They felt that it would help students learn about their difficulties.
03
Some students expressed concern about using code history. They think it is difficult to understand and analyze the code as they are also beginners.
04
UX experts felt that the design can address the problem we are trying to solve to some extent. However, they expressed concern that it takes a lot of training to use the editor.
Working on this project has helped me grow as a UX Researcher and Designer. I learned a lot of things working on this project. Especially, I learned that after brainstorming, it is very important to validate and test the selected design solution in order to see if it addresses the problem statement properly and works as expected or not. I also learned that evaluating and testing the usability on paper prototypes can be valuable and insightful, especially in reducing the cost and saving time of changing high-fidelity prototypes
Playship Mobile Gaming Application
Smartcart — Instore Grocery shopping