Fix Sprint numbering for 2023

My PM delayed the start of our "first" sprint of the year, and this
wreaked havoc with my algorithm. Granted, I often need to tweak it
each year.
This commit is contained in:
Howard Abrams 2023-02-01 08:19:20 -08:00
parent 60a960b4fe
commit dcdd481713
2 changed files with 80 additions and 27 deletions

View file

@ -45,12 +45,13 @@ At the beginning of the year, I choose a theme, and make a list for the upcoming
#+begin_src emacs-lisp :noweb yes #+begin_src emacs-lisp :noweb yes
(defvar sprint-nicknames (defvar sprint-nicknames
(--map (replace-regexp-in-string " *[:#].*" "" (first it)) (--map (replace-regexp-in-string " *[:#].*" "" (first it))
'<<sprint-names-2022()>>) '<<sprint-names-2023()>>)
"List of 26 Sprint Nicknames from A to Z.") "List of 26 Sprint Nicknames from A to Z.")
#+end_src #+end_src
** 2023 ** 2023
How about a list of Ent names? How about a list of Ent names?
#+NAME: sprint-names-2023
- ashskin - ashskin
- birchblossom - birchblossom
- cedar king - cedar king
@ -203,7 +204,7 @@ Came up with a list of somewhat well-known cities throughout the world (at least
- zippy-zinder - zippy-zinder
* Sprint Boundaries * Sprint Boundaries
Function to help in calculating dates and other features of a two-week sprint that starts on Thursday and ends on a Wednesday… how we work at my job. Function to help in calculating dates and other features of a two-week sprint that starts on Tuesday and ends on a Monday… how we work at my job.
Emacs have an internal rep of a time. Emacs have an internal rep of a time.
#+begin_src emacs-lisp #+begin_src emacs-lisp
@ -221,7 +222,7 @@ Emacs have an internal rep of a time.
** Sprint Numbering ** Sprint Numbering
My Sprint starts on Thursday, but this sometimes changed, so let's make this a variable: My Sprint starts on Tuesday, but this sometimes changed, so let's make this a variable:
#+begin_src emacs-lisp #+begin_src emacs-lisp
(defvar sprint-starting-day 2 "The day of the week the sprint begins, where 0 is Sunday.") (defvar sprint-starting-day 2 "The day of the week the sprint begins, where 0 is Sunday.")
#+end_src #+end_src
@ -230,10 +231,10 @@ We label our sprint based on the week number that it starts. Note that on a Mond
#+begin_src emacs-lisp #+begin_src emacs-lisp
(defun sprint-week-num (&optional date) (defun sprint-week-num (&optional date)
"Return the week of the current year (or DATE), but starting "Return the week of the current year (or DATE), but starting
the week at Thursday to Wednesday." the week at Tuesday to Monday."
(let* ((d (get-date-time date)) (let* ((d (get-date-time date))
(dow (nth 6 (decode-time d))) ; Day of the week 0=Sunday (dow (nth 6 (decode-time d))) ; Day of the week 0=Sunday
(week (->> d ; Week number in the year (week (thread-last d ; Week number in the year
(format-time-string "%U") (format-time-string "%U")
string-to-number))) string-to-number)))
(if (>= dow sprint-starting-day) (if (>= dow sprint-starting-day)
@ -241,36 +242,39 @@ We label our sprint based on the week number that it starts. Note that on a Mond
week))) week)))
#+end_src #+end_src
Let's have these tests to make sure, and yeah, perhaps we update this at the beginning of each year. Let's have these tests to make of this /weekly/ perspective:
#+begin_src emacs-lisp :tangle no #+begin_src emacs-lisp :tangle no
(ert-deftest sprint-week-num-test () (ert-deftest sprint-week-num-test ()
(should (= (sprint-week-num "2023-01-09") 2)) ; Monday previous week (should (= (sprint-week-num "2023-01-01") 1)) ; Monday previous week
(should (= (sprint-week-num "2023-01-10") 3)) ; Tuesday current week (should (= (sprint-week-num "2023-01-03") 2)) ; Tuesday ... this week
(should (= (sprint-week-num "2023-01-17") 4))) ; Tuesday next week (should (= (sprint-week-num "2023-01-09") 2)) ; Monday, next week, part of last
(should (= (sprint-week-num "2023-01-10") 3))) ; Tuesday next week
#+end_src #+end_src
My company has sprints two weeks long, we could be see that on even week numbers, the /sprint/ is actually the previous week's number. My company has sprints two weeks long, we could be see that on even week numbers, the /sprint/ is actually the previous week's number.
And it appears that my PM for this year, is a differently off by a week number. And it appears that my PM for this year didnt start our first Sprint until the 17th.
#+begin_src emacs-lisp #+begin_src emacs-lisp
(defun sprint-number (&optional date) (defun sprint-number (&optional date)
"Return the current sprint number, with some assumptions that "Return the current sprint number, with some assumptions that
each sprint is two weeks long, starting on Tuesday." each sprint is two weeks long, starting on Tuesday."
(let ((num (sprint-week-num date))) (let ((num (sprint-week-num date)))
(if (cl-oddp num) (if (cl-oddp num)
(1- num) (- num 4) ; CHANGEME each year!
(- num 2)))) (- num 3))))
#+end_src #+end_src
And some tests to verify that: And some tests to verify that:
#+begin_src emacs-lisp :tangle no #+begin_src emacs-lisp :tangle no
(ert-deftest sprint-number-test () (ert-deftest sprint-number-test ()
(should (= (sprint-number "2023-01-09") 0)) (should (= (sprint-number "2023-01-09") -1)) ;; Ignore
(should (= (sprint-number "2023-01-10") 2)) (should (= (sprint-number "2023-01-10") -1))
(should (= (sprint-number "2023-01-17") 2)) (should (= (sprint-number "2023-01-17") 1))
(should (= (sprint-number "2023-01-18") 2)) (should (= (sprint-number "2023-01-18") 1))
(should (= (sprint-number "2023-01-23") 2)) (should (= (sprint-number "2023-01-23") 1))
(should (= (sprint-number "2023-01-24") 4))) (should (= (sprint-number "2023-01-24") 1))
(should (= (sprint-number "2023-01-30") 1))
(should (= (sprint-number "2023-01-31") 3)))
#+end_src #+end_src
** Sprint File Name ** Sprint File Name
I create my org-file notes based on the Sprint number. I create my org-file notes based on the Sprint number.
@ -332,7 +336,7 @@ These test won't pass any more, as the nickname of the sprint changes from year
** Sprint Start and End ** Sprint Start and End
I want to print the beginning and ending of the sprint, where we have a sprint number or a data, and we can give the dates that bound the sprint. This odd function calculates this based on knowing the date of the /first thursday/ of the year, so I need to begin the year changing this value. I should fix this. I want to print the beginning and ending of the sprint, where we have a sprint number or a data, and we can give the dates that bound the sprint. This odd function calculates this based on knowing the date of the /first Tuesday/ of the year, so I need to begin the year changing this value. I should fix this.
#+begin_src emacs-lisp #+begin_src emacs-lisp
(defun sprint-range (&optional number-or-date) (defun sprint-range (&optional number-or-date)
@ -342,7 +346,8 @@ I want to print the beginning and ending of the sprint, where we have a sprint n
(let* ((num (if (or (null number-or-date) (stringp number-or-date)) (let* ((num (if (or (null number-or-date) (stringp number-or-date))
(sprint-number number-or-date) (sprint-number number-or-date)
number-or-date)) number-or-date))
(year-start "2020-01-02") ; First Thursday of the year ;; CHANGEME each year to mark the first day of the first sprint:
(year-start "2023-01-17")
(time-start (-> year-start ; Converted to time (time-start (-> year-start ; Converted to time
get-date-time get-date-time
float-time)) float-time))
@ -371,8 +376,8 @@ Format the start and end so that we can insert this directly in the org file:
And validate with a test: And validate with a test:
#+begin_src emacs-lisp #+begin_src emacs-lisp
(ert-deftest sprint-date-range () (ert-deftest sprint-date-range ()
(should (equal (sprint-date-range 7) (should (equal (sprint-date-range 1)
(sprint-date-range "2020-02-17")))) (sprint-date-range "2023-01-17"))))
#+end_src #+end_src
** Pre-scheduled Dates ** Pre-scheduled Dates
@ -423,11 +428,11 @@ The following functions /were/ helpful at times. But I'm not sure I will use the
#+begin_src emacs-lisp :tangle no #+begin_src emacs-lisp :tangle no
(defun sprint-day-start (&optional date) (defun sprint-day-start (&optional date)
"Return a relative number of days to the start of the current sprint. For instance, if today was Friday, and the sprint started on Thursday, this would return -1." "Return a relative number of days to the start of the current sprint. For instance, if today was Friday, and the sprint started on Tuesday, this would return -1."
(first (sprint-day-range date))) (first (sprint-day-range date)))
(defun sprint-day-end (&optional date) (defun sprint-day-end (&optional date)
"Return a relative number of days to the end of the current sprint. For instance, if today was Monday, and the sprint will end on Wednesday, this would return 3." "Return a relative number of days to the end of the current sprint. For instance, if today was Monday, and the sprint will end on Monday, this would return 3."
(second (sprint-day-range date))) (second (sprint-day-range date)))
#+end_src #+end_src

48
templates/sprint.org Normal file
View file

@ -0,0 +1,48 @@
#+TITLE: `(sprint-current-name)`
#+AUTHOR: `user-full-name`
#+EMAIL: `user-mail-address`
#+DATE: `(sprint-date-range)`
#+CATEGORY: sprint
#+FILETAGS: :work:
* Work Issues
$0
* Onboarding Work
See [[file:Onboarding-Work.org][Onboard-Work]] for all details.
* Distractions and Support
Anything that doesn't fit the above goes here.
* Meeting Notes :meeting:
* Scrum Status :status:
* Sprint Demonstration
New approach for giving presentations. First create [[file:`(file-name-sans-extension (buffer-name))`-demo.org][`(file-name-sans-extension (buffer-name))`-demo.org]], and then add the bits to the code below.
#+BEGIN_SRC emacs-lisp :results silent
(defun org-present-file (filename)
(find-file (filename))
(delete-other-windows)
(org-present))
(demo-it-create :advanced-mode :single-window
(org-present-file "`(file-name-sans-extension (buffer-name))`-demo.org")
(org-present-next)
(osx-browse-url-forwork "https://...")
(demo-it-load-fancy-file "~/work/wpc4/wpc/dashboards/wpc4/hypervisor.yml" :line 116 133)
;; ...
)
#+END_SRC
Have fun and start the show: =demo-it-start= and hit ~F5~.
* Notes for Next Sprint
#+DESCRIPTION: Notes taken during Sprint #`(sprint-number)`
#+PROPERTY: header-args: :results drawer :tangle no :eval no-export :comments org
#+OPTIONS: num:nil toc:nil todo:nil tasks:nil tags:nil skip:nil author:nil email:nil creator:nil timestamp:nil ^:nil
# Local Variables:
# eval: (org-content 2)
# End: