A mob programming web app for real-time collaboration at in-person events. The goal is to make the most of meetups/classes where a group of people with laptops are all sitting together in a room!
Table of Contents:
- What is mob programming? by the Agile Alliance
- Video: "Mob Programming, A Whole Team Approach" by Woody Zuill
- Article: "Introducing Mob programming: The best team technique you've (probably) never heard of" by Daniel P. Dern
- MobProgramming.org and the Mob Programming Conference
- (Done) Simple login system using GitHub authentication
- (Done) Display players' GitHub usernames and profile photos
- (Done) Use a nice code editor for features like line numbers, syntax highlighting, etc (Using Ace for this)
- (Done) Save code from each session in a Gist using GitHub API and give credit to each contributor accordingly!
- Run code within the app and display the output, similar to repl.it or CodePen or kodeWeave or Dabblet
- Add moderator controls (ideas include kicking out players, pausing the game, choosing whose turn it is, changing the timer duration, etc)
- (Maybe) Reintroduce anonymous user feature (just that they don't get credit for their commits, or they can only observe?)
- Add support for multiple game rooms
- Reintroduce non-turn-based collaborative text editor mode
- (Crazy idea for later) Add support for multiplexed/tabbed invididual code editors that users or moderators can watch all at once, like a control room at a TV production studio! Maybe users can set permissions to make their "room" open to collaborators or just to viewers.
- Just a turn-based, collaborative plain text box!
- Countdown timer displays the remaining time for each player and resets after each turn
- Players can enter their name or stay anonymous
- Active player list displays names and highlights whose turn it is
- App displays who has the current turn and who has the next turn
- App gets the user's attention somehow when it's their turn
- Tools: NodeJS, Express, SocketIO, plain vanilla JavaScript and HTML/CSS
High-level, simplified state chart:
Note: As of 2017-07-10, client-side game state currently handles the editor content differently, using a separate Ace Editor object instead.
{
timeRemaining,
turnIndex,
currentGist: {id, url, owner},
players:
[
{id, login,avatar_url}, { ... }, { ... }, ...
],
editor:
{
content,
cursorAndSelection: { cursor: {column, row}, range: { end: {column, row}, start: {column, row} },
scroll: {scrollLeft, scrollTop}
}
}
| Event Name | Sent By | Sent To | Data | Description |
|---|---|---|---|---|
playerJoined | Client | Server | {login, avatar_url} | When new player completes login process |
playerJoined | Server | All other clients | {id, login, avatar_url} | Update other clients with new player data |
gameState | Server | One client | See game state model in section above! | Initialize game state for new player that just logged in, and trigger new gist creation if game is just starting! |
playerLeft | Server | All other clients | id | Update other clients to remove disconnected player |
turnChange | Server | All clients | onDisconnect (Boolean) | Trigger clients to change the turn |
newGist | Client | Server | {id, url, owner} | Broadcast new Gist data |
editorTextChange | Client | Server | "current content, just a string!" | Broadcast changes to code editor content |
editorCursorChange | Client | Server | { cursor: {column, row}, range: { end: {column, row}, start: {column, row} } | Broadcast cursor moves or selection changes |
editorScrollChange | Client | Server | {scrollLeft, scrollTop} | Broadcast changes to code editor content |
disconnect | Client | Server | ... | When clients disconnect from server (SocketIO function) |
connection | Client | Server | ... | When clients connect to server (SocketIO function) |
Today's notes: https://learningnerd.com/2017/03/28/
Milestones:
- Started this project! Created the repo, created HTML mockup for the UI, wrote the first set of project goals.
Today's notes: https://learningnerd.com/2017/03/39/
Milestones:
- Version 0 (branch
v0-shared-editor): collaborative real-time text-editing now works, yay! Just a simple shared text editor.
Today's notes: https://learningnerd.com/2017/03/31/
Milestones:
Finished and cleaned up version 0 (
branch v0-shared-editor) with collaborative real-time text-editing (no turn-based system).Version 1 (branch
v1-turnbased-simple) with turn-based system now works!
Milestones:
- New feature: added Ace (an open source embeddable code editor) to replace the plain text box, and it works great!
Milestones:
- Ace editor now syncs scroll, cursor, and selection changes between all clients!
Milestones:
Finished the GitHub login for static websites tutorial that I had started last week and now I think I finally understand promises, the point of environment variables, and the basics of GitHub authentication and API requests in general!
Started new branch (
github-auth) to require users to log in via GitHub before starting the gameFinished the user login and GitHub authentication features! Users now have to log in with GitHub before they can play, and the game displays their GitHub username and avatar.
Did my first live user test at my weekly web dev study group! Got some great feedback on the app and identified a couple bugs (which I think I already fixed in my dev branch).
Today's notes: https://learningnerd.com/2017/04/06/
Milestones:
Finally started using the Dotenv package to manage local environment variables.
Switched to handling GitHub authentication with my own server and learned how to make a new route that makes a POST request from Node and redirects the user back to the homepage with their GitHub access token. Woohoo!
Set up production version with Heroku environment variables, no more hard-coded URLs or client ID (for now, just using an AJAX request to get the client ID from the server).
Did a second user test, this time virtually, with this fun practice problem from r/DailyProgrammer! Got some good feedback and identified some more bugs.
Today's notes: https://learningnerd.com/2017/04/07/
Milestones:
Made my first commit using just the GitHub API (via command line testing it out with cURL)!
Researched GitHub's features and API more to identify how I could structure this app.
Today's daily learning blog post: https://learningnerd.com/2017/04/10/
Milestones:
Started keeping learning notes in my blog, instead of just dumping them all in here. (Better to reserve this doc just for short summaries.)
After a lot of wasted time because of a couple typos, I successfully created a new GitHub gist from within my app using a client-side AJAX POST request to the GitHub API!
Today's daily learning blog post: https://learningnerd.com/2017/04/11/
Milestones:
- Successfully created, forked, and edited a gist using the GitHub API!
- Integrated new events and logic flow into the app for saving version history using GitHub gists!
- The app can now create and edit gists on each user's turn, but not working for forks yet.
Today's daily learning blog post: https://learningnerd.com/2017/04/12/
Milestones:
- Fixed the turn change logic to work properly with saving version history using the GitHub Gists API.
Today's daily learning blog post: https://learningnerd.com/2017/04/13/
Milestones:
- Fixed the bug where any code written in the delay between forking and editing a gist gets attributed to the wrong player.
Today's daily learning blog post: https://learningnerd.com/2017/04/13/
Milestones:
- Fixed the bug where any code written in the delay between forking and editing a gist gets attributed to the wrong player.
Today's daily learning blog post: https://learningnerd.com/2017/06/21/
Milestones:
- Moved some notes from this README into separate blog posts, added Table of Contents to README.
- Fixed setup script so that it no longer overwrites the
.envfile if it already exists.
Today's daily learning blog post: https://learningnerd.com/2017/06/27/
Milestones:
- Finally posted a bunch of issues for next refactoring tasks, bugs, and feature ideas.
- Started refactoring and closed issue #1.
Today's daily learning blog post: https://learningnerd.com/2017/06/28/
Milestones:
Finally got the app working again!!! Successful live user test at tonight's web dev study meetup! (The server never crashed!)
Added updated flowchart and events list to this README for version 1.0.0 documentation.
Fixed the main (most obvious) bug, closing issue #8 ("Error thrown when client calls updateCurrentGistView the first time to create initial Gist")!
Closed issue #3 ("Simplify client-side code for determining when to fork/edit Gist"), which lead to opening issue #20 ("Game state should track previous and current player for Gist forking/editing logic"), which I closed with pull request #25, which then led to opening issue #24 ("If current player disconnects, next turn can trigger unwanted Gist fork").
Today's daily learning blog post: https://learningnerd.com/2017/06/29/
Milestones:
Realized most of yesterday's work was based on an incorrect assumption, so threw out pull request #25 and replaced issue #20 and issue #24 with issue #26 ("Game state should track Gist owner for forking/editing logic") -- a much better solution!
Closed issue #26, solving that bug once and for all! Updated the flowchart accordingly.
Today's daily learning blog post: https://learningnerd.com/2017/06/30/
Milestones:
- Created high-level UML state machine diagram, added to this README for version 1.0.0 documentation.
Today's daily learning blog post: https://learningnerd.com/2017/07/03/
Milestones:
Closed #issue #4 ("Change game start condition to check state of the player list")
Opened issue #29 ("Sometimes when last user disconnects (maybe while turn is changing?), server crashes")
Merged issue #5 ("Consolidate the playerListChange and updateState events") into issue #16 ("Simplify the game state data model and events on client and server") and updated issue #16.
Finished initial rewrite of events list and game state data model, started the major refactoring task for issue #16, stripping out all the guts of this app and replacing them all!
Today's daily learning blog post: https://learningnerd.com/2017/07/10/
Milestones:
Main refactoring task completed! Finally closed issue #16 ("Simplify the game state data model and events on client and server"), also closing issue #18 and issue #14 in the process!
Added game state and updated events list for version 1.0.0 documentation in this README.
Closed [issue #15 ("Send GitHub access token as a header, not as a URL parameter")(#15)! Not sure if this is the best solution, but I can't think of a better way to handle client-side authentication without sessions.