SlideShare a Scribd company logo
1 of 68
Download to read offline
Simplify writing code with
deliberate commits
LRUG - June 2019
Joel Chippindale - @joelchippindale
Joel Chippindale
CTO at
Unmade
Video © Rapha Racing Limited 2019. All rights reserved
“If you can’t explain
it simply, you
don’t understand
it well enough.”
- Albert Einstein (probably)
en.wikiquote.org/wiki/Albert_Einstein
Image by Cory Doctorow (CC BY-SA)
Our work requires
us to make changes
to complex systems
@joelchippindale
We learn to break down
complex problems into
small, simple steps
Image by WOCinTech Chat (CC BY)
Great developers are
really good at
breaking problems
into simple steps
@joelchippindale
This takes discipline and
willpower...
@joelchippindale
...but we can learn to
make it easier
@joelchippindale
When I started using git it
changed the way that I
developed software
5 Practices
1. Plan your commits
2. Use single purpose branches
3. Make atomic commits
4. Write good commit messages
5. Rewrite your history to tell a story (early
and often)
Image by Alexander Baxevanis (CC BY)
Practice 1:
Plan your commits
@joelchippindale
Make a plan for the
commits that you will
make
@joelchippindale
What if you don't know
enough yet to make a
plan?
@joelchippindale
What if the plan changes?
@joelchippindale
Plan your commits ahead
of time and re-plan when
you need to
Image by Jon Bennet
Practice 2:
Use single purpose
branches
@joelchippindale
Name your branch to
reflect it's (single)
purpose
@joelchippindale
Notice when you are
starting to work on
something else
@joelchippindale
Notice if a commit has
value independent of the
branch
@joelchippindale
...and if it does, then
'cherry pick' it onto
master
git cherry-pick
# Enables you to apply a single
# commit from another branch
# onto master
master
your-dev-branch
$
A
B
C
D
master
your-dev-branch
git checkout master
A
B
C
D
$
master
your-dev-branch
A
B
C
D
git checkout master$
master
your-dev-branch
A
B
C
DD
git cherry-pick your-dev-branch$
master
your-dev-branch
A
B
C
D
D`
git cherry-pick your-dev-branch$
master
your-dev-branch
A
B
C
D
D`
git checkout your-dev-branch$
master
your-dev-branch
A
B
C
D
D`
git checkout your-dev-branch$
master
your-dev-branch
A
B
C
D
D`
git rebase master$
master
your-dev-branch
A
B
D`
C`
git rebase master$
@joelchippindale
Keep focussed by making
each development
branch single purpose
Image by lupusphotos (CC BY)
Practice 3:
Make atomic
commits
@joelchippindale
Decide the one change
you are going to make
and commit it
@joelchippindale
How big a change should
I make?
@joelchippindale
Minimum valuable
commit
@joelchippindale
Be suspicious of 'and' in
your commit message
@joelchippindale
Notice when you start
doing something else and
stop
git add --patch
# Enables you to review all your
# changes and decide which to
# add to your commit
$ git add --patch
diff --git a/layout/models.py b/layout/models.py
index f2dd5a8..b4dd522 100644
--- a/layout/models.py
+++ b/layout/models.py
@@ -27,7 +27,7 @@ class Layout(models.Model):
def __str__(self):
if self.is_layplan:
- return "Layplan: {}".format(self.data.get("slug", self.code))
+ return "Layplan: {}".format(self.data.get("name", self.code))
else:
return "Layout: {}".format(self.code)
Stage this hunk [y,n,q,a,d,e,?]?
@joelchippindale
Make each step simple by
making atomic commits
Image by Ginny (CC BY-SA)
Practice 4:
Write good commit
messages
dc8f609 It worked for me
a813998 Final commit, ready for tagging
834a288 Don't push this commit
7cd9b24 WTF
901b51c done. going to bed now.
57d298f WIP
704de26 This will definitely work
b4512c6 This might work
d90b710 Trying to fix it again
c57b012 Debug stuff
Note: These messages are mostly taken from http://whatthecommit.com
@joelchippindale
What does good look
like?
Short one line title
Longer description of what the change achieves
(if the title isn’t enough).
An explanation of why the change is being made.
Perhaps a discussion of context and/or
alternatives that were considered.
Short one line title
Longer description of what the change
achieves (if the title isn’t enough).
An explanation of why the change is being
made.
Perhaps a discussion of context and/or
alternatives that were considered.
Short one line title
Longer description of what the change
achieves (if the title isn’t enough).
An explanation of why the change is being
made.
Perhaps a discussion of context and/or
alternatives that were considered.
Short one line title
Longer description of what the change
achieves (if the title isn’t enough).
An explanation of why the change is being
made.
Perhaps a discussion of context and/or
alternatives that were considered.
Short one line title
Longer description of what the change
achieves (if the title isn’t enough).
An explanation of why the change is being
made.
Perhaps a discussion of context and/or
alternatives that were considered.
Correct the colour of FAQ link in course notice footer
PT: https://www.pivotaltracker.com/story/show/84753832
In some email clients the colour of the FAQ link in the
course notice footer was being displayed as blue instead of
white. The examples given in PT are all different versions of
Outlook. Outlook won't implement CSS changes that include `!
important` inline[1]. Therefore, since we were using it to
define the colour of that link, Outlook wasn't applying that
style and thus simply set its default style (blue, like in
most browsers). Removing that `!important` should fix the
problem.
[1] https://www.campaignmonitor.com/blog/post/3143/
outlook-2007-and-the-inline-important-declaration/
@joelchippindale
Clear space in your head
by writing good commit
messages
Image by Nic McPhee (CC BY-SA)
Practice 5:
Rewrite your history
to tell a simple story
(early and often)
@joelchippindale
You make mistakes and
change your mind
git rebase --interactive
# Enables you to move, reorder,
# edit, merge and split your
# commits
343eed2 Fix typo in foo
ba66794 Add bar
90328f9 Add foo
git rebase --interactive master
1 pick 90328f9 Add foo
2 pick ba66794 Add bar
3 pick 343eed2 Fix typo in foo
4
5 # Rebase c405e59..343eed2 onto c405e59 (3 commands)
6 #
7 # Commands:
8 # p, pick <commit> = use commit
9 # r, reword <commit> = use commit, but edit the commit message
10 # e, edit <commit> = use commit, but stop for amending
11 # s, squash <commit> = use commit, but meld into previous commit
12 # f, fixup <commit> = like "squash", but discard this commit's log message
13 # x, exec <command> = run command (the rest of the line) using shell
14 # b, break = stop here (continue rebase later with 'git rebase --continue')
15 # d, drop <commit> = remove commit
16 # l, label <label> = label current HEAD with a name
17 # t, reset <label> = reset HEAD to a label
1 pick 90328f9 Add foo
2 pick 343eed2 Fix typo in foo
3 pick ba66794 Add bar
4
5 # Rebase c405e59..343eed2 onto c405e59 (3 commands)
6 #
7 # Commands:
8 # p, pick <commit> = use commit
9 # r, reword <commit> = use commit, but edit the commit message
10 # e, edit <commit> = use commit, but stop for amending
11 # s, squash <commit> = use commit, but meld into previous commit
12 # f, fixup <commit> = like "squash", but discard this commit's log message
13 # x, exec <command> = run command (the rest of the line) using shell
14 # b, break = stop here (continue rebase later with 'git rebase --continue')
15 # d, drop <commit> = remove commit
16 # l, label <label> = label current HEAD with a name
17 # t, reset <label> = reset HEAD to a label
1 pick 90328f9 Add foo
2 fixup 343eed2 Fix typo in foo
3 pick ba66794 Add bar
4
5 # Rebase c405e59..343eed2 onto c405e59 (3 commands)
6 #
7 # Commands:
8 # p, pick <commit> = use commit
9 # r, reword <commit> = use commit, but edit the commit message
10 # e, edit <commit> = use commit, but stop for amending
11 # s, squash <commit> = use commit, but meld into previous commit
12 # f, fixup <commit> = like "squash", but discard this commit's log message
13 # x, exec <command> = run command (the rest of the line) using shell
14 # b, break = stop here (continue rebase later with 'git rebase --continue')
15 # d, drop <commit> = remove commit
16 # l, label <label> = label current HEAD with a name
17 # t, reset <label> = reset HEAD to a label
4a14d7b Add bar
c296093 Add foo
@joelchippindale
Make your progress clear
by rewriting your history
to tell a simple story
To recap the 5 practices
1. Plan your commits
2. Use single purpose branches
3. Make atomic commits
4. Write good commit messages
5. Rewrite your history to tell a story (early
and often)
git cherry-pick
git add --patch
git rebase --interactive
@joelchippindale
Following these 5
practices will free up your
brain and help you break
work into small steps
@joelchippindale
As an added bonus...
@joelchippindale
...it can also provide
valuable documentation
for your code
“Every line of code is
always documented”
- Mislav Marohnić
mislav.net/2014/02/hidden-documentation/
@joelchippindale
Thank you
Joel Chippindale - CTO at Unmade - @joelchippindale
Thanks to my teams at Unmade, FutureLearn and Econsultancy who have all
helped develop and refine these habits.
Come and work with us at Unmade
www.unmade.com/careers/
@joelchippindale
Links for more info
•A Branch in Time (a story about revision histories)
•Every line of code is always documented
•Telling stories with your Git history

More Related Content

Similar to Simplify writing code with deliberate commits

Telling stories through your commits (Jan 2015)
Telling stories through your commits (Jan 2015)Telling stories through your commits (Jan 2015)
Telling stories through your commits (Jan 2015)FutureLearn
 
Catalyst - refactor large apps with it and have fun!
Catalyst - refactor large apps with it and have fun!Catalyst - refactor large apps with it and have fun!
Catalyst - refactor large apps with it and have fun!mold
 
Telling stories through your commits - Lead Developer Conference 2016
Telling stories through your commits - Lead Developer Conference 2016Telling stories through your commits - Lead Developer Conference 2016
Telling stories through your commits - Lead Developer Conference 2016Joel Chippindale
 
Core .NET Framework 4.0 Enhancements
Core .NET Framework 4.0 EnhancementsCore .NET Framework 4.0 Enhancements
Core .NET Framework 4.0 EnhancementsRobert MacLean
 
Nicola Iarocci - Git stories from the front line - Codemotion Milan 2017
Nicola Iarocci - Git stories from the front line - Codemotion Milan 2017Nicola Iarocci - Git stories from the front line - Codemotion Milan 2017
Nicola Iarocci - Git stories from the front line - Codemotion Milan 2017Codemotion
 
Cpp17 and Beyond
Cpp17 and BeyondCpp17 and Beyond
Cpp17 and BeyondComicSansMS
 
Nikolai Boiko "NodeJS Refactoring: How to kill a Dragon and stay alive"
Nikolai Boiko "NodeJS Refactoring: How to kill a Dragon and stay alive"Nikolai Boiko "NodeJS Refactoring: How to kill a Dragon and stay alive"
Nikolai Boiko "NodeJS Refactoring: How to kill a Dragon and stay alive"NodeUkraine
 
FluentMigrator - Dayton .NET - July 2023
FluentMigrator - Dayton .NET - July 2023FluentMigrator - Dayton .NET - July 2023
FluentMigrator - Dayton .NET - July 2023Matthew Groves
 
GIT in a nutshell
GIT in a nutshellGIT in a nutshell
GIT in a nutshellalignan
 
Advanced Git Techniques: Subtrees, Grafting, and Other Fun Stuff
Advanced Git Techniques: Subtrees, Grafting, and Other Fun StuffAdvanced Git Techniques: Subtrees, Grafting, and Other Fun Stuff
Advanced Git Techniques: Subtrees, Grafting, and Other Fun StuffAtlassian
 
Automatically Documenting Program Changes
Automatically Documenting Program ChangesAutomatically Documenting Program Changes
Automatically Documenting Program ChangesRay Buse
 
Functional Smalltalk
Functional SmalltalkFunctional Smalltalk
Functional SmalltalkESUG
 
Git in pills : git stash
Git in pills : git stashGit in pills : git stash
Git in pills : git stashFederico Panini
 

Similar to Simplify writing code with deliberate commits (20)

Telling stories through your commits (Jan 2015)
Telling stories through your commits (Jan 2015)Telling stories through your commits (Jan 2015)
Telling stories through your commits (Jan 2015)
 
Catalyst - refactor large apps with it and have fun!
Catalyst - refactor large apps with it and have fun!Catalyst - refactor large apps with it and have fun!
Catalyst - refactor large apps with it and have fun!
 
GIT Basics
GIT BasicsGIT Basics
GIT Basics
 
Telling stories through your commits - Lead Developer Conference 2016
Telling stories through your commits - Lead Developer Conference 2016Telling stories through your commits - Lead Developer Conference 2016
Telling stories through your commits - Lead Developer Conference 2016
 
Core .NET Framework 4.0 Enhancements
Core .NET Framework 4.0 EnhancementsCore .NET Framework 4.0 Enhancements
Core .NET Framework 4.0 Enhancements
 
Nicola Iarocci - Git stories from the front line - Codemotion Milan 2017
Nicola Iarocci - Git stories from the front line - Codemotion Milan 2017Nicola Iarocci - Git stories from the front line - Codemotion Milan 2017
Nicola Iarocci - Git stories from the front line - Codemotion Milan 2017
 
Cpp17 and Beyond
Cpp17 and BeyondCpp17 and Beyond
Cpp17 and Beyond
 
Nikolai Boiko "NodeJS Refactoring: How to kill a Dragon and stay alive"
Nikolai Boiko "NodeJS Refactoring: How to kill a Dragon and stay alive"Nikolai Boiko "NodeJS Refactoring: How to kill a Dragon and stay alive"
Nikolai Boiko "NodeJS Refactoring: How to kill a Dragon and stay alive"
 
C++ Core Guidelines
C++ Core GuidelinesC++ Core Guidelines
C++ Core Guidelines
 
FluentMigrator - Dayton .NET - July 2023
FluentMigrator - Dayton .NET - July 2023FluentMigrator - Dayton .NET - July 2023
FluentMigrator - Dayton .NET - July 2023
 
CMake best practices
CMake best practicesCMake best practices
CMake best practices
 
GIT in a nutshell
GIT in a nutshellGIT in a nutshell
GIT in a nutshell
 
Advanced Git Techniques: Subtrees, Grafting, and Other Fun Stuff
Advanced Git Techniques: Subtrees, Grafting, and Other Fun StuffAdvanced Git Techniques: Subtrees, Grafting, and Other Fun Stuff
Advanced Git Techniques: Subtrees, Grafting, and Other Fun Stuff
 
A short guide to git's interactive rebase
A short guide to git's interactive rebaseA short guide to git's interactive rebase
A short guide to git's interactive rebase
 
Automatically Documenting Program Changes
Automatically Documenting Program ChangesAutomatically Documenting Program Changes
Automatically Documenting Program Changes
 
Tool Time
Tool TimeTool Time
Tool Time
 
Functional Smalltalk
Functional SmalltalkFunctional Smalltalk
Functional Smalltalk
 
RSpec
RSpecRSpec
RSpec
 
Ad505 dev blast
Ad505 dev blastAd505 dev blast
Ad505 dev blast
 
Git in pills : git stash
Git in pills : git stashGit in pills : git stash
Git in pills : git stash
 

Recently uploaded

SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphNeo4j
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
APIForce Zurich 5 April Automation LPDG
APIForce Zurich 5 April  Automation LPDGAPIForce Zurich 5 April  Automation LPDG
APIForce Zurich 5 April Automation LPDGMarianaLemus7
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
Artificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraArtificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraDeakin University
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 

Recently uploaded (20)

SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
APIForce Zurich 5 April Automation LPDG
APIForce Zurich 5 April  Automation LPDGAPIForce Zurich 5 April  Automation LPDG
APIForce Zurich 5 April Automation LPDG
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
Vulnerability_Management_GRC_by Sohang Sengupta.pptx
Vulnerability_Management_GRC_by Sohang Sengupta.pptxVulnerability_Management_GRC_by Sohang Sengupta.pptx
Vulnerability_Management_GRC_by Sohang Sengupta.pptx
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Artificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraArtificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning era
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
The transition to renewables in India.pdf
The transition to renewables in India.pdfThe transition to renewables in India.pdf
The transition to renewables in India.pdf
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 

Simplify writing code with deliberate commits