Intern

Tech Stack

TypeScript

Node

NextJs

Tailwind

GitHub

Vercel

React

PostgreSQL


The project

This was the final project at the School of Code, it was a 4 week team project to deliver a working MVP for a clients brief. During this project I was team leader for both the first and final weeks, I also took ownership of tickets/Trello board to ensure the project could be delivered on such a tight timeline.


Our solution: Intern

Intern dashboard

A data dashboard giving you all the useful information at a glance, named as such as it's unpaid and does all the grunt work so you don't have to.


The brief

Our client was the School of Code itself, it utilised Zoom to facilitate day to day operations. However they did not leverage the rich data available from Zoom's API, SDK's and web-hook services. They wanted us to explore these capabilities and create a dashboard to assist the running of the bootcamp.

breaking down the problem

Our structure for 4 weeks ended up being divided up as follows:


Week 1

Team set up

To get started, the team all introduced themselves, a chance to understand everyones backgrounds, strengths and weaknesses. We then created and agreed on a team manifesto to give us an agreed operating procedure for the next few weeks.

Our team manifesto

Kick off

Upon receiving the brief we laid out our assumptions so we could understand the gaps in our knowledge and assert what we needed to verify to ensure we understand the problem so that we could design an appropriate solution. Time was dedicated to studying the Zoom documentation as there are a lot of options and interactions that can be tracked using specific means. We couldn't begin to ideate if we did not understand the capabilities available to us.


Personas

After our research activities we created UX persona's for our key users. This allowed us to build empathy and a understand how the problem impacted their workflows.

UX personas

Ideation

I then led the team through a Disney ideation workshop to rapidly and creatively iterate on solutions for our personas. These initial ideas were built out into minimum viable products which then were extended into minimum viable experiences (MVE). User stories could then be written for each MVE and lo-fi mockups of how this might feel could be created.

Disney ideation session

Feasibility

In order to ensure our ideas were actually deliverable within the time frame t-shirt sizing was used to estimate the time it would take to deliver each feature. This then allowed us to present it to the stakeholder with restrictions on how many features they could request in this 4 week sprint cycle. We could deliver 1 small, 1 medium and 1 large feature outside of the base requirements of authentication and attendance tracking.

Shirt sizing to prevent us from over comitting

Stakeholder meeting

We presented our findings and negotiated with the stakeholder what the final deliverables needed to be. We settled on providing the following:

Outcome of the meeting with stakeholders

Finishing up week 1

To close out the week we set up the team Trello board, agreed epics, user stories and tasks that needed to be completed. Ran a team retro to understand how everyone was getting on and make any adjustments to our processes as needed.

trello board at the start

Agreed on our tech stack of NextJs, TypeScript and Tailwind. These were chosen for the following reasons:


Week 2

With the epics all broken down into stories and tasks the work could be divided throughout the team. One team implemented supabase authentication to create a login wall, required to keep our site secure. Whilst the other started work on the components. By the end of the week we had all 4 dashboard components created using hardcoded data objects to allow us to test out the functionality alongside a working login system.

supabase login page

I led the planning of the backend structure, including the database schema, the MVC setup and how we could calculate an initial engagement score using the data available to us from our zoom API.

How data flow is managed in our application
Planning the database schema
Database schema in supabase
Engagment logger algorithm planning

The week concluded with setting up the database and a stakeholder presentation to update them on our progress and our proposed sprint goals for the remaining weeks of the project.


Week 3

Started with creating the algorithms to calculate the engagement grade of a bootcamper alongside my colleague Kit, whilst the team focused on creating a piece of middleware to check and refresh our Zoom access token (as it expires every hour) if needed to assist us with our Zoom API calls.

Engagment logger algorithm code

I took ownership of setting up the MVC system to allow communication with our database, once this was completed the team began work fetching data and translating into props for our react component's. The focus was on making everything work with our test database first and then using the Zoom API in the future to populate the database.

We had real issues this week as the team struggled with translating the database requests into the props needed. The solution to this was improve our ticket writing process. Instead of just being a top level requirement more complext tickets got broken down into each expected step to give then an example of how the problem might be solved.

Trello ticket broken down into each step needed

Our initial understanding of how we could use NextJS's ISR to reload components at set intervals was incorrect. ISR is designed to be used at a page level, not at a component level. So we could only use it to reload the whole dashboard which wasn't ideal. Upon some brainstorming and googling I found that we could update our database using a scheduled cron job as Vercel supports them and then using setTimeout on components to get them to reload/refetch their props from the database.


Week 4


Entering the final week we were behind schedule, this led to a tight structured plan on what we needed to deliver. A refined Trello board later and we got to work. First step was to finish all the test database to front end pipelines.


With these created one half of the team began creating end to end tests to validate and refine our code, the other half with me began work on setting up the pipeline between Zoom and our database.


During testing the team kept coming up against a 'too many connections' error with our database. Initially to try and get around this I set a max pool connection limit and increased our allowance from our provider ElephantSQL but we kept hitting the limits. However this still caused problems as if multiple users are accessing the system our connection limit of 15 was still far to few to give good performance. The solution found to this was to migrate the database to another provider supabase as they provided a much higher connection limit.



Last-minute additions to the project included creating a simulated zoom poll prop for demonstration purposes as without a live zoom call to use it on it's hard to communicate the value of the tool.

Zoom polls animated gif to demostrate feature

Big O optimization

In order to try and reduce calls to the database for performance, the function to update all the engagment grades was refined from using a nested loop to caclulating the breakpoints ahead of time. Reducing it from 0n2 (quadratic) to 0n (linear) thereby dramatically improving it's scalability


To close the project for Christmas I ran a team retro across the whole project with a focus on the positives to raise moral after a challenging few weeks.

Final team retro before christmas

Future iterations, if we had another 4 week sprint cycle


Personal reflections