$30 off During Our Annual Pro Sale. View Details »

Gradle Convention Plugins

Gradle Convention Plugins

DroidKaigi 2023 Day.1 Bunblemee 11:20-12:00

Submitted description ->

Gradle Convention Plugins allow us to easily/effectively apply shared configurations across projects a.k.a modules especially for Android developers. Convention plugins have some advantages in build phases much more than shared build scripts. However, we have to implement plugins *correctly* to get the advantages because wrong implementations/configurations may bring negative impacts to Gradle's build features like configuration cache.

This presentation will explain why Gradle Convention Plugins are good to know for Android developers, and show how to build Gradle plugins from scratch and some plugin examples that collaborate with Android Gradle Plugin.

Keywords: Gradle plugin, convention plugin, build logic, precompiled script plugins

Matsuda Jumpei

September 14, 2023
Tweet

More Decks by Matsuda Jumpei

Other Decks in Programming

Transcript

  1. %SPJE,BJHJ%BZ4FQBU#VNCMFCFF
    (SBEMF$POWFOUJPO1MVHJOT
    4MJEFT
    Jumpei Matsuda
    @red_fat_daruma

    View Slide

  2. /05&%FGJOJUJPOTPG1SPKFDUBOE.PEVMF
    w 5IFTFUFSNTJOUIF(SBEMFEPNBJOBSFBNCJHVPVTJGPS"OESPJEEFWT🫣
    w 6TFQSPKFDUGPS
    w )BTTFUUJOHTHSBEMFBUSPPUBOEBTFUPG
    fi
    MFTEJSFDUPSJFTGPSZPVS
    BQQ
    w 6TFNPEVMFPSCVJMEDPNQPOFOUGPS
    w (SBEMFTQSPKFDULOPXOBTSPPU1SPKFDUBOETVCQSPKFDUTJO(SBEMF"1*
    2

    View Slide

  3. 3
    Jumpei Matsuda
    @red_fat_daruma
    Software Architect at DeployGate, Inc.
    Android App and SDK Development
    Gradle Plugin Development
    Development Productivity Engineering
    and more...
    .F
    https://deploygate.com

    View Slide

  4. 5PEBZTGPDVT
    w 'PDVTPO8):PWFS)08JOUIJTQSFTFOUBUJPO
    w 8IBUTBOEXIBUGPS(SBEMF$POWFOUJPO1MVHJO
    w 8IZTPNFUFDIOJRVFTF
    ff
    FDUJWFGPSCVJMEQFSGPSNBODF
    4

    View Slide

  5. w 'PSFYBNQMF TDSJQUQMVHJOTDBOTIBSFJU
    4IBSJOHMPHJDTCFUXFFO(SBEMFQSPKFDUT
    5

    View Slide

  6. 4IBSJOHMPHJDTCFUXFFO(SBEMFQSPKFDUT
    w 'PSFYBNQMF TDSJQUQMVHJOTDBOTIBSFJU
    w (SBEMFSFDPNNFOEUPDSFBUFDPNQJMFEQMVHJOTJOTUFBE🫣
    6

    View Slide

  7. (SBEMF$POWFOUJPO1MVHJOT

    View Slide

  8. 5IFCVJMEMPHJDDPNQPOFOUDPOUBJOTQSPKFDUUZQFT
    UIBU(SBEMFJUTFMGVOEFSTUBOETBTCVJMEDPO
    fi
    HVSBUJPO
    5IBUJT (SBEMFQMVHJOTGPSZPVSTQFDJ
    fi
    DOFFET
    XIJDIXFDBMMDPOWFOUJPOQMVHJOT
    8
    IUUQTEPDTHSBEMFPSHDVSSFOUVTFSHVJEFTUSVDUVSJOH@TPGUXBSF@QSPEVDUTIUNM

    View Slide

  9. (SBEMF$POWFOUJPO1MVHJOT
    w (SBEMF1MVHJOTXSJUUFOGPSZPVSTQFDJ
    fi
    DOFFET
    w /PUBTQFDJBMJNQMFNFOUBUJPO
    w 5IFZDBOQFSGPSNBDUJPOTUIBUSFHVMBSQMVHJOTDBOBMTPEP
    9

    View Slide

  10. 4QFDJGJDOFFET
    w 4IBSFTBNFDPO
    fi
    HVSBUJPOTJF%3:
    w 4UFQQJOHJO(SBEMFUBTLTBOEJUTHSBQIPOEFNBOE
    w "OUJDPSSVQUJPOMBZFSPGSEQBSUZQMVHJOTBOETPPO
    10

    View Slide

  11. 8IZTIPVMEXFXSJUFQMVHJOT
    🤔

    View Slide

  12. 5IFCVJMEMPHJDDPNQPOFOUDPOUBJOTQSPKFDUUZQFT
    UIBU(SBEMFJUTFMGVOEFSTUBOETBTCVJMEDPO
    fi
    HVSBUJPO
    5IBUJT (SBEMFQMVHJOTGPSZPVSTQFDJ
    fi
    DOFFET
    XIJDIXFDBMMDPOWFOUJPOQMVHJOT
    12
    IUUQTEPDTHSBEMFPSHDVSSFOUVTFSHVJEFTUSVDUVSJOH@TPGUXBSF@QSPEVDUTIUNM

    View Slide

  13. .PEVMFTXPSLBTCVJMEDPOGJHVSBUJPO
    w 3FHVMBSNPEVMFTDBOOPUDPO
    fi
    HVSFUIFCVJMEPGUIFJSQSPKFDU
    w $PNQPTJUF#VJMETDBODPO
    fi
    HVSFUIFCVJMEPGUIFQSPKFDU
    w .PEVMFTSFHJTUFSFEUP$PNQPTJUF#VJMETBSFTFQBSBUFEGSPNPUIFS
    SFHVMBSNPEVMFT
    13

    View Slide

  14. $PNQPTJUF#VJMET
    w #VJMEJOHNPEVMFTBSFCBTJDBMMZDPNQMFUFEJOUIFPSEFSPGUIFJS
    EFQFOEFODZHSBQI
    w .PEVMF'BOE%ˠ.PEVMF#BOE&ˠ.PEVMF$ˠ.PEVMF"
    14
    %FQFOEFODZ(SBQIPG(SBEMFNPEVMFT

    View Slide

  15. $PNQPTJUF#VJMET
    w 4JNJMBSUPCVJMEJOHNVMUJQMFQSPKFDUTJONPOPSFQP
    w (SFBEMFCVJMETUIFDPNQPOFOUTPG$PNQPTJUF#VJMET
    fi
    STU BOEUIFO
    CVJMEOPO$PNQPTJUF#VJMETNPEVMFT
    15
    $PNQPTJUF#VJMET OPO$PNQPTJUF#VJMETNPEVMFT

    View Slide

  16. (SBEMF$POWFOUJPO1MVHJOTBSF
    w #FTUQSBDUJDFTPGTIBSJOHMPHJDTCFUXFFONVMUJQMFNPEVMFT
    w $PO
    fi
    HVSFUIFCVJMEPGZPVSQSPKFDUPOUIFDPOWFOUJPO
    w $POWFOUJPO1MVHJOTTIPVMENFFUUIFGPMMPXJOHDPOEJUJPOT
    w 4VQQPSUQSPKFDUTQFDJ
    fi
    DOFFET
    w #VJMUXJUI$PNQPTJUF#VJMET
    w 5IFO UIFZDBOCFDPNQJMFEJOBEWBODF🎉
    16

    View Slide

  17. :FT UIFZBSFDPNQJMFEQMVHJOT

    View Slide

  18. :FT UIFZBSFDPNQJMFEQMVHJOT
    JGZPVIBWFDSFBUFEQSPQFSMZ

    View Slide

  19. 6OXBOUFE$POWFOUJPO1MVHJOT
    w )JHIGSFRVFOUBOEPSIFBWZSFDPNQJMBUJPO
    w *ODSFNFOUBMCVJMETBSFOPUTVQQPSUFE
    w 3FDPNQJMBUJPOOFFETUPSVOXJUIPVUDPEFNPEJ
    fi
    DBUJPO
    w -FTTDBDIFEEVFUPVTFPG"1*TMJLF4ZTUFNHFUFOW 4USJOH

    19

    View Slide

  20. 6OXBOUFE$POWFOUJPO1MVHJOT
    w )JHIGSFRVFOUBOEPSIFBWZSFDPNQJMBUJPO
    w *ODSFNFOUBMCVJMETBSFOPUTVQQPSUFE
    w 3FDPNQJMBUJPOOFFETUPSVOXJUIPVUDPEFNPEJ
    fi
    DBUJPO
    w -FTTDBDIFEEVFUPVTFPG"1*TMJLF4ZTUFNHFUFOW 4USJOH

    w 8*--.",&)*()&3$0454< >
    w 4MPXMPDBM$*CVJMETBMTPEBNBHFZPVSQSPEVDUJWJUZ
    20
    [1] https://github.blog/2022-12-08-experiment-the-hidden-costs-of-waiting-on-slow-build-times/

    [2] https://gradle.com/blog/quantifying-the-costs-of-builds/

    View Slide

  21. &GGFDUJWF$POWFOUJPO1MVHJOT
    w .VTUTBUJTGZUIFGPMMPXJOHT
    w #FOPUSFDPNQJMFEFYDFQUXIFONPEJGZJOHQMVHJOTDPEF
    w 3FEVDFSFDPNQJMBUJPODPTUTCZVTJOHCVJMEDBDIJOH
    w 6TFDPOTUBOUWBMVFTBUUIFDPNQJMFUJNFBTNVDIBTQPTTJCMF
    w /JDFUPIBWF
    w #FTIBSFEBDSPTTNBOZNPEVMFT
    21

    View Slide

  22. &GGFDUJWF$POWFOUJPO1MVHJOT
    w .VTUTBUJTGZUIFGPMMPXJOHT
    w #FOPUSFDPNQJMFEFYDFQUXIFONPEJGZJOHQMVHJOTDPEF
    w 3FEVDFSFDPNQMJBUJPODPTUTCZVTJOHCVJMEDBDIJOH
    w 6TFDPOTUBOUWBMVFTBUUIFDPNQJMFUJNFBTNVDIBTQPTTJCMF
    w /JDFUPIBWF
    w #FTIBSFEBDSPTTNVMUJQMF(SBEMFQSPKFDUT
    22
    4BNFQSBDUJDFTBTBOESPJEBQQEFWFMPQNFOUJUTFMG

    View Slide

  23. -FBSO(SBEMFTQFDJGJDLOPXMFEHF
    w :PVBMSFBEZIBWFFOPVHIFYQFSJFODFTBOENJOETFUGPSUIFCVJME
    QFSGPSNBODFJNQSPWFNFOUT
    w 4P JUXPVMECFPLBZJGZPVKVTUMFBSO(SBEMFTQFDJ
    fi
    DLOPXMFEHF
    w JF(SBEMFCVJMEMJGFDZDMFBOE(SBEMF"1*T
    w 4PVOETEJ
    ffi
    DVMU -FUTTFFUIF(SBEMFCVJMEMJGFDZDMF
    23

    View Slide

  24. (SBEMF#VJME-JGFDZDMF
    24

    View Slide

  25. (SBEMF#VJME-JGFDZDMF
    25

    View Slide

  26. (SBEMF#VJME-JGFDZDMF
    26
    w $PO
    fi
    HVSBUJPODBDIF

    View Slide

  27. (SBEMF#VJME-JGFDZDMF
    27
    w $PO
    fi
    HVSBUJPODBDIF
    DPO
    fi
    HVSBUJPODBDIF

    DPNQBUJCMF"1*T

    BSFQSFGFSBCMF

    View Slide

  28. 1MVHJO*NQMFNFOUBUJPOJO$PNQPTJUF#VJMET
    w $POWFOUJPOQMVHJOTTIPVME
    w CFCVJMEDBDIFGSJFOEMZ
    w QSPWJEFDPO
    fi
    HVSBUJPODBDIFDPNQBUJCMF"1*T
    w CFBQBSUPG$PNQPTJUF#VJMET
    28

    View Slide

  29. $PNQPTJUF#VJMETº1MVHJOXSJUJOH
    w )PXUPFOBCMF$PNQPTJUF#VJMET
    w 6TFQSFEF
    fi
    OFEEJSFDUPSZPSNBOVBMSFHJTUSBUJPO
    w 1MVHJOXSJUJOH
    w 1SFDPNQJMFETDSJQUQMVHJOPSTUBOEBMPOFQMVHJO
    w 1SPHSBNNJOH-BOHVBHFT
    w 1SFGFSSBCMF"1*TBOEDPEFTNFMMT
    29

    View Slide

  30. )PXXFVTF$PNQPTJUF#VJMET
    w 6TFCVJME4SDEJSFDUPSZJUTPG$PNQPTJUF#VJMETCZEFGBVMU
    w .BOVBMSFHJTUSBUJPO$BMMJODMVEF#VJME 4USJOH
    "1*JOTFUUJOHTHSBEMF
    30
    TFUUJOHTHSBEMFFOBCMFT$PNQPTJUF#VJMET

    View Slide

  31. )PXXFVTF$PNQPTJUF#VJMET
    w 6TFCVJME4SDEJSFDUPSZJUTPG$PNQPTJUF#VJMETCZEFGBVMU
    w .BOVBMSFHJTUSBUJPO$BMMJODMVEF#VJME 4USJOH
    "1*JOTFUUJOHTHSBEMF
    31
    TFUUJOHTHSBEMFFOBCMFT$PNQPTJUF#VJMET

    View Slide

  32. CVJME4SDXJUI(SBEMFBOEMPXFS
    w CVJME4SDCVJMEXBTPOIPUQBUI/PUSFDPNNFOEFE
    w (SBEMFNBZSVOCVJME4SDUFTUPO$*BHBJOBOEBHBJO😱⏳
    32
    5BTL(SBQIBDSPTTCVJME4SDBOEPUIFSNPEVMFT
    CVJME4SD 0UIFSNPEVMFT

    View Slide

  33. w 0OMZUBTLTGPSHFOFSBUJOHKBS BBSPSBOZPVUQVUTXJMMSVO
    w 4BNFBTPUIFSNPEVMFTPG$PNQPTJUF#VJMET🎉
    CVJME4SDXJUI(SBEMFBOEMBUFS
    33
    CVJME4SD
    5BTL(SBQIBDSPTTCVJME4SDBOEPUIFSNPEVMFT
    0UIFSNPEVMFT
    - https://docs.gradle.org/current/userguide/upgrading_version_7.html#gradle_no_longer_runs_the_build_task_for_buildsrc_builds

    View Slide

  34. )PXXFVTF$PNQPTJUF#VJMET
    w 6TFCVJME4SDEJSFDUPSZJUTPG$PNQPTJUF#VJMETCZEFGBVMU
    w .BOVBMSFHJTUSBUJPO$BMMJODMVEF#VJME 4USJOH
    "1*JOTFUUJOHTHSBEMF
    34
    TFUUJOHTHSBEMFFOBCMFT$PNQPTJUF#VJMET

    View Slide

  35. w :PVDBODBMMJODMVEF#VJME 4USJOH
    NVMUJQMFUJNFT
    w JF:PVDBODSFBUFNVMUJQMFQMVHJOTJONVMUJQMFQSPKFDUT
    w )PXFWFS JUNBZNBLFUIFDPO
    fi
    HVSBUJPOQIBTFMPOHFSUIBOCVJME4SD
    w "UUIFFOEPG 4RVBSFSFQPSUFEEFHSBEFEVFUPTJOHMF
    UISFBEFEEFQFOEFODZSFTPMVUJPOJO$PNQPTJUF#VJMET<>
    w /05&4RVBSFHBWFGPSDPOWFOUJPOQMVHJOT
    .VMUJQMFJODMVEF#VJMEDBMMTNBZCF
    35
    [1] https://developer.squareup.com/blog/herding-elephants/

    View Slide

  36. $PNQPTJUF#VJMETº1MVHJOXSJUJOH
    w )PXUPFOBCMF$PNQPTJUF#VJMET
    w CVJME4SDJODMVEF#VJME"1*BSF
    fi
    OFCVUTJOHMFCVJMEJTQSFGFSSFE
    w 1MVHJOXSJUJOH
    w 1MVHJOQSPKFDUTUZMFT
    w 1SPHSBNNJOH-BOHVBHFT
    w 1SFGFSBCMF"1*TBOEDPEFTNFMMT
    w "OESPJE(SBEMF1MVHJODPMMBCPSBUJPO
    36

    View Slide

  37. 1MVHJOXSJUJOH
    w 1MVHJOQSPKFDUTUZMFT
    w 1SPHSBNNJOH-BOHVBHFT
    w 1SFGFSBCMF"1*TBOEDPEFTNFMMT
    w "OESPJE(SBEMF1MVHJODPMMBCPSBUJPO
    37

    View Slide

  38. 1MVHJOQSPKFDUTUZMFT
    w 1SFDPNQJMFETDSJQUQMVHJO
    w 4UBOEBMPOFQMVHJOBLBCJOBSZQMVHJO
    38

    View Slide

  39. 1SFDPNQJMFETDSJQUQMVHJO
    w 7FSZFBTZ+VTUDSFBUFB
    fi
    MFOBNFEQMVHJOJEHSBEMF
    w -PXSFBEBCJMJUZBOEQPPSCVJMEDBDIFNBOBHFNFOU
    39

    View Slide

  40. 4UBOEBMPOFQMVHJOBLBCJOBSZQMVHJO
    w *NQMFNFOUB1MVHJODMBTTJFDSFBUFBQMVHJOQSPKFDU
    w #VJMEDBDIFJTNBOBHFBCMF TPUIJTJTSFDPNNFOEFE
    40

    View Slide

  41. 1MVHJOXSJUJOH
    w 1SFDPNQJMFETDSJQUQMVHJOPSTUBOEBMPOFQMVHJOBLBCJOBSZQMVHJO
    w 4UBOEBMPOFQMVHJODBOHFUCFOF
    fi
    UTPGCVJMEDBDIFFOPVHI
    w 1SPHSBNNJOH-BOHVBHFT
    w 1SFGFSBCMF"1*TBOEDPEFTNFMMT
    w "OESPJE(SBEMF1MVHJODPMMBCPSBUJPO
    41

    View Slide

  42. 1SPHSBNNJOH-BOHVBHFT
    w (SBEMFQSPWJEFQMVHJOTGPS(SPPWZ ,PUMJOBOEPUIFS+7.MBOHVBHFT
    w HSBEMFHSBEMFQMVHJOGPS(SPPWZ
    w LPUMJOETMGPS,PUMJO%4-
    w KBWBHSBEMFQMVHJOGPSPUIFS+7.MBOHVBHFT
    w 4UBUJDUZQFEMBOHVBHFJTQSFGFSSFE
    w (SPPWZJTBMTPPLBZJGZPVVTF$PNQJMF4UBUJDBOOPUBUJPO
    42

    View Slide

  43. 1MVHJOXSJUJOH
    w 1SFDPNQJMFETDSJQUQMVHJOPSTUBOEBMPOFQMVHJOBLBCJOBSZQMVHJO
    w 4UBOEBMPOFQMVHJODBOHFUCFOF
    fi
    UTPGCVJMEDBDIFFOPVHI
    w 1SPHSBNNJOH-BOHVBHFT
    w 4UBUJDUZQFE+7.MBOHVBHFTPSVTF$PNQJMF4UBUJDJO(SPPWZ
    w 1SFGFSBCMF"1*TBOEDPEFTNFMMT
    w "OESPJE(SBEMF1MVHJODPMMBCPSBUJPO
    43

    View Slide

  44. 1SFGFSBCMF"1*TBOEDPEFTNFMMT
    w 2%PDPOWFOUJPOQMVHJOTOFFETQFDJBM(SBEMF"1*T
    w "/P JUTKVTUBDPNNPOQMVHJOEFWFMPQNFOU
    w 2%PDPOWFOUJPOQMVHJOTDBSFTQFDJBMMZ
    w ":FT ZPVTIPVME*UTNFBOJOHMFTTJG$PNQPTJUF#VJMETUBLFUJNF
    w 2"SFDPEFTOJQQFUTJOUIFP
    ffi
    DJBMEPDVNFOUTHPPEFYBNQMFT
    w "(PPECVUTPNFUJNFTDPOUBJOEFQSFDBUFE"1*VTBHFT🤗🤗
    44

    View Slide

  45. 1SFGFSBCMF"1*TBOEDPEFTNFMMT
    w 6TF-B[ZDPO
    fi
    HVSBUJPO"1*GPSUBTL
    45
    -FHBDZ5BTL$PO
    fi
    HVSBUJPO"1* -B[Z5BTL$PO
    fi
    HVSBUJPO"1*

    View Slide

  46. 1SFGFSBCMF"1*TBOEDPEFTNFMMT
    w 6TF-B[ZDPO
    fi
    HVSBUJPO"1*GPSUBTL FYUFSOBMWBMVFT
    46
    -FHBDZ +BWB
    "1* -B[Z1SPWJEFS"1*

    View Slide

  47. 1SFGFSBCMF"1*TBOEDPEFTNFMMT
    w 6TF-B[ZDPO
    fi
    HVSBUJPO"1*GPSUBTL FYUFSOBMWBMVFTBOENPSF
    47
    3VOFYUFSOBMTDSJQUT -B[ZFYFDVUJPOPGFYUFSOBMTDSJQUT

    View Slide

  48. 1SFGFSBCMF"1*TBOEDPEFTNFMMT
    w $SFBUFBDVTUPNUBTLDMBTTJGZPVDBOOPU
    fi
    OEQSPQFSEF
    fi
    OFEUBTL
    w *OQVU0VUQVUBOOPUBUJPOTOPUJGZ(SBEMFPGDPO
    fi
    HVSBUJPODBDIFBCMF
    48
    %F
    fi
    OFBDVTUPNUBTLDMBTT 4FUBOEHFUWBMVFT

    View Slide

  49. 1SFGFSBCMF"1*TBOEDPEFTNFMMT
    w (FUPSUSBOTGPSNUBTLJOQVUTJNNFEJBUFMZ
    w -B[ZDPO
    fi
    HVSBUJPO"1*NBZCFBWBJMBCMF
    w 6TFPGJGTUBUFNFOUTUPEFUFSNJOFXIFUIFSUPBQQMZDPO
    fi
    HVSBUJPOPSOPU
    w 4FQBSBUFUIFQMVHJOJOUPNVMUJQMFQMVHJOT
    w &YQPTF"1*XJUIMB[ZDPO
    fi
    HVSBUJPO"1*
    w 6TFPG3F
    fl
    FDUJPO"1*FYDFQUXIFOBDDFTTJOHUPIJEEFO"1*
    w 4PNFSEQBSUZQMVHJOTVTFSF
    fl
    FDUJPOTUPTVQQPSUNVMUJQMFWFSTJPOTCVU
    DPOWFOUJPOQMVHJOTEPOUIBWFUPUIJOLBCPVUJU
    49

    View Slide

  50. "OESPJE(SBEMF1MVHJO$PMMBCPSBUJPO
    w #BTJDBMMZ XFEPOUIBWFUPJOUFSBDUXJUI"(1WJB(SBEMF"1*T
    w 5IFZQSPWJEFUIFJSPXO"1*TPWFS(SBEMF"1*T
    w FH"OESPJE$PNQPOFOU"1* "SUJGBDU"1*
    w #FDBVTF "OESPJEDPNQPOFOUTMJLFWBSJBOUTIBWFUIFJSPXOMJGFDZDMF
    XJUIJO"(1
    w 5IFMJGFDZDMFTBSF
    fi
    OFSHSBJOFEUIBOMJGFDZDMFPG(SBEMFTNFDIBOJTN
    MJLF5BTL TPJUTIBSEUPUPVDIGSPN(SBEMFTJOGSBTUSVDUVSF
    50

    View Slide

  51. "OESPJE(SBEMF1MVHJO$PMMBCPSBUJPO
    51

    View Slide

  52. "OESPJE(SBEMF1MVHJO$PMMBCPSBUJPO
    w %POPUUPVDIUBTLTHFOFSBUFECZ"OESPJE(SBEMF1MVHJO
    w 5IFZNBZOPUFYQPTFFYUFOTJCMFDPO
    fi
    HVSBUJPO
    w :PVDBODPO
    fi
    HVSFNBOZWBMVFTWJBDBMMCBDL"1*T
    52

    View Slide

  53. "OENPSF
    w 6TFOFXFS(SBEMF
    UPHFUUIFCFOF
    fi
    UT
    w (SBEMFJTDPOUJOVPVTMZJNQSPWJOHUIFCVJMEQFSGPSNBODF
    w 1VCMJTIBOEVTFQMVHJOCJOBSJFTWJBBNBWFOSFQPTJUPSZ<>
    w 5IJTOFFETFYQFSUJTFUFDIOJRVFTCVUNBLFJUGBTUFSUIBOPUIFST
    w 6TF(SBEMF&OUFSQSJTFUPEFUFDUJTTVFTZPVTIPVMEBEESFTT
    53
    [1] https://developer.squareup.com/blog/herding-elephants/

    View Slide

  54. 8SBQVQ

    w 1MVHJOTBSFSFDPNNFOEFEXIFOTIBSJOHMPHJDTCFUXFFONPEVMFT
    w JF(SBEMF$POWFOUJPO1MVHJOT
    w *TUSPOHMZSFDPNNFOEZPVUPGPMMPXUIFCFTUQSBDUJDFPG(SBEMFCVJMET
    CFDBVTFQPPS(SBEMFDPOWFOUJPOQMVHJOTDBVTFTMPXCVJMET
    w #VJMEJNQSPWFNFOUTGPSZPVSQSPKFDUSFRVJSFCVJMEJNQSPWFNFOUTGPS
    DPOWFOUJPOQMVHJOT
    fi
    STU😂
    54

    View Slide

  55. 8SBQVQ

    w 6OEFSTUBOEJOH(SBEMFTCVJMENFDIBOJTNXJMMCFZPVSIFMQ
    w $PNQPTJUF#VJMET -B[Z"1* "OESPJE(SBEMF1MVHJOJOUFSGBDFTFUD
    w %POUGPSHFUUIBUUIFCFTUQSBDUJDFTBMXBZDBSFDBDIJOH
    w (FUJOUPVDIXJUINFBUUIF&YIJCJUJPO"SFBGPS0
    ff i
    DF)PVSBOEPS
    UBMLJOQFSTPOBUUIF"GUFS1BSUZ🍻
    w 5IBOLZPVTPNVDIGPSMJTUFOJOHUPNZQSFTFOUBUJPO
    55

    View Slide