-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathslides.qmd
684 lines (541 loc) · 16.3 KB
/
slides.qmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
---
title: "The 'I' in Team"
subtitle: "Peer-to-peer best practices for growing data science teams"
author:
- name: Liz Roten
orcid: 0000-0002-5346-3549
email: [email protected]
affiliations:
- name: Metropolitan Council
address: 390 Robert St. N.
city: Saint Paul
state: MN
postal-code: 55101
date: "September 19, 2023"
date-format: long
self-contained: true
embed-resources: true
link-external-newwindow: false
link-external-icon: true
link-external-filter: "github.com|lizroten.com"
format:
revealjs:
header: "posit::conf(2023)"
progress: false
section-divs: true
slide-level: 2
footer: '<a href="https://lizroten.com/team" target="_blank">lizroten.com/team</a>'
include-after-body: partials/clean_title_page.html
hide-from-titleSlide: "all"
menu: true
template: partials/template.html
theme:
- theme.scss
- partials/title-slide.scss
incremental: true
standalone: true
mouse-wheel: true
template-partials:
- partials/title-slide.html
- partials/toc-slide.html
filters:
- reveal-header
include-in-header:
- text: |
<link rel = "shortcut icon" href = "https://em-content.zobj.net/source/google/350/busts-in-silhouette_1f465.png" />
---
```{r setup, include=FALSE}
# window palette
harem <- list(
prussian_blue = "#0B273C",
cadet_gray = "#989F9C",
carribbean_current = "#01606E",
pale_dogwood = "#E3C0B6",
cadet_gray2 = "#A1B4B9",
bistre = "#2E180F",
chinese_violet = "#856084",
gold = "#A68247"
)
window_pal <- list(
dark_blue = "#162059",
med_blue = "#383E45",
light_blue = "#727A8C",
yellow = "#F2D091",
tan = "#D9CBBF",
red = "#592816",
dark_red = "#33190F"
)
library(ggplot2)
library(magrittr)
library(dplyr)
library(tibble)
library(councilR)
library(png)
library(jpeg)
source("R/fish.R")
section1_color <- "#A1B4B9"
section2_color <- "#E3C0B6"
section3_color <- "#CEB7CD"
showtext::showtext_auto()
sysfonts::font_paths()
files <- sysfonts::font_files()
sysfonts::font_add("HelveticaNeueLT Std Cn", "HelveticaNeueLTStd-Cn.otf")
sysfonts::font_add("HelveticaNeueLT Std Lt", "HelveticaNeueLTStd-Lt.otf")
sysfonts::font_add("HelveticaNeueLT Std Thin", "HelveticaNeueLTStd-Th.otf")
sysfonts::font_add("Arial Narrow", "Arial Narrow.ttf")
sysfonts::font_add("HelveticaNeueLT Std Med Cn", "HelveticaNeueLTStd-MdCn.otf")
sysfonts::font_add("Palatino Linotype", "pala.ttf")
sysfonts::font_add("Lato", "Lato-Regular.ttf")
```
## In the beginning... {background-image="img/barbie.png"}
. . .
We started off with a tiny data science team.
<!-- need *time*, place, and characters -->
. . .
And by tiny, I mean 2 people.
<!-- Over time, our team grew. -->
<!-- More data scientists + R users -->
<!-- but... -->
<!-- we were all **_very_** used to working alone. -->
<!-- this became clear with one particular incident -->
# The Incident {background-image="img/barbie_incident.jpeg"}
## ...how bad was the incident?
::: {.fragment .strike}
In the beginning, I wrote an R package for my org.
:::
## ...how bad was the incident?
In the beginning, I wrote an R package for __myself__.
<!-- It has all sorts of practical things, like color codes, ggplot2 themes, and database helpers. -->
::: {.fragment .no-fade}
<a href="https://github.com/Metropolitan-Council/councilR" target="_blank"><img src="img/logo2.png" data-lazy-loaded="" style="float: right; width: 35%"></a>
:::
<!-- Of my own accord, I decided that we should use a more flexible font sizing scheme for our ggplot2 theme. -->
<!-- I was so excited to push this change out and magically make everything better. -->
<!-- I made the changes, released the new version, and encouraged my colleagues to install it. -->
. . .
<br>
My colleague installed the update
. . .
<br>
... while they were writing a time sensitive report.
<!-- It has all sorts of practical things, like color codes, ggplot2 themes, and database helpers. -->
<!-- Of my own accord, I decided that we should use a more flexible font sizing scheme for our ggplot2 theme. -->
<!-- I was so excited to push this change out and magically make everything better. -->
<!-- I made the changes, released the new version, and encouraged my colleagues to install it. -->
## {}
```{r plot-code-1}
#| echo: true
#| eval: false
my_plot +
theme_council()
```
```{r plot-good}
#| fig-cap-location: top
#| out-width: "100%"
color_range_blue <- colorRampPalette(c("#e0e3e8", colors$playDaBlue))
ggplot(datasets::airquality) +
aes(Solar.R, Wind,
color = as.factor(Month)
) +
geom_point(size = 9) +
scale_color_manual(values = color_range_blue(5)) +
labs(
title = "A very important plot",
color = "Month",
x = "Solar",
y = "Wind",
caption = stringr::str_wrap(shinipsum::random_text(nwords = 20))
) +
theme_council(
use_showtext = TRUE,
base_size = 30
) +
theme(
plot.caption = element_text(size = 10),
plot.caption.position = "plot"
)
```
## {}
```{r plot-code-2}
#| echo: true
#| eval: false
my_plot +
theme_council()
```
```{r plot-bad}
#| fig-cap-location: top
#| out-width: "100%"
multiplier <- 1.5
ggplot(datasets::airquality) +
aes(Solar.R, Wind,
color = as.factor(Month)
) +
geom_point(size = 9) +
scale_color_manual(values = color_range_blue(5)) +
labs(
title = "A very important plot",
color = "Month",
x = "Solar",
y = "Wind",
caption = stringr::str_wrap(shinipsum::random_text(nwords = 20))
) +
theme_council(
use_showtext = TRUE,
use_manual_font_sizes = TRUE,
font_sizes = list(
"title" = 20 * multiplier,
"subtitle" = 16 * multiplier,
"axis_title" = 16 * multiplier,
"axis_text" = 3 * multiplier,
"legend_title" = 5 * multiplier,
"legend_text" = 14 * multiplier,
"caption" = 16 * multiplier,
"strip" = 14 * multiplier
)
) +
theme(
axis.title.y = element_text(angle = 90),
plot.title = element_text(family = "HelveticaNeueLT Std Med Cn"),
plot.caption = element_text(
family = "Palatino Linotype"
)
)
```
## What went wrong?
- Inaccurate and inadequate documentation
- Lack of communication
- Mismatched priorities
## Could my manager have prevented this?
. . .
No
<!-- I don't think this story is particularly unique -->
<!-- we all make mistakes that break other peoples' code -->
<!-- and we are the ones that have to clean up after ourselves -->
## There is an "I" in "Team"
<!-- several I's in fact -->
. . .
Team: a group of **individuals** working together
<!-- this talk is not about being a manager or how to manage a data science team, -->
. . .
You can __shape__ your team by
- caring for your new team members
- seeing how you fit into your team, and
- changing how you work.
<!-- but how to be a good colleague when someone new comes in -->
<!-- it isn't always obvious how you should shift your mindset when your team expands -->
<!-- Work is work, and what makes it enjoyable, more than the subject matter, is the *people* you get work with and the team you create. -->
<!-- Your manager will accomplish lots of important things for bringing in a new person - but you are the person they get to work with day-to-day! -->
## When you have a new colleague
Its your responsibility to bring them on board, too!
## Peer onboarding
1. Make the implicit explicit
1. All knowledge is valid and valuable
1. Document (aka, make life easier for your friends)
# Make the implicit explicit {background-color=`r section1_color`}
```{r fish-setup}
fish_base <- ggplot() +
scale_y_continuous(limits = c(0, 1.5)) +
scale_x_continuous(limits = c(0, 1)) +
coord_cartesian(clip = "off") +
theme_void() +
theme(
legend.position = "none",
plot.background = element_rect(
fill = "#A1B4B9",
colour = NA
)
)
new_fish <- geom_fish(
mapping = aes(
x = 0.15,
y = 0.55,
fish = "goldfish2"
),
size = 3
)
fish_positions <- tibble::tibble(
position = 2,
x = c(0.9, 0.75),
y = c(0.75, 0.35)
) %>%
bind_rows(
tibble::tibble(
position = 1,
x = c(0.6, 0.4),
y = c(0.85, 0.45)
)
)
```
## {background-color=`r section1_color`}
```{r fish-team, echo = FALSE}
fish_base +
geom_fish(
data = fish_positions %>%
filter(position == 1),
aes(
x = x,
y = y,
fish = "goldfish"
),
size = 4
)
```
## {auto-animate=true background-color=`r section1_color`}
<!-- Workplace culture is something you don't think about, because you're in it! -->
```{r new-fish}
#| fig-column: screen
#| fig-width: 10
#| out-width: "100%"
fish_base +
geom_fish(
data = fish_positions %>%
filter(position == 2),
mapping = aes(
x = x,
y = y,
fish = "goldfish"
),
size = 4
) +
new_fish
```
## {background-color=`r section1_color`}
```{r fish-how-is-water}
#| fig-column: screen
#| fig-width: 10
#| out-width: "100%"
fish_base +
geom_fish(
data = fish_positions %>%
filter(position == 2),
mapping = aes(
x = x,
y = y,
fish = "goldfish"
),
size = 4
) +
new_fish +
geom_fish(
mapping = aes(
x = 0.5,
y = 1.01,
fish = "speech_bubble"
),
size = 3
) +
geom_text(
aes(
x = 0.5,
y = 1.1,
label = "How's the water?"
),
size = 8,
family = "Lato"
)
```
## {background-color=`r section1_color`}
```{r fish-blank}
fish_base +
geom_fish(
mapping = aes(
x = 0.6,
y = 1.01,
fish = "speech_bubble2"
),
size = 3
) +
geom_text(
aes(
x = 0.6,
y = 1.1,
label = "..."
),
size = 8,
family = "Lato"
) +
new_fish +
geom_fish(
data = fish_positions %>%
filter(position == 2),
mapping = aes(
x = x,
y = y,
fish = "goldfish"
),
size = 4
)
```
## {background-color=`r section1_color`}
```{r fish-what-is-water}
fish_base +
geom_fish(
mapping = aes(
x = 0.6,
y = 1.01,
fish = "speech_bubble2"
),
size = 3
) +
geom_text(
aes(
x = 0.6,
y = 1.1,
label = "What the hell\nis water?"
),
size = 8,
family = "Lato"
) +
new_fish +
geom_fish(
data = fish_positions %>%
filter(position == 2),
mapping = aes(
x = x,
y = y,
fish = "goldfish"
),
size = 4
)
```
## {background-color=`r section1_color`}
<!-- you could deny that there is water, -->
<!-- or say that your water is laid back and chill and like all other waters -->
```{r fish-close}
fish_base +
geom_fish(
mapping = aes(
x = 0.5,
y = 0.5,
fish = "goldfish"
),
size = 4
)
```
## {background-color=`r section1_color`}
<!-- or you could sink into an existential crisis -->
```{r fish-closer}
fish_base +
geom_fish(
mapping = aes(
x = 0.5,
y = 0.5,
fish = "goldfish"
),
size = 8
)
```
## {background-color=`r section1_color`}
```{r anxious-fish, warning=FALSE}
fish_base +
geom_fish(
mapping = aes(
x = 1.5,
y = 0.8,
fish = "goldfish"
),
size = 20
) +
scale_x_continuous(limits = c(0, 1.5))
```
## Don't deny that water exists {background-color=`r section1_color`}
<!-- so, before you turn into an anxious goldfish... -->
- Everyone has their pet peeves and preferences.
<!-- maybe you have a super strict file organization scheme -->
<!-- or you are morally opposed using any tidyverse -->
- Every team has a culture.
- Don't give your new coworker the task of defining water in addition to evaluating if the water is right for them.
## Define your water {background-color=`r section1_color`}
- What does your weekly schedule look like?
- What tools do you use daily? Why?
- What expectations does your work group have around email/message response times?
<!-- - Everyone thinks that they don't have culture, but really, its what we are all surrounded with constantly. -->
<!-- - Start by making a list of the tools you use on a daily basis, no matter how big or small -->
<!-- go through how you use them, and to what extent -->
<!-- how do they make your life easier? -->
<!-- What are the gaps in your toolchain? -->
<!-- - I recommend using a Git GUI (like GitKraken) -->
<!-- - A git GUI is a great way to visualize branches and track progress over time. -->
# All knowledge is valid and valuable {background-color=`r section2_color`}
## No one is an empty vessel {background-color=`r section2_color`}
<!-- they have certain skill your team may have been lacking -->
All the knowledge the new person brings is valuable.
- No matter where they are coming from
- Even if it seems unrelated
::: {.fragment .fade-up}
Your knowledge it is not inherently superior.
:::
<!-- There is a lot of work that your manager will take care of... -->
## Give your new colleague grace {background-color=`r section2_color`}
- Patience will prove best.
- You are on probation, too!
<!-- your manager will do a lot of the legwork to get this person onboard, -->
<!-- like setting up timesheets and going through workplace policies -->
<!-- but you are still the person they will be actually working with -->
<!-- you will have to bring this person up to speed, and that is part of it -->
- Don't rely on catch-all assumptions: ask for specifics.
<!-- someone with command line git experience versus a GUI will have different needs -->
# Document {background-color=`r section3_color`}
(aka, make life easier for your friends)
## {background-color=`r section3_color` style="text-align:center;"}
::: {.r-stack}
::: {.fragment .fade-out fragment-index=1}
Which comes first?
:::: {.columns}
::: {.column width="50%"}
![](img/cereal.png)
:::
::: {.column width="50%"}
![](img/milk.png)
:::
::::
:::
::: {.fragment .fade-up fragment-index=1}
The bowl!
![](img/bowl.png)
:::
:::
## Documentation is the bowl {background-color=`r section3_color`}
Data science is a creative field: there are many ways to solve a problem .
. . .
Embrace the diversity of opinion and experience.
. . .
Just remember to leave a trail for others to follow.
## A matter of investment {background-color=`r section3_color`}
- **Invest** in tools that encourage documentation and lower cognitive load.
- **Invest** in the time it takes to document/clean up/organize your work.
- **Invest** in strong social relationships.
## Documentation == Communication {background-color=`r section3_color`}
Good communication requires knowing your audience!
![](img/conf23-hero2-static.png)
## Work doesn't always feel like work {background-color=`r section3_color`}
<!-- I'll take a wild guess and say that most of you didn't go into a quantitative field because you are naturally effervescent -->
<!-- do things that don't feel like work -->
- Schedule time to build connections and trust.
<!-- try making every other team meeting a casual hang out -->
- Social gatherings (virtual or in person!) are just as valuable as focus time.
- Try making every other team meeting a casual hang out.
<!-- virtual social gatherings -->
# Ultimately...
## There is an "I" in "Team"
- Teams are made up of individuals, and its not only the manager's job to make it work.
- Onboarding is a unique and critical time.
- I've grown immensely from working with my colleagues.
<!-- and only a small portion of that is because of my manager -->
<!-- Investing in your team not just as a manger, but as a coworker -->
<!-- and we had to acknowledge that there are individuals in our team -->
# Thank you
<a href="https://lizroten.com/team" target="_blank">lizroten.com/team</a>
# References {.smaller}
::: {.nonincremental}
- Barbie Image copyright (©) Warner Bros. Pictures or related entities. Used for publicity and promotional purposes.
- David Foster Wallace 2005 Kenyon College [commencement speech](https://fs.blog/david-foster-wallace-this-is-water/)
- [Fish 1](https://pngimg.com/image/67588)
- [Fish 2](https://www.pngfind.com/mpng/ihTbmxR_goldfish-png-free-images-gold-fish-transparent-png/)
- Cereal or milk?
- The Suite Life of Zack and Cody Quotes. (n.d.). Quotes.net. Retrieved September 12, 2023, from https://www.quotes.net/mquote/928559.
- [Cereal](https://www.pngwing.com/en/free-png-xzukp)
- [Milk](https://www.deviantart.com/vacagalo/art/milk-drop-png-milk-splash-transparent-background-P-869641339)
- [Bowl](https://www.pngwing.com/en/free-png-izipa)
- posit::conf(2023) art © Posit, PBC. 2023
:::