Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

Branch in Time

Branch in Time

Full talk: https://tekin.co.uk/2019/02/a-talk-about-revision-histories

In one timeline a quick path to clarity. In the other a painful journey trying to uncover the obscure intent of a line of code. The only difference between these two realities? The revision history…

This is a story about revision histories and their impact on software maintainability. Think Sliding Doors, but with more Git!

Tekin Suleyman

November 15, 2018
Tweet

More Decks by Tekin Suleyman

Other Decks in Programming

Transcript

  1. class PatientsController < ApplicationController before_action :load_doctor def index @patients =

    sorted_patients end def show @patient = @doctor.patients.find(params[:id]) end private def sorted_patients @doctor.patients.sort { |patient| patient.name } end def load_doctor @doctor = doctor_from_current_session
  2. class PatientsController < ApplicationController before_action :load_doctor def index @patients =

    sorted_patients end def show @patient = @doctor.patients.find(params[:id]) end private def sorted_patients @doctor.patients.sort { |patient| patient.name } end def load_doctor @doctor = doctor_from_current_session
  3. class PatientsController < ApplicationController before_action :load_doctor def index @patients =

    sorted_patients end def show @patient = @doctor.patients.find(params[:id]) end private def sorted_patients @doctor.patients.order(:name) end def load_doctor @doctor = doctor_from_current_session
  4. class PatientsController < ApplicationController before_action :load_doctor def index @patients =

    sorted_patients end def show @patient = @doctor.patients.find(params[:id]) end private def sorted_patients @doctor.patients.order(:name) end def load_doctor @doctor = doctor_from_current_session $ rake Run options: --seed 45260 # Running: .................................................................... .................................................................... .................................................................... .................................... Finished in 123.299088s, 23.8629 runs/s, 34.6397 assertions/s. 3311 runs, 45124 assertions, 0 failures, 0 errors, 0 skips
  5. class Patient < ApplicationRecord has_many :appointments validates_presence_of :name, :address, :date_of_birth

    end class Doctor < ApplicationRecord has_many :appointments has_many :patients, through: :appointments belongs_to :practice validates_presence_of :name, :practice end
  6. 3fc122c2 (Richard E 2010-06-28 17:02:54 +0100 1) # Controller for

    listing a doctor's pa 3fc122c2 (Richard E 2010-06-28 17:02:54 +0100 2) class PatientsController < Application 3fc122c2 (Richard E 2010-06-28 17:02:54 +0100 3) before_filter :load_doctor 3fc122c2 (Richard E 2010-06-28 17:02:54 +0100 4) 3fc122c2 (Richard E 2010-06-28 17:02:54 +0100 5) def index 6047246d (Josie P 2010-10-29 09:32:25 +0100 6) @patients = sorted_patients 3fc122c2 (Richard E 2010-06-28 17:02:54 +0100 7) end 3fc122c2 (Richard E 2010-06-28 17:02:54 +0100 8) 9598514f (Josie P 2010-06-28 17:03:21 +0100 9) def show 9598514f (Josie P 2010-06-28 17:03:21 +0100 10) @patient = @doctor.patients.find(p 9598514f (Josie P 2010-06-28 17:03:21 +0100 11) end 9598514f (Richard E 2010-06-28 17:03:21 +0100 12) 3fc122c2 (Richard E 2010-06-28 17:02:54 +0100 13) private dbdd0fb9 (Josie P 2010-10-29 09:31:52 +0100 18) 6047246d (Josie P 2010-10-29 09:32:25 +0100 19) def sorted_patients dbdd0fb9 (Josie P 2010-10-29 09:31:52 +0100 20) @doctor.patients.sort {|patient| p dbdd0f69 (Josie P 2010-10-29 09:31:52 +0100 21) end 3fc122c2 (Richard E 2010-06-28 17:02:54 +0100 14) $ git blame app/controllers/patients_controller.rb Git Fu: git blame
  7. $ git log dbdd0fb9 --patch commit dbdd0fb9e870b91e6925903553f07df3becc9414 Author: Josie Pickford<[email protected]>

    Date: Fri Oct 29 09:31:52 2010 +0100 PR Feedback: Fixed a typo diff --git a/app/controllers/patients_controller.rb b/app/controllers/patients_controller index d7c6df5..1e3debb 100644 --- a/app/controllers/patients_controller.rb +++ b/app/controllers/patients_controller.rb @@ -13,7 +13,7 @@ class PatientsController < ApplicationController private def sorted_patients - @doctor.patients.sort {|pateint| pateint.name } + @doctor.patients.sort {|patient| patient.name } end Git Fu: git blame
  8. Git Fu: git log -S (AKA The Pickaxe) $ git

    log -S "sorted_patients" --patch --reverse
  9. Git Fu: git log -S (AKA The Pickaxe) $ git

    log -S "sorted_patients" --patch --reverse commit 23b6e0c6a9a7a392c312d4f0c51153e0769ebffc Author: Josie Pickford<[email protected]> Date: Thurs Oct 28 17:55:32 2010 +0100 Rename method diff --git a/app/controllers/patients_controller.rb b/app/controllers/ patients_controller.rb index 51fbd8a..d7c6df5 100644 --- a/app/controllers/patients_controller.rb +++ b/app/controllers/patients_controller.rb @@ -3,7 +3,7 @@ class PatientsController < ApplicationController before_filter :load_doctor def index - @patients = load_patients + @patients = sorted_patients end
  10. Git Fu 1. git blame 2. git log -S (AKA

    The Pickaxe) 3. Pickaxe Round 2
  11. Git Fu: Pickaxe Round 2 $ git log -S "load_patients"

    --patch --reverse commit 66f95816017b1c6582034d074333fa18884ad3c3 Author: Josie Pickford<[email protected]> Date: Thurs Oct 28 17:00:43 2010 +0100 Fix patient ordering bug diff --git a/app/controllers/patients_controller.rb b/app/controllers/patients_controller index cb0e69c..51fbd8a 100644 --- a/app/controllers/patients_controller.rb +++ b/app/controllers/patients_controller.rb @@ -3,7 +3,7 @@ class PatientsController < ApplicationController before_filter :load_doctor def index - @patients = @doctor.patients.order(:name) + @patients = load_patients end
  12. Git Fu 1. git blame 2. git log -S (AKA

    The Pickaxe) 3. Pickaxe Round 2 4. Find the Pull Request
  13. class PatientsController < ApplicationController before_filter :load_doctor def index @patients =

    @doctor.patients.order(:name) end def show @patient = @doctor.patients.find(params[:id]) end private def load_doctor @doctor = doctor_from_current_session end end
  14. class PatientsController < ApplicationController before_filter :load_doctor def index @patients =

    @doctor.patients.order(:name) end def show @patient = @doctor.patients.find(params[:id]) end private def load_doctor @doctor = doctor_from_current_session end end
  15. class Doctor < ApplicationRecord has_many :appointments, order: :appointment_date has_many :patients,

    through: :appointments belongs_to :practice validates_presence_of :name, :practice end
  16. class Doctor < ApplicationRecord has_many :appointments, order: :appointment_date has_many :patients,

    through: :appointments belongs_to :practice validates_presence_of :name, :practice end
  17. class Doctor < ApplicationRecord has_many :appointments, order: :appointment_date has_many :patients,

    through: :appointments belongs_to :practice validates_presence_of :name, :practice end doctor.patients.order(:name) Patients Load (1.0ms) SELECT "patients".* FROM "patients" INNER JOIN "appointments" ON "patients"."id" = "appointments"."patient_id" WHERE “appointments"."doctor_id" = $1 ORDER BY “appointments"."appointment_date" ASC, "patients"."name" ASC irb(main):003:0>
  18. class Doctor < ApplicationRecord has_many :appointments has_many :patients, through: :appointments

    belongs_to :practice validates_presence_of :name, :practice end , order: :appointment_date
  19. class Doctor < ApplicationRecord has_many :appointments has_many :patients, through: :appointments

    belongs_to :practice validates_presence_of :name, :practice end $ rake Run options: --seed 45260 # Running: .....F..........FFFF.........F..........FF..............FFFFFFFFF... ..............FFFFFFFFFFFFFFFFFF............................FFFF Finished in 1.273019s, 24.3516 runs/s, 35.3490 assertions/s.
  20. class PatientsController < ApplicationController before_filter :load_doctor def index @patients =

    @doctor.patients.order(:name) end def show @patient = @doctor.patients.find(params[:id]) end private def load_doctor @doctor = doctor_from_current_session end end
  21. class PatientsController < ApplicationController before_filter :load_doctor def index @patients =

    end def show @patient = @doctor.patients.find(params[:id]) end private def load_patients @doctor.patients.sort { |pateint| pateint.name } end def load_doctor @doctor = doctor_from_current_session load_patients
  22. Fix the build git add test/integration $ $ [fix-patient-order-bug ee74d2f]

    Fix patient ordering bug Date: Fri Oct 29 09:36:08 2010 +0100 3 files changed, 44 insertions(+), 3 deletion(-) $ git commit --amend --no-edit
  23. Fix the build git push --force-with-lease git add test/integration $

    $ [fix-patient-order-bug ee74d2f] Fix patient ordering bug Date: Fri Oct 29 09:36:08 2010 +0100 3 files changed, 44 insertions(+), 3 deletion(-) $ git commit --amend --no-edit
  24. class PatientsController < ApplicationController before_action :load_doctor def index @patients =

    sorted_patients end def show @patient = @doctor.patients.find(params[:id]) end private def sorted_patients @doctor.patients.sort { |patient| patient.name } end def load_doctor @doctor = doctor_from_current_session
  25. 3fc122c2 (Richard E 2010-06-28 17:02:54 +0100 1) # Controller for

    listing a doctor's pa 3fc122c2 (Richard E 2010-06-28 17:02:54 +0100 2) class PatientsController < Application 3fc122c2 (Richard E 2010-06-28 17:02:54 +0100 3) before_filter :load_doctor 3fc122c2 (Richard E 2010-06-28 17:02:54 +0100 4) 3fc122c2 (Richard E 2010-06-28 17:02:54 +0100 5) def index 6047246d (Josie P 2010-10-29 09:32:25 +0100 6) @patients = sorted_patients 3fc122c2 (Richard E 2010-06-28 17:02:54 +0100 7) end 3fc122c2 (Richard E 2010-06-28 17:02:54 +0100 8) 9598514f (Josie P 2010-06-28 17:03:21 +0100 9) def show 9598514f (Josie P 2010-06-28 17:03:21 +0100 10) @patient = @doctor.patients.find(p 9598514f (Josie P 2010-06-28 17:03:21 +0100 11) end 9598514f (Richard E 2010-06-28 17:03:21 +0100 12) 3fc122c2 (Richard E 2010-06-28 17:02:54 +0100 13) private dbdd0fb9 (Josie P 2010-10-29 09:31:52 +0100 18) 6047246d (Josie P 2010-10-29 09:32:25 +0100 19) def sorted_patients 33ec144e (Josie P 2010-10-29 09:31:52 +0100 20) @doctor.patients.sort {|patient| p dbdd0f69 (Josie P 2010-10-29 09:31:52 +0100 21) end 3fc122c2 (Richard E 2010-06-28 17:02:54 +0100 14) $ git blame app/controllers/patients_controller.rb Git Fu: git blame
  26. $ git log 33ec144e --patch commit 33ec144e70b91e6925903553f07df3becc9414 Author: Josie Pickford<[email protected]>

    Date: Friday Oct 29 09:44:49 2010 +0100 Fix patient ordering bug The patients association is returning patients in appointment date order, even when called with an explicit `order(:name)` scope. This is because the patients association is a has_many :through the appointments association, which has a default order by appointment_date. This causes any queries on the association to always sort first by appointment date: ORDER BY “appointments"."appointment_date" ASC, "patients"."name" ASC) Removing the default ordering from the appointments association is going to take a bit of unpicking. To get the bug resolved in the meantime we can re-sort the patient records after they've been loaded. Separate work has been planned to remove the default ordering altogether. Git Fu: git blame
  27. class Doctor < ApplicationRecord has_many :appointments has_many :patients, through: :appointments

    belongs_to :practice validates_presence_of :name, :practice end
  28. Git Fu 1. Configure an environment for good commit messages

    2. Capture the why, not the what 3. Shape each commit
  29. Shape each commit • Create small atomic commits • Shape

    as you go, not at the end • $ git add --patch / -p
  30. Git Fu 1. Configure an environment for good commit messages

    2. Capture the why, not the what 4. Treat (local) commits as mutable 3. Shape each commit
  31. Treat (local) commits as mutable • $ git commit --amend

    • $ git rebase --interactive • $ git rebase --abort • --fixup / --autosquash
  32. Git Fu 1. Configure an environment for good commit messages

    2. Capture the why, not the what 5. Build your instincts; search your histories 4. Treat (local) commits as mutable 3. Shape each commit
  33. Build your instincts; search your histories • $ git blame

    file.rb • $ git log -S "some_code" • $ git annotate file.rb
  34. Git Fu 1. Configure an environment for good commit messages

    2. Capture the why, not the what 5. Treat (local) commits as mutable 4. Build your instincts; search your histories 3. Shape each commit
  35. Seema Memoji Josie Memoji Created by Inspiration for the story-based

    approach Talk Feedback and Advice Slide Advisor Git Fu Indent Hospital Icon Winding Road Photo Sound Effects TEKIN SULEYMAN TEKIN SULEYMAN TEKIN SULEYMAN NADIA ODUNAYO ANDY CROLL ANGELA TODD GRAHAM ASHTON MURRAY STEELE NADIA ODUNAYO KATRINA OWEN BRUCE LEE, ENTER THE DRAGON (1972) FLATICON.COM JESSE BOWSER ON UNSPLASH LEGEND OF ZELDA, A LINK TO THE PAST Cast