---
title: "Legacy Refactoring intro"
url: "https://courses.osherove.com/courses/tdd-in-net-in-hebrew/legacy-refactoring-intro.md"
canonical: "https://courses.osherove.com/courses/tdd-in-net-in-hebrew/legacy-refactoring-intro/"
tags: []
author: "Roy Osherove"
description: "Lesson 12 of 22 in TDD in .NET in Hebrew (Day 2 - Legacy Code Tools), 16:23. Free video by Roy Osherove."
usage: "Licensed under CC BY 4.0 — reuse, quote and adapt with attribution (Roy Osherove, link to the original page)."
license: "https://creativecommons.org/licenses/by/4.0/"
---

# Legacy Refactoring intro

1. [Courses](https://courses.osherove.com/#courses)
2. [TDD in .NET in Hebrew](https://courses.osherove.com/courses/tdd-in-net-in-hebrew/)
3. Day 2 - Legacy Code Tools

Lesson 12 of 22

Duration: 16:23 [Watch on YouTube](https://www.youtube.com/watch?v=agS3I0yEUc8) Spoken in Hebrew

## In this lesson

Roy Osherove turns to dependencies that cannot be injected through a constructor, such as a call to a static logger, and introduces [extract and override](https://livebook.manning.com/book/the-art-of-unit-testing-second-edition/chapter-3#ch03lev1sec5 "Variations on refactoring techniques (The Art of Unit Testing, 2nd ed., ch. 3)") from [Michael Feathers'](https://osherove.com/blog/2009/8/18/ndc-video-michael-feathers-working-effectively-with-legacy-c.html "NDC Video – Michael Feathers – Working Effectively with Legacy Code (osherove.com)") book [Working Effectively with Legacy Code](https://livebook.manning.com/book/the-art-of-unit-testing-third-edition/chapter-12#sigil_toc_id_226 "Read Michael Feathers’ book on legacy code (The Art of Unit Testing, 3rd ed., ch. 12)"), which he recommends. He moves the call into a protected virtual method with no logic and has a [testable subclass](https://livebook.manning.com/book/the-art-of-unit-testing-third-edition/chapter-4#sigil_toc_id_95 "Partial mocks (The Art of Unit Testing, 3rd ed., ch. 4)") of the login manager override it and save the text in a public field for the test to check, noting that in real [legacy code](https://livebook.manning.com/book/the-art-of-unit-testing-third-edition/chapter-12 "Working with legacy code (The Art of Unit Testing, 3rd ed., ch. 12)") he would first have an [integration test](https://livebook.manning.com/book/the-art-of-unit-testing-third-edition/chapter-1#sigil_toc_id_25 "Integration tests (The Art of Unit Testing, 3rd ed., ch. 1)") in place. To concerns about exposing such methods he answers with internal methods and [InternalsVisibleTo](https://livebook.manning.com/book/the-art-of-unit-testing-second-edition/chapter-3#ch03lev1sec6 "Overcoming the encapsulation problem (The Art of Unit Testing, 2nd ed., ch. 3)").

## Transcript

1,933 words

[\[00:03\]](https://www.youtube.com/watch?v=agS3I0yEUc8&t=3s) אתה יודע שזה מה שיש לך להגיד למה testing is good testing נכון רדג אתה רוצה להגיד מה שמצן

[\[00:38\]](https://www.youtube.com/watch?v=agS3I0yEUc8&t=38s) טוב בואו נסתכל על logic פה אנחנו נכנסים קצת לדומיין שקצת רגע סיכוי ואנחנו נדבר על איך לעשות רפקטורים לקוד כדי שנוכל לכתוב אותו עם פריורקים שהם קונסטר כי לפעמים הדיזיין הוא כן משהו שהם רוצים לשנות אז אנחנו הולכים לראות בקורס הזה גם טכניקות של ריפקטורים כדי שנוכל שנות קוד קיים וגם טכניקות בלי ריפאקטורים. אז היום היום בעיקר נלמד על טכניקות של ריפקטור. עכשיו במקרה הזה בתרגילים שאתם יכולים לעשות עכשיו יהיה לנו כמה סוגים שלפנency שאנחנו נצטריך להתגבר עליהם.

[\[01:13\]](https://www.youtube.com/watch?v=agS3I0yEUc8&t=73s) הסוג הראשון של dependency זה dependency static במקרה הזה אחת הדרישות יהיו בoger static יש קרי לstatic logger right אין logger אין קונסטר פה בעצם גם מה שעשינו עד עכשיו אנחנו עשינו מה שנקרא constructor inction לקחנו dependen ועשינו להם inקטור constructor יש הרבה סוגים של inctionקש שאפשר לעשותקסטור זה אחת הדרכים הבסיסיות בגלל שזה לא אופציות

[\[01:43\]](https://www.youtube.com/watch?v=agS3I0yEUc8&t=103s) אבל פה אין בכלל מאיפה לעשות in עכשיו השתלה איך אנחנו יכולים לוודא שatic logo r באמת נקרא נניח יש לי פה באג שחסר לי פהספיס או יש לי באג וחסר לי פה איזשהו מידע מאוד חשוב איך אני יכול להוכיח בטest שהמידע הזה חסר אז הדרך שאנחנו נראה עכשיו נקראת extract and over היא נלקחת מספר שאני ממליץ עליו בחום שנקרא [Working Effectively with Legacy Code](https://osherove.com/blog/2005/4/15/book-of-the-month-working-effectively-with-legacy-code.html "[Book of the month] Working effectively with legacy code (osherove.com)") יש לכם אותו פה

[\[02:14\]](https://www.youtube.com/watch?v=agS3I0yEUc8&t=134s) תקנו אותו פשוט ככה שמייקל פדרס הוא שווה את המשקל שלו בזהב מבחינתי המון מהדברים שאני למדתי על ריפאקטורינג למדתי מהספר הזה יש בו הרבה יותר דברים ממה שאנחנו נלמד בקורס אבל בגדול הספר הזה מדבר על מה קורה כשאתה בעולם שבו וודקה זה פתרון מאוד טוב לבעיות גסי שלך שפל וסלב התלהבו מהצלו דווקא בסדר הזה ויש יש שם המון המון חוכמה המון סוגים של ריפקטורים באמת ספר ספר נורא מעניין. המון מהדוגמאות הם ב-C++ ובג'אבה, אבל זה עדיין אף ספר מאוד קרי.

[\[02:48\]](https://www.youtube.com/watch?v=agS3I0yEUc8&t=168s) אחת הד אחד הטכניקות הכי הכי פשוטות היא נקראת אקסטרct ואיד והרעיון הוא ככה. אם אין אם יש לנו depפendנסי ישיר ואנחנו לא יכולים להחליף אותו ישירות אז אנחנו נעשה שכבת אבסטרקציה קטנה מעל ואנבדוק שהשכבת אבסטרקציה נקראה. אבל במקום לעשות פה קלאס אנחנו נעשה אבטרקציה רק למתודה לקריאה למתודה. במקום לוודא שatic loger right נקרא אני אעשה לו אact method

[\[03:28\]](https://www.youtube.com/watch?v=agS3I0yEUc8&t=208s) ולמטודה אני יכול לקרוא call the logoer אני לא רוצה לעשות אותו statטיק אני רוצה לעשות אותו וירטואלית וtectד במקרה שלנו אוקיי אז זה בעצם מה שאני אקבל היא עדיין לא תהיה מספיק טובה בגלל ש יש פה את הסטרינג הזה מבחינתי מה שאני הולך לעשות זה בטestטים שלי אני הולך להרשת מהקלאס הנוכחי

[\[03:58\]](https://www.youtube.com/watch?v=agS3I0yEUc8&t=238s) למרות שזה הקלאס שאני בודק ולעשות אורייד רק לפונקציה הזאת אז ככה שכל שאר הקוד עדיין יעבוד אבל הפונקציה הזאת יהיה להover ואז אני בעצם אתגבר על הדפנenנy אבל אני לא אני רוצה גם לבדוק את ‏string אז אם אני אעשה over strיing אני לא יוכל לבדוק אותו צריך לקבל את כל המידע בפרמטר אז אני אעשה פה contנטרול altפct paramet te ועכשיו מה שיש לי זה cologer עם login requested בעצם הפונקציה

[\[04:30\]](https://www.youtube.com/watch?v=agS3I0yEUc8&t=270s) היא טיפשה לחלוטין אין לה שום מידע אבל לא שיניתי את הפונקציונליות של הקוד הפונקציונליות עדיין עושה בדיוק אותו דבר ההבדל היחיד הוא שעשיתי את הקוד יותר testable עכשיו שימו לב שבמקרה הזה בגלל שזה לגסוד הצד הראשון שלי הוא לעשות ריפקטורing הוא לא לכתוב test בלגסי קוד אמיתי לא הייתי עושה את הרפקטור הזה אפילו בלי שהיה לי אינטגרש test אחד רציני פות שעובר דרך הדבר הזה בדרך כלל שניים אבל כשיש את הנטגרation test אני יכול להתחיל לעשות את הדבר הזה

[\[05:05\]](https://www.youtube.com/watch?v=agS3I0yEUc8&t=305s) אז עשיתי פה exract method עשיתי את המתprcted virtual ופה אני מוודא שאין שום לוגיקה וזה הקוד הכי טיפה שיכול להיות כי אם יש לי פה לוגיקה מכיוון שאני הולך לעשות לה אורייד בטestטים שלי לא יהיה לי שום סיכוי לבדוק אותה אז אם יש פה באג אני בחיים לא אמצא אותו אז עכשיו הנחת יסודי שאם כל דלוגoger נקרא אז הלוגר נקרא בגלל שהקוד הזה כזה פשוט אני יכול להרשות לעצמי להניח את זה בטestים אני אצור קלאס חדש ונקרא לו testableגog

[\[05:44\]](https://www.youtube.com/watch?v=agS3I0yEUc8&t=344s) ‏manager with stat והוא יורש לי login manager stat אוקיי תשימו לב אני יורש מהקלא שאני הולך לבדוק אבל במקום לעשות פייק לכל הקלאס אני הולך לעשות בעצם פיק אבריד רק לפונקציה אחת אז זה פיקד מבחינתנו אוקיי הדבר הבא אני יכול לעשות overri לכל ואני לא רוצה לקרוא לבי b כי בעצם זה הדפendנency שלי אם אני אקרא להסטיקלג אז יהיה לי את אותם בעיות שהי גם קודם אולי זה יקח הרבה זמן אולי זה יזרוק את הבאג שהיה גם קודם אז כל מה שאני עושה עכשיו זה כמעט מה שעשיתי בפיק לוגoger הנר שכתבתי אני אכתוב

[\[06:30\]](https://www.youtube.com/watch?v=agS3I0yEUc8&t=390s) שטקסט אל create fieldד נעשה אותו publicק וזהו עכשיו את הטestטים שלי אני אכתוב כנגד הקלאס הזה כל שאר הקוד בקס הזה הוא producion cod בגלל זה תשימו לב זה לא נקרא [fake](https://livebook.manning.com/book/the-art-of-unit-testing-second-edition/chapter-4#ch04lev1sec2 "The difference between mocks and stubs (The Art of Unit Testing, 2nd ed., ch. 4)") זה נקרא testable זה מאוד חשוב כי זה testable verion של אותו clס אחרי זה אני יכול לכתוב test שנראה ככה

[\[07:01\]](https://www.youtube.com/watch?v=agS3I0yEUc8&t=421s) Test is login senario ‏Cold calls static loger עכשיו כתבתי statטיק loger פה בשביל הדמו אתם אצלכם לא תכתבו שהלוגר הוא סטטיק אף אחד לא אכפת שהלוגר הוא סטטיק בוא סיכון שתכתבו לoger מכירה הלוגר הוא סטטיק אבל במקום ליצור את האנסט של הקלאס האמיתי אני אכתוב

[\[07:34\]](https://www.youtube.com/watch?v=agS3I0yEUc8&t=454s) פה מכיוון שאני יוצר אותו ישירות אני יכול לקצר את השורה ולהגיד זה כבר עכשיו אין לי מה לעשות פה להשתמש בטest בisolation framewor או כל דבר אחר אני פשוט יכול להגיד lm is login ו string assert conסני אוקיי וm

[\[08:05\]](https://www.youtube.com/watch?v=agS3I0yEUc8&t=485s) לא טס בדיוק כמו שעשינו עם הפייקל בהתחלה שהטest הזה יעבור סימן שהסטיקל נקרא אז הרפקטינג שעשיתי הוא לקחת קריאה לסטאטיק סו אה בסדר אי אפשר לזמור את הדלת >> שניה >> אוקיי חבר'ה תתרגזוזר רק עוד שתי דקות אתם הולכים לכתוב קוד תחסיקו מעמד אוקיי

[\[08:37\]](https://www.youtube.com/watch?v=agS3I0yEUc8&t=517s) זה מרגיש יש למוכון של מונטיפ אז כל מה שעשיתי זה ללכת ללוגog manager ולהגיד protected virtual הקוד עצמו עושה בדיוק את אותו דבר זה נקרא אrct and over שאלות לגבי אני שבק בתוך הבית שלסטיק >> אני לא קורא לו אז מה אכפת לי אתה קורא לו >> תראה לסטטיקלגר יהיו טסים משלו היוט הור שלנו לא קשור אליו כרגע כי אין לנו שליטה עליו ‏static lower אתה צריך להניח שיהיה לא טסים משלו וגם test שלך זה באג בסטיקל כנראה שיהיה בוא נניח ככה אבל בשביל זה החברה שלו גם עושים

[\[09:16\]](https://www.youtube.com/watch?v=agS3I0yEUc8&t=556s) בסדרסים >> אין בעל שזה יותרנו עד קוד לתחלק כלומר כל הדבר הזה בשביל קירת מתודה אחת אם יש לנו הרבה מתודות כאלה זה >> נפח את הקוד בצורה >> זה נראה כזה יוצר הרבה קוד אבל הקוד הזה הוא מאוד מאוד פשוט אחרי שימוש זה בקוד לגסי אמיתי, אחד הדברים שאתה תגלה שהטכניקה הזאת היא מאוד חזקה ומאוד פשוטה. היא הרבה יותר קלה ממה שעשינו עד עכשיו כי היא לא מחייבת אותך ליצור אינטרפייס חדש במערכת היא לא מחייבת אותך לממש את האינטרפייס הזה היא לא מחבת אותך לעשותק היא פשוט עושה אקסטר לאיט פשוט עושה אקסטר ואחרי שתי שניות יש לך את הקוד הזה ותשים לב כמה הקוד הזה פשוט

[\[09:59\]](https://www.youtube.com/watch?v=agS3I0yEUc8&t=599s) הוא דווקא ממש לא מסובך יש לי פה שהמטוריות הרמנית רק לפרויקט של הטסטים ש אני לא אוכל לראות אותם ממקום אחר >> שאני לא אוכל לראות אותם ממקום אחר את >> כל תלכ כל דלוגר לתוך שלא יהיה מצב שאני מישהו יקרא לזה בטעות שלא כאילו מפחיד אותך שיקראו לפונקציות האלה בטעות זה >> זאת אומרת אצלכם לא עושים קוד >> גם אם עושים זה לא >> אז איך אז לא יתסו את זה אתה חושב >> בר שיש הרבה כאלה זה בעיה

[\[10:30\]](https://www.youtube.com/watch?v=agS3I0yEUc8&t=630s) זה בעיה לעשות קוד ריבו אם יש הרבה כאלה >> לא אבל קוד ריבו זה לא פתרון לכל דבר בקוד של אז יש תמיד סיכוי שמישהו יקרא >> כן אבל שיש >> בואו נגיד חבר'ה אני יכול ברפלקשן לקרוא לכל מתודה prvט שיצרתם מ פעם יש סיכוי שאני אעשה את זה לא משנה איך הפ שלכם יר >> לא אבל זה גם שנגיד אם אני משתמש באובייקט ואני רואה את הפאבליק מת שלו אז אני אראה כמה שפחות שאני לא אתזה 400 >> המתודה הזאת היא טקט היא לא פאבליק חשוב שתזכור את זה נכון >> נכון עכשיו סתם גם בתור דוגמה בג'אבה כל הדברים מביא את שואל בדפולט

[\[11:13\]](https://www.youtube.com/watch?v=agS3I0yEUc8&t=673s) מה אנשים עושים בעולם הג'אבה משתמשים רק >> צריך להבין שבדרך כלל ואם אנחנו נסתכל ועוד פעם זה יותר שיש שקשור לדיזיין אוקיי אם תחפשו נושא של solוליד אתם תראו שקסים שהם extendable extensible זה אחד הדברים שהם דווקא כן מוסיפים דיזין מבחינת התמישות שלו. אמ אבל מבחינתנו אם אנחנו באמת רוצים, מכיוון שאין פה דת, זה לא שאני מאמין שזאת הדרך הכי טובה, זאת דרך שלא צריך להיות לכם בעיה איתה.

[\[11:50\]](https://www.youtube.com/watch?v=agS3I0yEUc8&t=710s) אבל אם יש לכם בעיה איתה, תמיד אפשר לעשות if the bug. אתם מכירים את הפ? אז תעשו ותעשוט או private זה נגמר העניין. זאת אומרת אתם יכולים להגיד אנטרנal גם על מתודות אתם יכולים להגיד [InternalsVisibleTo](https://livebook.manning.com/book/the-art-of-unit-testing-second-edition/chapter-3#ch03lev1sec6 "Overcoming the encapsulation problem (The Art of Unit Testing, 2nd ed., ch. 3)") על הtest assembly אם אתם מכירים את הנושא הזה אני אסביר אדed

[\[12:24\]](https://www.youtube.com/watch?v=agS3I0yEUc8&t=744s) Internal אוקיי אם עשית את זה interטרנal אז כביכול אף אחד לא יראה את זה אבל אז אני יכול ללכת לאassemly infו שלי אה בוא נראה איפה איפו זה פה אני יכול להוסיף InternalsVisibleTo ואני יכול לתת פה את השם של הtest assembly אז מאותו רגע מבחינת הtest assembly זה פליט אבל מבחינת כל אחד אחר זה prיבט

[\[12:54\]](https://www.youtube.com/watch?v=agS3I0yEUc8&t=774s) אוקיי אז זה משהו שעושים כשבאמת יש בעיה עם לחסוף את הדברים אני אישית אין לי שום בעיה עם הדבר הזה זה איזשהו פחד אחד בגלל שזה בסדר, זה בסדר שזה מפחיד, אבל אני אומר לכם שמבחינת השימוש בעולם האמיתי אנשים לא עושים בביוז לדברים האלה במיוחד שזה הכל באותה חברה אם הייתם עושים איזה פריורק שאתם עושים דליבר ואנשים עושים לו ומשתמשים בו ועושים לו אוברייד וכל מיני דברים כאלה מילא פה זה הכל קונטינט בתוך חברה אחת יש לכם כאילו באותה מידה שאתם מוודאים שלכל פרמטר מתחיל באות A אם אתם מצליחים לעשות את זה אז אין שום סיבה שלא תצליחו גם לבדוק את הנושא הזה בוא נפת ככה וגם זה באמת מבחינתי זה די שטויות אבל אם צריך אפשר למצוא דרך לפתור את זה

[\[13:39\]](https://www.youtube.com/watch?v=agS3I0yEUc8&t=819s) אה עוד שאלות ואני גם יכול לעשות כן if ולעשות ככה prate protected בדרך כלל לא צריך לעשות את זה אוקיי אז זה הדבר הראשון עכשיו בוא נסתכל על עוד מקרה

[\[14:17\]](https://www.youtube.com/watch?v=agS3I0yEUc8&t=857s) נלך ללגן man statס lws אוקיי אחרי זה יש לנו יהיה לכם יהיה לכם עוד דרישה לבדוק גם שסטיקוב סרביס נקרא כביכול זה נראה אותו דבר אבל בין השר יש פה גם את הדרישה שמשינם גם ישלח עכשיו משני nameים זה גם מכיוון שמשינם משתנה בין מכונה למכונה אז כל פעם שתריצו את הטest במכונה אחרת זה בעצם test אחר אז גם על משינם אנחנו נצטרך להתמודד איתו וזה גם זה עוד statטיק propפרerטy גם פה אפשר להשתמש באקסטרct ואover כדי לשלוט על המשי שלנו עוד פעם להוסיף את זה לtestable verion

[\[14:57\]](https://www.youtube.com/watch?v=agS3I0yEUc8&t=897s) אמ עוד דברים חשובים חבר'ה אנחנו כשנגיע לזה אנחנו עוד מעט גם נפתור את נושא הזמן מה יקרה אם אני אבקש ממכם להוסיף את הurentate and time למage >> אותו דבר בזה לא >> מה >> אותו דבר >> כן זה משהו שכבר מתחיל להיות קצת בעייתי בשיטה הזאת אנחנו נדבר על עוד שיטות כשנגיע לתרגיל הזה אז מה שאני מבקש ש נעשה הפסקה בינתיים ז אומרת לא הפסקה אנחנו נתחיל לעבוד בינתיים

[\[15:32\]](https://www.youtube.com/watch?v=agS3I0yEUc8&t=932s) כשתגיעו לתרגיל הזה staticס מה שאני מבקש שתעשו לי תרגיל ת ו10 אה וכשנגיע לתרגיל 11 תנסו לעשות אותו בעצמכם ואנחנו ניפגש פה נראה כמה זמן זה יקח אני מקווה שעוד חצי שעה כבר נוכל להיפגש פה עוד פעם אם יקח שעה יקח שעה זה גם בסדר אל תנסו למר יותר מדי חשוב שתלמדו בקצב שלכם זה שתנה אני אסתכל לראות מה הקצב כרגע לנסות לעשות את 9 10 ו1 ואז אנחנו נחזור וניפגש יש שאלות לפני זה

[\[16:22\]](https://www.youtube.com/watch?v=agS3I0yEUc8&t=982s) אוקיי ‏Yeah.

## Related

- [Mock Objects vs. "Inherit & Override"](https://osherove.com/blog/2005/6/16/mock-objects-vs-quotinherit-amp-overridequot.html) · osherove.com

    Discusses overriding a virtual method in a test subclass, the extract and override technique taught here.

- [Variations on refactoring techniques](https://livebook.manning.com/book/the-art-of-unit-testing-second-edition/chapter-3#ch03lev1sec5) · The Art of Unit Testing, 2nd ed., ch. 3

    Variations on refactoring techniques for breaking dependencies, in C#, alongside extract and override.

- [Overcoming the encapsulation problem](https://livebook.manning.com/book/the-art-of-unit-testing-second-edition/chapter-3#ch03lev1sec6) · The Art of Unit Testing, 2nd ed., ch. 3

    Overcoming the encapsulation problem, the concern about exposing methods that the lesson answers with internal and InternalsVisibleTo.

- [Read Michael Feathers’ book on legacy code](https://livebook.manning.com/book/the-art-of-unit-testing-third-edition/chapter-12#sigil_toc_id_226) · The Art of Unit Testing, 3rd ed., ch. 12

    Recommends reading Michael Feathers' book on legacy code, the source of extract and override cited in the lesson.

### Also linked in this lesson

#### The Art of Unit Testing, 3rd ed.

- [Partial mocks](https://livebook.manning.com/book/the-art-of-unit-testing-third-edition/chapter-4#sigil_toc_id_95), ch. 4
- [Working with legacy code](https://livebook.manning.com/book/the-art-of-unit-testing-third-edition/chapter-12), ch. 12
- [Integration tests](https://livebook.manning.com/book/the-art-of-unit-testing-third-edition/chapter-1#sigil_toc_id_25), ch. 1

#### The Art of Unit Testing, 2nd ed.

- [The difference between mocks and stubs](https://livebook.manning.com/book/the-art-of-unit-testing-second-edition/chapter-4#ch04lev1sec2), ch. 4

#### osherove.com

- [NDC Video – Michael Feathers – Working Effectively with Legacy Code](https://osherove.com/blog/2009/8/18/ndc-video-michael-feathers-working-effectively-with-legacy-c.html)
- [\[Book of the month\] Working effectively with legacy code](https://osherove.com/blog/2005/4/15/book-of-the-month-working-effectively-with-legacy-code.html)

[Previous lesson Recursive Fakes](https://courses.osherove.com/courses/tdd-in-net-in-hebrew/recursive-fakes/) [Next lesson Controlling Time](https://courses.osherove.com/courses/tdd-in-net-in-hebrew/controlling-time/)


---

## About the author

**Roy Osherove**: Senior Solutions Architect at AWS working on AI for production and AI-driven development; author of The Art of Unit Testing and Elastic Leadership, with about 20 years of consulting and training on unit testing, TDD, team leadership and continuous delivery.

### Sites

- [RobotPaper](https://robotpaper.ai/): This blog: AI patterns and anti-patterns, AI and coding agents, and engineering leadership.
- [osherove.com](https://osherove.com): Roy's personal site. Author of The Art of Unit Testing and Elastic Leadership; consulting and training on unit testing, TDD, team leadership and continuous delivery, plus about 20 years of blog posts.
- [The Art of Unit Testing](https://www.artofunittesting.com): The Art of Unit Testing, 3rd Edition (Manning): readable, maintainable, trustworthy unit tests, plus TDD workshops in C#, JavaScript, Java and Kotlin.
- [5whys.com](https://www.5whys.com): Roy's writing on software team leadership: self-organizing teams, surviving chaos, learning mode and the Elastic Leadership model.
- [Pipeline Driven](https://pipelinedriven.org): Continuous delivery and DevOps practices: build patterns, pipeline-friendly testing, DevOps metrics and enterprise DevOps.
- [Elastic Leadership](https://www.elasticleadership.com): Elastic Leadership, Roy's framework for software team leaders (survival, learning and self-organizing modes).

### Social

- X: https://x.com/royosherove
- LinkedIn: https://www.linkedin.com/in/osherove/

### Contact

- Contact form: https://forms.gle/jQSx5KoXvrVA1JCK7

### License

Licensed under CC BY 4.0 — reuse, quote and adapt with attribution (Roy Osherove, link to the original page). License: https://creativecommons.org/licenses/by/4.0/
