PHP Alive And Kicking: Episode 25 Sebastian Bergmann
๐ **Source:** [PHP Alive And Kicking: Episode 25 Sebastian Bergmann](https://www.youtube.com/watch?v=DCCGn4vurZE&rw_yt_language=en)
> [!note]+ Document Notes
> tags: #php #testing #phpunit #event-sourcing #test-driven-development
> author: PHP Alive And Kicking
> source: YouTube
> reference: https://www.youtube.com/watch?v=DCCGn4vurZE
> date created: 2025-01-04 12:00
>
> # ๐ท๏ธ Title: PHP Alive And Kicking: Episode 25 Sebastian Bergmann
>
<!-- deep-read:sections start -->
## ๐งฐ Action Inbox
- [H1] Explore event sourcing testing patterns โ given/when/then methodology for event-driven systems #event-sourcing
- [H2] Investigate PHPUnit 13 array comparison assertions โ eight new assertions for strict/loose array comparison #phpunit
- [H3] Consider board games for technical training โ domain-driven design and TDD teaching approach #training
## ๐งญ Table of Contents
- [[#๐ Summary]]
- [[#๐ Main Content]]
- [[#๐๏ธ Notes]]
- [[#๐ References]]
- [[#๐ฃ๏ธ Paraphrase]]
- [[#๐ฐ Newsletter]]
- [[#โ
Action Items]]
- [[#๐งช Hypotheses]]
- [[#๐ Methodology]]
- [[#โ Questions]]
- [[#๐ฎ Future Research]]
- [[#๐ก Implications]]
- [[#๐ง Learning Styles Assessment]]
- [[#๐ Accessibility Assessment]]
- [[#๐ DEIB Assessment]]
- [[#โ
Logical Validity]]
- [[#๐ก๏ธ DARVO Analysis]]
- [[#๐ฏ Conclusion]]
### ๐ References
- [Sebastian Bergmann's Blog](https://sebastian-bergmann.de/)
- [PHPUnit Documentation](https://phpunit.de/)
## ๐ Summary
Sebastian Bergmann, creator of PHPUnit, discusses his journey from Amiga programming to creating PHP's most widely used testing framework. He shares his path into PHP development in 1998, the evolution of PHPUnit over 26+ years, and innovative approaches to testing event-sourced applications using given/when/then patterns that generate visual documentation. Key highlights include PHPUnit 13 features, code coverage improvements, and using board games as teaching tools for test-driven development.
## ๐ Main Content
Sebastian Bergmann's programming journey began with the Amiga 500 in 1990, progressing through demo scene participation and bulletin board system extensions. His PHP introduction came in 1998 during a university internship when contacted by a former Amiga graphics artist needing server-side programming help. After trying Perl briefly, Sebastian found PHP intuitive and learnable within a weekend.
PHPUnit emerged from Sebastian's need for a JUnit-equivalent testing framework for PHP around 2004-2005. Initially hesitant to publish his solution, he eventually shared it on cvs.php.net, leading to widespread adoption. The framework has evolved significantly, with PHPUnit 10 introducing an event-driven architecture and PHPUnit 13 adding enhanced array comparison assertions and mock object parameter matchers.
A major innovation Sebastian presented is testing event-sourced applications using given/when/then patterns that map directly to domain events. This approach generates visual documentation aligned with event storming techniques, creating living documentation that shows system behavior through test execution.
## ๐๏ธ Notes
#### โฑ๏ธ [00:00](https://youtu.be/DCCGn4vurZE?t=0) โ [H1] Introduction and guest setup
- Key idea: Sebastian Bergmann joins PHP Alive and Kicking podcast
- Evidence: "Today's guest is one of the speakers who has kindly agreed to come on"
#### โฑ๏ธ [05:30](https://youtu.be/DCCGn4vurZE?t=330) โ [H2] Sebastian's PHP origin story begins
- Key idea: Sebastian entered PHP development in 1998 during university gap period
- Evidence: "That was in 1998... between I had just finished my military replacement service"
#### โฑ๏ธ [08:45](https://youtu.be/DCCGn4vurZE?t=525) โ [H1] Amiga programming background
- Key idea: Sebastian's programming foundation came from Amiga demo scene participation
- Evidence: "Got an Amiga 500 in 1990 and an Amiga 1200... I was always fascinated by the intros, the cracks and the demos"
#### โฑ๏ธ [12:20](https://youtu.be/DCCGn4vurZE?t=740) โ [H2] First PHP project and Perl rejection
- Key idea: Weekend PHP learning enabled first server-side programming project
- Evidence: "I tried my hands at Perl for one or two hours and then stopped... I tried PHP and was able to learn enough PHP in a weekend"
#### โฑ๏ธ [16:15](https://youtu.be/DCCGn4vurZE?t=975) โ [H1] PHPUnit creation motivation
- Key idea: Sebastian needed JUnit-equivalent testing framework for PHP projects
- Evidence: "I searched for a solution for that in PHP... somebody must have already built that, right?"
#### โฑ๏ธ [19:30](https://youtu.be/DCCGn4vurZE?t=1170) โ [H3] PHPUnit publication hesitation
- Key idea: Sebastian delayed sharing PHPUnit for a year hoping someone better qualified would create it
- Evidence: "For about a year, I did not want to share that with the world because I was still hoping that somebody else who is much better qualified"
#### โฑ๏ธ [23:45](https://youtu.be/DCCGn4vurZE?t=1425) โ [H1] Event sourcing testing concepts
- Key idea: Event-driven systems enable elegant testing through immutable event records
- Evidence: "You keep a record of everything that is relevant to your domain as it happens as an immutable event"
#### โฑ๏ธ [28:10](https://youtu.be/DCCGn4vurZE?t=1690) โ [H2] Given/when/then testing pattern
- Key idea: Event sourcing tests express intent through readable given/when/then structure
- Evidence: "Given that these events have happened in the past when I perform this command... then I expect that these other events have now been recorded"
#### โฑ๏ธ [32:20](https://youtu.be/DCCGn4vurZE?t=1940) โ [H1] Visual documentation generation
- Key idea: PHPUnit extensions can generate visual maps from event-driven tests
- Evidence: "Get visual documentation out of running the tests that goes full circles to... a lot of sticky notes on the wall that are color-coded"
#### โฑ๏ธ [36:40](https://youtu.be/DCCGn4vurZE?t=2200) โ [H2] PHPUnit 10 event system
- Key idea: PHPUnit 10 introduced comprehensive event system for extensibility
- Evidence: "PHPUnit just emits an event for everything that is relevant in the context of running tests... dozens like for anything that is meaningful"
#### โฑ๏ธ [41:15](https://youtu.be/DCCGn4vurZE?t=2475) โ [H1] PHPUnit 13 new features
- Key idea: PHPUnit 13 unusually includes new features in major release
- Evidence: "The new thing about PHPUnit 13 is that there is something new... usually the first release of a new major version is rather boring"
#### โฑ๏ธ [44:30](https://youtu.be/DCCGn4vurZE?t=2670) โ [H2] Eight new array comparison assertions
- Key idea: PHPUnit 13 adds comprehensive array comparison assertions covering all strictness levels
- Evidence: "There are eight new assertions that deal with arrays comparing arrays for identity and equality from very very strict... all the way to the other end"
#### โฑ๏ธ [48:50](https://youtu.be/DCCGn4vurZE?t=2930) โ [H1] Code coverage serialization rewrite
- Key idea: Sebastian rewrote code coverage merging functionality after 10+ years of frustration
- Evidence: "I rewrote the code that serializes code coverage information... while solving all the bugs that have accumulated"
#### โฑ๏ธ [52:15](https://youtu.be/DCCGn4vurZE?t=3135) โ [H2] Board games in technical training
- Key idea: Board games provide excellent domain examples for teaching TDD and DDD
- Evidence: "We are selecting a subset of the rules from that game and will implement these rules in a test-driven fashion"
## ๐ References
- [Sebastian Bergmann's Blog](https://sebastian-bergmann.de/)
- [PHPUnit Documentation](https://phpunit.de/)
- [Event Storming Methodology](https://www.eventstorming.com/)
- [PHP Architect Magazine](https://www.phparch.com/)
## ๐ฃ๏ธ Paraphrase
- Sebastian's programming journey started with Amiga computers in the 1990s, progressing through demo scene participation to bulletin board system extensions, eventually leading to PHP development in 1998 when helping a former graphics artist with server-side programming needs.
- PHPUnit emerged from Sebastian's university experience with JUnit and his need for similar testing capabilities in PHP, initially developed privately before being shared on cvs.php.net and becoming the de facto standard PHP testing framework.
- Event-sourced application testing using given/when/then patterns creates readable, maintainable tests that generate visual documentation aligned with domain modeling techniques like event storming, providing living maps of system behavior.
## ๐ฐ Newsletter
**Testing Revolution: Sebastian Bergmann Shares PHPUnit's Evolution and Event-Sourced Testing Innovations**
PHPUnit creator Sebastian Bergmann joined our podcast to discuss the framework's 26-year evolution and groundbreaking approaches to testing event-driven applications. His journey from Amiga programming to creating PHP's most essential testing tool showcases the power of solving personal development needs.
The latest PHPUnit 13 release brings eight new array comparison assertions and improved mock object parameter matchers, making testing more flexible and maintainable. Perhaps most exciting is Sebastian's work on visual documentation generation from event-sourced tests using given/when/then patterns.
Key takeaway: Testing isn't just about verificationโit's about creating living documentation that maps your application's behavior and supports domain-driven design practices.
Resources: [Learn WordPress](https://learn.wordpress.org/), [Developer Docs](https://developer.wordpress.org/), [WP-CLI](https://wp-cli.org/)
## โ
Action Items
#### DevRel
- Developer advocacy: Present event-sourced testing patterns at conferences, create PHPUnit workshops
- Education: Develop curricula around given/when/then testing patterns, board game training modules
- Developer experience: Document PHPUnit event system for extension development
- Developer marketing: Promote PHPUnit 13 features, visual documentation capabilities
- Community management: Foster testing best practices discussions, mentorship programs
#### Community
- Maintainers: Share testing governance templates, code coverage improvement strategies
- Contributors: Create PHPUnit extension examples, testing pattern documentation
- Sponsors: Support testing infrastructure improvements, conference speaking opportunities
- Ecosystem: Coordinate testing standards across PHP frameworks
#### WordPress
- Core: Implement event-driven testing patterns for WordPress core development
- Core Performance: Use visual documentation for performance testing workflows
- Community: Develop testing workshops for WordCamps, create testing mentorship programs
- Training: Include advanced PHPUnit techniques in developer courses
- Documentation: Add testing best practices to WordPress developer documentation
- Plugins: Establish testing standards for plugin directory submissions
## ๐งช Hypotheses
- Event-sourced testing with visual documentation generation reduces debugging time and improves developer onboarding
- Board game domains provide more engaging and memorable technical training than generic examples
- PHPUnit's event system enables unprecedented extensibility for testing workflows and documentation
- Given/when/then testing patterns bridge the gap between business requirements and technical implementation
### ๐ Methodology
- Study design: Compare debugging time and code comprehension between traditional tests and visual event documentation
- Data sources: Developer survey data on training effectiveness using domain-specific vs generic examples
- Experiments: A/B test PHPUnit extensions for documentation generation and developer productivity metrics
### โ Questions
- How can WordPress core development adopt event-sourced testing patterns for complex feature development?
- What testing documentation standards would most benefit the PHP ecosystem?
- How might visual test documentation integration with GitHub improve code review processes?
### ๐ฎ Future Research
- Integration patterns between PHPUnit visual documentation and existing developer workflows
- Comparative effectiveness of domain-driven training approaches across different technical concepts
- Standardization opportunities for event-sourced testing patterns across PHP frameworks
### ๐ก Implications
- Practice: Testing becomes documentation generation tool, shifting from verification to system mapping
- Policy: Testing standards may need updating to accommodate visual documentation requirements
- Education: Domain-specific examples (board games) may significantly improve technical training effectiveness
- Funding: Investment in testing infrastructure improvements could yield substantial developer productivity gains
### ๐ง Learning Styles Assessment
Reading level estimate: 12th grade
#### ๐ Visual learners
- Present: Board game examples, event storming sticky note visualizations
- Improve: PHPUnit architecture diagrams, test flow visualizations, code coverage heat maps
#### ๐ Aural learners
- Present: Podcast format with detailed explanations
- Improve: Audio examples of test execution, narrated code walkthroughs
#### ๐ฃ๏ธ Verbal learners
- Present: Clear analogies (bank account events, board game rules)
- Improve: Glossary of testing terminology, event-sourcing vocabulary
#### ๐งฉ Kinesthetic learners
- Present: Board game training exercises, hands-on coding examples
- Improve: Interactive PHPUnit playground, step-by-step testing tutorials
#### ๐ง Logical learners
- Present: Sequential development timeline, cause-effect relationships in testing
- Improve: Testing decision trees, architectural flow charts
#### ๐งโ๐คโ๐ง Social learners
- Present: Discord community discussions, conference presentations
- Improve: Testing mentorship programs, collaborative debugging sessions
#### ๐งโโ๏ธ Solitary learners
- Present: Individual exploration of PHPUnit features
- Improve: Self-assessment testing quizzes, personal project templates
#### ๐ฟ Naturalistic learners
- Present: Evolution of testing frameworks over time
- Improve: Testing ecosystem relationships, framework lifecycle comparisons
### ๐ Accessibility Assessment
#### Screen reader semantics
- Present: Clear headings in code examples, descriptive code comments
- Improve: Alt text for visual documentation outputs, ARIA labels for test result displays
#### Keyboard navigation
- Present: Command-line focus throughout examples
- Improve: Keyboard shortcuts for PHPUnit IDE integrations
#### Contrast and readability
- Present: High contrast in terminal output examples
- Improve: Customizable color schemes for test result visualization
#### Text resizing and reflow
- Present: Plain text code examples scale well
- Improve: Responsive visual documentation layouts
#### Media and captions
- Present: Podcast transcript available
- Improve: Captioned code demonstration videos
#### Forms and interactions
- Present: Clear CLI command structure
- Improve: Accessible web interfaces for PHPUnit reporting tools
### ๐ DEIB Assessment
#### Cultural breadth
- Present: International perspective (German/UK experiences)
- Improve: Examples from diverse cultural contexts, global testing practices
#### Inclusive language
- Present: Technical explanations avoid jargon where possible
- Improve: Define domain-specific terminology consistently
#### Neurodiversity support
- Present: Structured conversation format, clear topic transitions
- Improve: Visual organizers for complex testing concepts
#### Representation
- Present: Multiple speakers from different backgrounds
- Improve: Diverse examples beyond gaming references
#### Psychological safety
- Present: Respectful discussion of learning challenges
- Improve: Explicit encouragement for testing beginners
### โ
Logical Validity
#### Strong reasoning
- Deductive strength: Clear progression from personal need to framework creation
- Inductive strength: Multiple examples support broader testing principles
- Causal reasoning: Well-established links between testing approach and outcomes
- Analogical strength: Effective use of board game and banking analogies
#### Fallacies
- Appeal to authority: Minimal - Sebastian's expertise is relevant and well-established
- False dichotomy: None identified - multiple testing approaches acknowledged
#### Tone of voice
- Overall tone: Collaborative and educational, with appropriate technical depth and personal anecdotes
### ๐ก๏ธ DARVO Analysis
- Deny: No problematic denials identified
- Attack: No attacks on individuals or groups
- Reverse victim/offender: Not applicable to technical content
- Emotional cues and rhetoric: Positive, encouraging tone throughout
## ๐ฏ Conclusion
Sebastian Bergmann's conversation reveals how personal development needs can drive ecosystem-wide innovation. PHPUnit's evolution from solving individual testing challenges to enabling visual
---
## Full Transcript
[00:06] Hey,<br>[00:21] hey, hey.<br>[00:25] Heat. Heat. N.<br>[00:43] Hey,<br>[01:01] hey, hey.<br>[01:03] Heat. Heat.<br>[01:27] Heat. Heat.<br>[02:00] Heat. Heat.<br>[02:25] Heat. Heat.<br>[02:57] Do you lie awake at night? Are you<br>[03:01] afraid to turn out the lights? Is there<br>[03:03] something you're scared of?<br>[03:08] What's there out in the dark? Make sure<br>[03:11] to keep all your windows locked. Do you<br>[03:14] do you surrender?<br>[03:17] You try to try to stay away these walls.<br>[03:21] You can't escape.<br>[03:23] Here's one for the lonely hearts. For<br>[03:26] the ones that fear the dark, you better<br>[03:28] run out. Run out of here. Bet you can't<br>[03:31] look the other way. Here's one for the<br>[03:35] broken road. That's the only one you<br>[03:38] know. You better run out. Run out. Truth<br>[03:40] or dare. Get me out. Take me anywhere<br>[03:43] but here.<br>[03:48] Anywhere but here<br>[03:56] to come. Waiting for<br>[04:09] Do you lie awake at night? Are you<br>[04:12] afraid to turn out the lights? Is there<br>[04:15] something you're scared of?<br>[04:19] What's there in the dark? Make sure to<br>[04:23] keep all your windows.<br>[04:51] Hello and welcome to PHP Alive and<br>[04:54] Kicking. Uh, this is episode and I don't<br>[04:57] know what the number is now.<br>[04:59] >> 25.<br>[05:00] >> 25. Thank you. There you go. Great<br>[05:02] start.<br>[05:03] I'm Mike. My co-host is Chris.<br>[05:07] >> Hello.<br>[05:08] >> Uh, this podcast is brought to you by<br>[05:10] PHP Architect and made made better by<br>[05:14] our partners at PHP score. Uh, more<br>[05:17] about them later if I can put my teeth<br>[05:19] in and I can speak. I do have a side<br>[05:22] defense. I'm just getting over a really<br>[05:24] nasty cold. So, I'm still bunged up and<br>[05:27] still can't talk. Apparently,<br>[05:30] we explore the de developments in PHP<br>[05:33] and what it's like to earn a living in<br>[05:34] PHP today. Uh, this is a live recording.<br>[05:39] So, if you are in our Discord channel,<br>[05:42] which we will bring up now.<br>[05:45] >> Hold on.<br>[05:46] >> There you go. If you're in our Discord<br>[05:48] channel, you can join in. uh post<br>[05:51] questions for our guests. Um the the uh<br>[05:55] Discord isn't just for uh when we're on<br>[05:57] live. You can hang out in there all week<br>[05:59] long. There's all sorts of<br>[06:00] conversations. There's quite an<br>[06:01] interesting conversation just before we<br>[06:03] we went uh live uh going on in there. So<br>[06:07] do join us. There's all sorts of cool<br>[06:09] people uh in there. And<br>[06:12] that is the Discord channel. Sorry, I'm<br>[06:15] losing my complete train of thought<br>[06:17] here. Um YouTube, if you're watching<br>[06:18] this on YouTube, please like and<br>[06:20] subscribe. Um uh we also run a monthly<br>[06:24] magazine for all around uh PHP and other<br>[06:28] tech. Uh we do have a code for all our<br>[06:31] listeners to get the first three months<br>[06:35] three of a year's digital subscription<br>[06:38] and that is a live three. So, head over<br>[06:40] to our website and use that code uh to<br>[06:43] to get those first three um episodes for<br>[06:47] free. Uh alongside our development work<br>[06:50] and our magazine, we also run PHP Tech<br>[06:54] every year in it's in Chicago this year.<br>[06:56] Not long now.<br>[06:58] >> It's uh it's it's catching up. It's it's<br>[07:00] not far off now. Um so, yeah, that<br>[07:03] that's that's going to be happening.<br>[07:04] Alongside PHP Tech, we've actually<br>[07:06] running for the first time JStech, which<br>[07:10] is a uh conference dedicated to<br>[07:14] JavaScript that'll be running alongside<br>[07:16] PHP tech in the same hotel rooms<br>[07:19] adjacent. So yes, we are mixing PHP<br>[07:21] developers with JavaScript developers.<br>[07:24] What could go wrong?<br>[07:25] >> Everything. Um not only that, we we are<br>[07:28] also if you subscribe to one, you get to<br>[07:30] go to the other one too.<br>[07:32] >> That is true. That is true. We're not<br>[07:34] holding tickets at the door.<br>[07:37] >> Uh we've also also got a swag store<br>[07:40] which you can head over. There's pretty<br>[07:42] some cool stuff over there. T-shirts,<br>[07:45] caps, and cups and things. That is<br>[07:47] store.phparch.com.<br>[07:50] Uh so head over and check out what we've<br>[07:52] we've got over over there for<br>[07:54] >> So if you put in the order for the<br>[07:56] t-shirt that we won yet.<br>[07:57] >> Nope.<br>[07:58] >> Nor<br>[08:00] still haven't done yet. One day, one day<br>[08:03] I'll remember to do it. The the only<br>[08:05] time I remember about it is when we're<br>[08:06] on the show and I can't really order it<br>[08:08] while we're on the show. Um so yeah, um<br>[08:11] we will do soon. Um right, enough of us<br>[08:13] rambling because they don't these people<br>[08:15] don't really come to watch us ramble on<br>[08:17] about rubbish, do they?<br>[08:20] >> No.<br>[08:20] >> No. Um we bumped into someone. We went<br>[08:23] to uh uh PHP UK a couple of weeks ago.<br>[08:27] Had an absolute blast. um met loads of<br>[08:29] people and uh today's guest is one of<br>[08:32] the speakers who has kindly agreed to<br>[08:35] come on and somehow navigate us through<br>[08:38] all the nonsense that we get up to on<br>[08:39] this show. We might actually have a<br>[08:41] steady ship this time.<br>[08:43] >> I mean, it's possible.<br>[08:46] >> So, who have we who have we got?<br>[08:49] >> So, we have the wonderful Sebastian<br>[08:53] Bergman. Hello.<br>[08:55] >> Hello, Sebastian.<br>[08:56] >> Hello.<br>[08:59] Now, now I have a question. Why have the<br>[09:01] names come back?<br>[09:04] Hang on.<br>[09:06] You see that is because whoever develops<br>[09:09] this app that we use to do this live<br>[09:12] stream and recording they hear heard us<br>[09:15] before we went live<br>[09:19] >> their products mentioning that they<br>[09:21] probably don't test their product<br>[09:23] because of all the bugs that that we<br>[09:25] noticed just in the last 10 15 minutes.<br>[09:29] >> Yep. and be they listened in on us<br>[09:32] violating our privacy and went along and<br>[09:35] fixed those bugs.<br>[09:37] >> There we go.<br>[09:38] >> There's one case<br>[09:40] possible explanation that makes sense.<br>[09:44] >> So, it's probably one that doesn't make<br>[09:46] sense, but<br>[09:48] >> anything's possible.<br>[09:52] >> Oh, only we knew someone that could that<br>[09:54] knows a lot about<br>[09:56] >> Yeah.<br>[09:57] >> Yeah. Let me know if you find one. I've<br>[09:58] I've been trying to figure out this<br>[10:00] testing thing for 26 27 years now.<br>[10:04] >> I mean, there's this one thing I use<br>[10:06] called PHP unit. Seems pretty good. It's<br>[10:09] >> pretty stable, good at testing.<br>[10:13] >> So, for anybody that doesn't know,<br>[10:15] Sebastian actually wrote PHPUnit.<br>[10:19] So, Sebastian, we always start with the<br>[10:21] same question to everybody we bring on<br>[10:23] for the first time.<br>[10:25] >> How did you get into PHP?<br>[10:28] How did I get into PHP? Um,<br>[10:32] yes, that was a<br>[10:35] that was a long time ago. Let's start<br>[10:37] there. Um, that was in 1998.<br>[10:44] Um, and to give you a perspective, where<br>[10:47] was little Sebastian<br>[10:50] in his life at that time? Um, it was the<br>[10:54] time for me between I had just finished<br>[10:57] my military replacement service, the<br>[11:00] so-called civil service in in Germany.<br>[11:02] Back then, we still had the draft. So<br>[11:05] you either had to go to the military um<br>[11:07] for about a year and as an alternative<br>[11:10] for a little bit longer do civil<br>[11:12] replacement service and I worked at a<br>[11:14] hospital. And after that concluded and<br>[11:18] university started for me, I had a<br>[11:22] couple of months of time and I decided<br>[11:24] to do an internship at a computer<br>[11:27] science research institute.<br>[11:32] and just because I thought that this<br>[11:34] would be a brilliant use of the time and<br>[11:37] I would could learn something and<br>[11:38] whatever. But I arrived there on on the<br>[11:41] first day the person responsible for me<br>[11:44] went on a three month research trip<br>[11:47] somewhere else and I was on my own<br>[11:51] and had basically nothing to do. So<br>[11:55] fortunate timing that I was contacted<br>[11:58] then by someone I knew from the Omega<br>[12:04] demo scene. So I grew up learning<br>[12:08] programming on on the Omega.<br>[12:10] Got an Omega 500 in 1990 and an Omega<br>[12:13] 1200 not so much later basically when<br>[12:16] that machine came out. And I was always<br>[12:19] fascinated by the intros, the cracks and<br>[12:22] the demos that people did on those um<br>[12:25] machines. And I wanted to be able to do<br>[12:27] that myself. So I dabbled a bit in that<br>[12:30] and got to know a couple of people who<br>[12:33] were a lot better at that than me. So I<br>[12:38] quickly stopped doing that. But what I<br>[12:42] found out that I was really good at was<br>[12:45] writing software<br>[12:47] as extensions for mailbox software,<br>[12:50] bulletin board system software that was<br>[12:52] used by all the I mean it's so long in<br>[12:57] the past that I'm allowed to that I'm<br>[12:59] comfortable enough saying that but but<br>[13:01] by all the bulletin boards where the<br>[13:03] amigga cracked games were traded<br>[13:06] basically all of them were using the<br>[13:08] same bulletin board system software And<br>[13:10] most of them used software that I wrote<br>[13:12] to extend that. And then at that time<br>[13:15] when I was doing the internship and I<br>[13:17] was bored. Um someone contacted me and<br>[13:20] said um hey I used to be a graphics<br>[13:22] artist on the amigga and you did some<br>[13:24] coding and to me as someone who is not<br>[13:28] into programming all programming is the<br>[13:30] same and I'm now doing internet<br>[13:34] whatever that may mean right I'm doing<br>[13:36] internet. So what he meant was he was<br>[13:38] doing front page and Photoshop and doing<br>[13:42] websites um for his clients and that was<br>[13:45] good enough for a while like the skills<br>[13:48] that he had as an artist for doing that<br>[13:51] but then came the moment when he needed<br>[13:54] something that happened with business<br>[13:55] logic on the server and he was not the<br>[13:58] right person for that. So he reached out<br>[14:00] to me because for him that is exactly<br>[14:04] the same thing as doing extensions for<br>[14:08] mailbox software on the Omega because<br>[14:09] one thing is programming, the other<br>[14:11] thing is programming, right?<br>[14:14] And<br>[14:16] I had no idea how to do serverside<br>[14:19] programming. So I asked what programming<br>[14:22] languages are are there for that? and he<br>[14:25] said, "Well, you have the choice between<br>[14:26] Pearl and PHP on the server." So, I<br>[14:30] tried my hands at Pearl for one or two<br>[14:33] hours and then stopped doing that<br>[14:36] because I I was not compatible with that<br>[14:39] language.<br>[14:41] I forgot the details but<br>[14:44] I tried PHP and was able to learn enough<br>[14:49] PHP in a weekend to build the<br>[14:52] application that he needed built for his<br>[14:55] customer<br>[14:57] and then I filed that away in my memory<br>[15:01] as okay this was nice interesting so<br>[15:03] this is how serverside programming works<br>[15:06] maybe maybe that will become relevant um<br>[15:09] data<br>[15:11] and I kept doing things like that and<br>[15:14] then subscribed to the mailing list,<br>[15:16] started asking questions, eventually<br>[15:18] started answering questions,<br>[15:21] started contributing to the PHP<br>[15:23] documentation, translating documentation<br>[15:25] from English to German, fixing small<br>[15:27] issues in the English documentation,<br>[15:29] found at some point a bug in PHP itself<br>[15:33] or something that annoyed me enough to<br>[15:36] look into um how PHP is implemented and<br>[15:40] I found oh this is implemented in C. I<br>[15:43] know C. So now I need to figure out how<br>[15:46] C and the language ecosystem around C,<br>[15:49] build systems, etc. work on Linux and<br>[15:53] fix the bug.<br>[15:57] And that was around the time that<br>[16:00] development started in earnest on PHP 5.<br>[16:07] And I by then I was at university and um<br>[16:12] learned about object-oriented<br>[16:13] programming and was part of a research<br>[16:18] group on on programming language design<br>[16:21] and started discussing ideas that I got<br>[16:24] with some people that were working more<br>[16:28] deeply on on PHP's core than I ever did<br>[16:32] and gave them ideas, discussed ideas and<br>[16:35] contributed to<br>[16:38] uh design of things like reflection API<br>[16:40] uh and other related things that I<br>[16:44] needed to implement PHP unit in the<br>[16:47] proper way.<br>[16:51] So you started on the second system I<br>[16:55] had which was the Omega 1200. The first<br>[16:58] one I had was the ZX Spectrum 48K.<br>[17:02] >> Mhm. and me and my dad literally sat in<br>[17:04] the kitchen and solded that one<br>[17:05] together. That that's how old computing<br>[17:07] was for me. And it turns out that I<br>[17:10] think 30 years ago in 1995 we were at<br>[17:14] the same conference to do with Omega<br>[17:18] >> could be<br>[17:21] which I mean that that's small world.<br>[17:24] Two people from two different countries<br>[17:26] start in the same way and end up in the<br>[17:28] same language.<br>[17:31] So<br>[17:32] >> there I mean I I remember being um a<br>[17:36] teenager and I remember having the<br>[17:37] AmIGGA as a teenager and right my first<br>[17:40] experience of coding. Now I can't<br>[17:42] remember if it was on the MIG whether it<br>[17:44] was on something at school. Um but I I<br>[17:47] wrote a a really simple math test for<br>[17:50] the amigga which had about five<br>[17:52] questions. It just sort of pinged if<br>[17:54] you're right or g or made another sound<br>[17:56] if you're wrong and then showed the<br>[17:58] correct answer. Um, but for me<br>[18:01] unfortunately I didn't realize I don't I<br>[18:05] don't really remember but I because I'm<br>[18:07] dyslexic a lot of people were telling me<br>[18:08] that I need to go into sort of a more of<br>[18:10] a labor type of job um building work and<br>[18:14] things like that. So I left computers<br>[18:18] behind but I've come back to them<br>[18:21] eventually and again yeah found PHP and<br>[18:24] um bit like yourself I I tried PHP and<br>[18:28] realized it was just really easy to<br>[18:30] learn quite quickly.<br>[18:32] >> Yeah heard<br>[18:33] >> Sarah in Discord we all know Sarah says<br>[18:36] Sebastian on Pearl. I was not compatible<br>[18:39] with that language. I mean, honestly, I<br>[18:42] don't think many people are these days<br>[18:44] compatible with Pearl. It's it's one of<br>[18:46] those languages that I just don't get.<br>[18:49] It just doesn't sit in the way that PHP<br>[18:53] does and<br>[18:54] >> JavaScript is totally different<br>[18:56] paradigm.<br>[19:00] So that that path sort of led you to PHP<br>[19:04] unit and writing PHP unit.<br>[19:07] Yeah, because I because I I started<br>[19:10] writing more and more software in PHP<br>[19:13] and soon realized I want to be able to<br>[19:22] funny thought test the software that I<br>[19:25] built and and ensure that it actually<br>[19:27] does what it is supposed to be doing<br>[19:30] because I was very fortunate to have a<br>[19:32] professor at university<br>[19:35] um who really early on because he was um<br>[19:40] he he knew Eric Gama and Kent Beck and<br>[19:42] others who were who created JUnit like<br>[19:47] the two of them and made it popular and<br>[19:52] we at university started really early on<br>[19:55] using that and I I found it in this an<br>[19:58] interesting concept of<br>[20:02] it's part of my responsibility as a<br>[20:04] developer Not only to write the software<br>[20:07] that actually runs whatever it is<br>[20:10] supposed to run, but also write the<br>[20:14] tests that verify that the software does<br>[20:16] what it is supposed to be doing and not<br>[20:18] delegate that um to to somebody else.<br>[20:22] And I found that fascinating. And for I<br>[20:26] I I I searched for<br>[20:30] a solution for that in PHP because to me<br>[20:32] by that point it was clear like I PHP is<br>[20:35] a language that I enjoy working with uh<br>[20:39] and that is very well suited for the<br>[20:42] kind of things that I needed to do and<br>[20:45] wanted to uh to do. So I wanted to have<br>[20:47] a test framework like JUnit for that.<br>[20:50] And clearly I cannot be the first person<br>[20:54] on the planet wanting that. So somebody<br>[20:57] must have already built that, right? Um<br>[21:00] so I started searching for that.<br>[21:03] And<br>[21:05] this was a time when version control or<br>[21:10] the predominant version control system<br>[21:12] was CVS<br>[21:15] and the opensource code hosting platform<br>[21:19] was SourceForge.<br>[21:21] Before it was a place for for malware<br>[21:25] and ads and whatever it has become since<br>[21:28] then.<br>[21:29] So on source forge there was a project<br>[21:32] named PHPUnit<br>[21:35] and for a couple of minutes I was was<br>[21:37] happy yes somebody has built that and<br>[21:39] then I tried using it and I could not<br>[21:43] get it to work.<br>[21:45] I mean it's still there because projects<br>[21:48] are never deleted on SourceForge, right?<br>[21:50] But um I I I tried contacting the author<br>[21:54] but never got a reply and then<br>[21:56] eventually I started<br>[21:58] building what later became PHPUnit. But<br>[22:02] for about a year, I did not want to<br>[22:07] share that with the world because I was<br>[22:08] still hoping that somebody else who is<br>[22:11] much better<br>[22:13] qualified than me to do that to create a<br>[22:16] project like that. And then at some time<br>[22:20] um it it became<br>[22:24] just too painful to not have the thing<br>[22:27] that I was using in my project as a real<br>[22:29] project that that is out there somewhere<br>[22:32] and others can use that can provide<br>[22:34] feedback and benefit from that. That's<br>[22:36] when<br>[22:38] because somebody gave me right access to<br>[22:41] cvs.php.net<br>[22:43] and allowed me to create new projects.<br>[22:45] So I just put it there because I<br>[22:47] couldn't put it on source forge.<br>[22:51] >> So So was that Sarah? Can we blame Sarah<br>[22:53] for that?<br>[22:55] >> You know, you can blame Sarah for a lot<br>[22:57] of things, but I don't think that she<br>[23:00] used to blame for that.<br>[23:04] >> I mean, I'm only blaming her because<br>[23:06] she's talking about kids do weird [ย __ย ]<br>[23:08] and back when we were doing Pearl. And<br>[23:12] uh John our boss is also talking and<br>[23:14] there about how he started with web<br>[23:16] development with Pearl and he says I<br>[23:19] guess I was compatible and then points<br>[23:21] out the old database access. You didn't<br>[23:23] have field names back then. You just had<br>[23:25] to know that data zero was the ID.<br>[23:28] Yes,<br>[23:30] I I've worked on projects like that.<br>[23:37] Well, on that note, I'm think we'll just<br>[23:39] hear from our our sponsors and have a a<br>[23:41] quick break. So, we'll be back in just a<br>[23:44] moment.<br>[23:48] Thank you to our partners at<br>[23:49] phpscore.com.<br>[23:51] Every app builds up technical debt over<br>[23:53] time. It's the price we pay for shipping<br>[23:55] new features and moving fast. When we<br>[23:58] build up too much of it, though, it can<br>[24:00] start to impact how we work. Team<br>[24:02] velocity suffers, bugs become more<br>[24:04] frequent and take longer to fix, and<br>[24:06] everyone starts to get a little<br>[24:07] frustrated. The key to managing debt is<br>[24:10] to measure it. A credit score can help<br>[24:13] you understand how well you're managing<br>[24:14] your financial debt. And now there's a<br>[24:17] credit score for your technical debt. Go<br>[24:19] to phpsscore.com to get a free technical<br>[24:22] debt score and monitoring for all of<br>[24:24] your PHP applications today.<br>[24:30] >> Thank you. PHP score.<br>[24:34] >> I think this was quite<br>[24:36] >> Yes.<br>[24:38] Yes. I I also want the answer to the<br>[24:41] other one.<br>[24:45] >> Yeah, I think so too. I I don't predate<br>[24:48] her as in the meaning of being on the<br>[24:52] face of this planet but I think I<br>[24:57] as far as the PHP project is concerned I<br>[25:00] think I was involved before that. Yes,<br>[25:02] for whatever that that matters I I I<br>[25:05] don't think it does.<br>[25:11] So Sebastian to PHP UK you were talking<br>[25:14] about a concept that to me was literally<br>[25:17] mind-blowing the idea of unit testing<br>[25:21] event sourced or eventtormed<br>[25:24] applications<br>[25:26] which I went on and implicated on a app<br>[25:29] that I'm building and loved it.<br>[25:32] >> Firstly you've got an article about that<br>[25:35] haven't you?<br>[25:37] >> I didn't catch the last part. You've got<br>[25:39] an article about that on your blog,<br>[25:41] haven't you?<br>[25:42] >> Yes, I have an article about that on my<br>[25:44] blog. So that that's something that I<br>[25:47] try to do for a while now that when I<br>[25:49] give a presentation for the first time<br>[25:51] like I did now with um from events to<br>[25:55] insights at the PHP UK conference that I<br>[25:58] have an article ready on my blog when I<br>[26:03] give the presentation for the first time<br>[26:04] so that I can um point uh people to that<br>[26:09] article. Sorry Sarah, you somehow asked<br>[26:12] for that.<br>[26:17] Um, yes,<br>[26:21] >> I'm currently looking for that article.<br>[26:24] I shall find it in a moment and make<br>[26:25] sure it goes out of the show notes. um<br>[26:28] the the concept that you were presenting<br>[26:30] of the idea of being able to do given<br>[26:33] when then when then<br>[26:34] >> directly in PHP unit tests<br>[26:39] explain the mechanism behind that and<br>[26:42] how that's actually coming from PHP unit<br>[26:44] because I think that was the important<br>[26:46] part drawing it from the from the<br>[26:48] additional data.<br>[26:51] So I'd like to take a step back for a<br>[26:56] moment and<br>[26:58] very briefly introduce the concept of or<br>[27:01] talk about the concept of eventdriven or<br>[27:04] event sourced systems.<br>[27:06] And that is a way of building systems<br>[27:11] where the where the source of truth is<br>[27:14] not<br>[27:15] a typical relational data model. a<br>[27:19] typical CRUD data structure that you<br>[27:22] have that only represents the current<br>[27:24] state of your world and you do not know<br>[27:27] how you got to the current state, but<br>[27:30] instead you keep a record of everything<br>[27:33] that is relevant to your domain as it<br>[27:38] happens as an immutable event.<br>[27:42] And the hello world example of that is<br>[27:45] that of a bank account which is at some<br>[27:47] point in time opened and then<br>[27:50] transactions are happening. Money is<br>[27:52] deposited, money is transferred, money<br>[27:54] is withdrawn and for every thing that<br>[27:58] happens which is an event. you record<br>[28:00] that event and then on the one hand you<br>[28:05] have uh an audit trail out of the box<br>[28:08] and for free because you can just look<br>[28:10] at this event stream this record of of<br>[28:12] events that have happened and see what<br>[28:15] has happened when and why.<br>[28:18] And you can reconstruct the current<br>[28:21] state of a bank account for example just<br>[28:25] by looking at those events<br>[28:28] and not only show this is the current<br>[28:30] balance but this is how we got to the<br>[28:32] current balance.<br>[28:36] And now like and I I came across that<br>[28:41] way of building<br>[28:43] software over 10 years ago or over 15<br>[28:46] years ago by now like like a long time<br>[28:49] ago. And when I first came across that<br>[28:56] I I realized hey this is this really<br>[28:59] helps to think about a system and it<br>[29:01] this is very elegant and it helps solve<br>[29:04] a lot of problems<br>[29:09] but in my mind immediately I had this<br>[29:12] big problem but how in the world am I<br>[29:15] going to test a system like that because<br>[29:17] this must be a lot more complicated and<br>[29:20] complex and tedious and cumbersome and<br>[29:24] insert your favorite adjective here<br>[29:28] until I realized that actually the<br>[29:30] opposite is the truth because it makes<br>[29:35] at least for me<br>[29:37] testing<br>[29:39] a lot easier<br>[29:43] because instead of oh how do I prepare<br>[29:47] my crutch<br>[29:49] style<br>[29:50] database, how do I bring it into a state<br>[29:53] that I can run my test and how do I<br>[29:55] clean it up afterwards and how do I<br>[29:58] figure out by looking at the database<br>[30:01] whether or not what I want to happen has<br>[30:03] happened. I can express my intent in my<br>[30:08] test<br>[30:10] in a readable, maintainable and straight<br>[30:13] straightforward<br>[30:15] manner that is aligned with the rest of<br>[30:18] my architecture and design of my<br>[30:20] application.<br>[30:22] And this is where the given when then<br>[30:26] metaphor comes into play that that that<br>[30:28] you mentioned earlier. I can just say<br>[30:31] okay in the context of this test for<br>[30:33] whatever it is that that I currently<br>[30:34] want to test given that these<br>[30:38] events have happened in the past when I<br>[30:42] perform this command when I execute this<br>[30:45] action whatever you want to call it then<br>[30:48] I expect that these other events have<br>[30:51] now been recorded<br>[30:54] and then you can abstract that away<br>[30:56] extend the test framework in this case,<br>[31:00] PHP unit, adapt it to<br>[31:04] your project and to your framework or<br>[31:08] whatever you want to call it, how you<br>[31:11] interact with events<br>[31:13] and have<br>[31:16] the language from your tests where you<br>[31:18] call the three methods given when then<br>[31:22] translate that<br>[31:25] into the relevant code that needs to be<br>[31:27] run underneath the test to make the test<br>[31:30] possible.<br>[31:32] And depending on the context and scope<br>[31:36] of your test, like for example, if you<br>[31:39] are in a unit test, you do not want to<br>[31:42] use a real event store. You do not want<br>[31:44] to use a real persistence layer. The<br>[31:47] same given when then calls are there<br>[31:50] translated into the creation of test<br>[31:53] stops and mock objects to simulate the<br>[31:56] event system.<br>[31:58] But you can reuse the same test code<br>[32:03] in a different context and have the<br>[32:07] given when then calls there be<br>[32:10] translated into for an integration test<br>[32:14] or an end to end test into code that<br>[32:18] creates a real event store uses the real<br>[32:21] event system and and and things like<br>[32:23] that.<br>[32:26] >> Yeah. and that that whole process does<br>[32:30] make the tests literally the contract<br>[32:33] that they're supposed to be in the first<br>[32:35] place.<br>[32:38] Um, we currently have Derek in the<br>[32:41] comments asking when he's coming on and<br>[32:42] we're trying to arrange a podcast with<br>[32:44] Derek at the same time as talking to Sp.<br>[32:46] >> Yeah, the chat is a bit confusing. I try<br>[32:49] to focus on your faces but then I see<br>[32:52] the chat messages come up. that that is<br>[32:56] and I I decree that we that we use<br>[33:01] Sarah's suggestion and um make<br>[33:05] uh and call the call it the BS time the<br>[33:08] before Sarah time.<br>[33:10] >> Yep.<br>[33:11] >> Just for for fun.<br>[33:15] >> Yeah.<br>[33:16] >> Why not? Why not?<br>[33:22] Uh Sarah is definitely not available<br>[33:24] next Tuesday. Um<br>[33:27] I mean we<br>[33:27] >> That's right. S Sarah, we weren't asking<br>[33:29] you to come on the show again. We've had<br>[33:31] you twice.<br>[33:31] >> No,<br>[33:33] we haven't recovered from the last<br>[33:34] chaos. Um<br>[33:36] >> so this time system also translates<br>[33:40] uh to this podcast as a BS before Sarah<br>[33:44] came on the podcast and after Sarah came<br>[33:46] on the podcast.<br>[33:46] >> Well, there is before because she was<br>[33:49] our first guest.<br>[33:50] >> Okay.<br>[33:51] There is technically one episode before<br>[33:53] Sarah, but that's just me and Mike<br>[33:55] giving our stories<br>[33:59] coming of Sarah on the podcast and after<br>[34:02] she<br>[34:03] >> Yeah. Yeah. She's she's she she was the<br>[34:05] first one of this year.<br>[34:06] >> Okay.<br>[34:06] >> Yes.<br>[34:07] >> She she brought us<br>[34:13] So<br>[34:16] Sarah says we read<br>[34:21] Um,<br>[34:23] >> yeah. Well,<br>[34:23] >> so yes, the<br>[34:25] >> you're a big you can do it.<br>[34:28] >> I mean, we did introduce her as the<br>[34:29] loudest voice in PHP. Um, so<br>[34:34] the way that those tests read once<br>[34:36] you've established that, it literally<br>[34:38] gives you the contract of what your what<br>[34:41] your application goes on.<br>[34:44] Um, and by being able to write like<br>[34:48] that, it makes it so easy to then see<br>[34:50] from the PHP doc output exactly what<br>[34:53] went on. And that that concept makes it<br>[34:58] so easy to then just pass that to<br>[35:00] customers, the next person that needs to<br>[35:02] see it and go,<br>[35:03] >> is this what we intended?<br>[35:07] >> The short answer to that would be yes.<br>[35:10] The slightly longer answer would be it<br>[35:14] was a journey.<br>[35:16] >> So my journey started with I want to be<br>[35:20] able to have a have test code that is<br>[35:26] readable, understandable to the people<br>[35:29] working on the tests on the code of such<br>[35:32] a system.<br>[35:36] And then<br>[35:40] the more I was getting into collabor<br>[35:43] collaborative modeling techniques like<br>[35:46] event storming um and things like that,<br>[35:50] I want to get a visual documentation out<br>[35:55] of running the tests that goes full<br>[35:59] circles um to if you will the input of<br>[36:04] the the actual writing of code which is<br>[36:09] a lot of sticky notes on the wall<br>[36:11] >> that are colorcoded and then you have<br>[36:14] orange stickies which are events and<br>[36:16] then you have diff green stickies for<br>[36:18] for read models and things like that and<br>[36:22] I wanted to get in that visual language<br>[36:26] documentation that is generated from<br>[36:31] running the tests. So<br>[36:35] this is what I built as an extension for<br>[36:38] PHP unit that is project specific for<br>[36:40] the example project that I used in my<br>[36:44] presentation and that that I use in the<br>[36:46] article. So this is not something that<br>[36:50] is a generic<br>[36:53] extension for PHPUnit that you can just<br>[36:55] install and and use in your project.<br>[36:59] Um<br>[37:01] but it shows the idea and I I think it's<br>[37:04] easy to adapt what I have published um<br>[37:07] in this example project two specific<br>[37:10] projects. I think it's harder<br>[37:15] to turn that into something that is<br>[37:18] generic enough that it would be useful<br>[37:22] to distribute as an open source project.<br>[37:26] Right. And<br>[37:28] So the idea is I can do uh a<br>[37:32] collaborative modeling session like<br>[37:34] eventtorming get a lot of stickies get<br>[37:37] an shared understanding of all the<br>[37:40] stakeholders of what is supposed to be<br>[37:42] built.<br>[37:44] Use that as input for the development.<br>[37:48] write my tests in such a fashion that I<br>[37:50] get visual documentation that uses that<br>[37:52] visual language as output from running<br>[37:55] the tests that I can then compare to my<br>[38:01] photos of um the event storming wall to<br>[38:05] figure out did I actually build what I<br>[38:07] was supposed to be building like that<br>[38:09] that is one way that can be used but it<br>[38:11] can also be used to quickly show someone<br>[38:15] hey for this command these These are the<br>[38:18] tests that I have. Um this is the visual<br>[38:20] documentation. Does this match um what<br>[38:22] what you have in mind? Yes or no? Where<br>[38:25] do we need to iterate?<br>[38:28] And of course, if you collect all of<br>[38:30] that data from all the tests that you<br>[38:34] run,<br>[38:36] you get um you get a map of your<br>[38:40] software system through the lens of<br>[38:43] events and you see these are all the<br>[38:46] events in my system.<br>[38:48] This event is emitted here and it is<br>[38:52] consumed here, here and here. And this<br>[38:56] is a really helpful<br>[39:00] source of information for developers<br>[39:02] that want to that that need to work on<br>[39:04] the software and need to change<br>[39:05] something because this gives them the<br>[39:07] canonical source of truth which parts of<br>[39:12] the system are affected when I make a<br>[39:15] change over here<br>[39:18] like I change how that event is emitted<br>[39:21] or how that event looks like or<br>[39:24] whatever.<br>[39:25] which other parts of the system do I<br>[39:27] need to keep in mind when I make a<br>[39:29] change there? And that is really<br>[39:31] helpful.<br>[39:33] >> Yeah. And that that map that it produces<br>[39:36] is literally by the time you've done the<br>[39:38] whole app. So easy to refer back to and<br>[39:42] just go there. That's what it is. And it<br>[39:45] just flows straight through. I mean,<br>[39:47] when I when I put it in on the app that<br>[39:48] I've been working on it, at the moment,<br>[39:50] it's going only got about 50 events, but<br>[39:53] those 50 events are interlaced around<br>[39:56] like 20 or 30 different places. And<br>[40:00] seeing that map also gave me the<br>[40:02] opportunity to go, do you know what?<br>[40:04] This is doing more than it should for<br>[40:05] each event. Let's make two events out of<br>[40:07] it. And you could see an easier pathway.<br>[40:11] And just by having that visual output<br>[40:13] made it so easy to understand the whole<br>[40:15] pro process<br>[40:17] and the fact that you can even get that<br>[40:20] at a PHP unit is impressive<br>[40:24] and I I don't know of another framework<br>[40:27] that can do that. I know there probably<br>[40:29] is but I don't know of one in other<br>[40:31] languages that you can actually use that<br>[40:32] information to produce that. I would say<br>[40:35] that this is possible in every<br>[40:39] test framework because every test<br>[40:42] framework that I know no matter which<br>[40:44] programming language it is for you write<br>[40:47] the tests in that language<br>[40:51] and you can do anything you want in that<br>[40:53] code that you have in your tests. Now<br>[40:56] whether or not that is clean and elegant<br>[41:00] and and actually usable and maintainable<br>[41:03] that may be a different story.<br>[41:05] But I what we talk about here right now<br>[41:10] is one of the things that I had in mind<br>[41:13] when we<br>[41:15] um implemented the event system for<br>[41:18] PHPUnit itself which we introduced in<br>[41:20] PHPUnit 10.<br>[41:22] >> Mhm. which um completely changed all the<br>[41:27] code inside of PHPUnit that is<br>[41:32] responsible for output. Be it output<br>[41:35] that you see on the console when PHPUnit<br>[41:38] is running to report progress to pro uh<br>[41:40] report results, report failures and so<br>[41:44] on or be it output in the form of log<br>[41:48] files.<br>[41:50] All of that is now based on event system<br>[41:55] and the event system in PHPUnit that is<br>[41:59] read only. So nothing is controlled<br>[42:03] through the events.<br>[42:06] PHPUnit just emits an event every for<br>[42:09] everything that is relevant in the<br>[42:11] context of running tests. There are<br>[42:14] about<br>[42:16] I have no idea how many events there<br>[42:18] are. dozens like for anything that is<br>[42:20] meaningful. The execution of a test<br>[42:22] started the execution of a test stopped.<br>[42:24] Exe PHPUnit as a whole started. PHPUnit<br>[42:27] as a whole has stopped. Um a test stop<br>[42:30] was created. A mock object was created.<br>[42:34] Whatever you name it, we have an event<br>[42:36] for it.<br>[42:38] Um and PHPUnit itself<br>[42:42] subscribes to the events that are<br>[42:45] relevant to create for instance the<br>[42:47] output on the console.<br>[42:50] But you can write extensions for PHP<br>[42:54] unit subscribe to these events and if<br>[42:58] you want completely change<br>[43:02] the output that you get from PHPUnit.<br>[43:05] This is for example what<br>[43:09] extensions for PHPUnit like pest do.<br>[43:13] >> Mhm.<br>[43:14] >> Yeah. Pest is an extension for the<br>[43:16] phpunit testr runner among other things.<br>[43:19] It also extends PHP unit in other ways.<br>[43:22] But part of pest is a piece of code that<br>[43:27] subscribes to events to produce its<br>[43:31] output because they want different<br>[43:33] output than what PHPUnit produces out of<br>[43:36] the box. And such an extension can tell<br>[43:38] PHPUnit,<br>[43:41] I take over control of the output.<br>[43:44] Please do not produce any output. only I<br>[43:47] will produce output<br>[43:50] and that's what they do.<br>[43:53] Alternatively, and this is what the<br>[43:55] extension does that I showed in my<br>[43:57] presentation in London is that you can<br>[44:00] write an extension that subscribes to<br>[44:02] some events and does not produce output<br>[44:06] by printing to the console but by<br>[44:09] generating a file in a directory.<br>[44:12] Mhm.<br>[44:13] >> In the case of that extension, that is a<br>[44:16] bunch of PDF files<br>[44:18] with the visual documentation.<br>[44:20] >> Yeah.<br>[44:24] >> So when I uh when I implemented it, I<br>[44:27] slightly changed the extension that you<br>[44:29] were doing so that it was outputting<br>[44:30] mermaid directly as MDs<br>[44:33] >> because then they're commitable and you<br>[44:36] can see them in GitHub. But the<br>[44:38] principle just gives you so many avenues<br>[44:41] to go from there. And uh I've been<br>[44:43] toying with the idea of how could you<br>[44:45] take the concept to non-event sourced<br>[44:48] apps and looking at how does that work?<br>[44:51] Could you use PHP units testing to give<br>[44:53] you a map of an application that isn't<br>[44:56] event sourced? And the answer appears to<br>[44:59] be yes. It's it's a bit messy at the<br>[45:02] moment to try and get it to work because<br>[45:04] you're reliant on good clean<br>[45:06] segregation,<br>[45:08] >> but in theory it's possible. And it's<br>[45:11] it's quite an interesting concept to<br>[45:12] look at going from just text on a screen<br>[45:15] that says yes or no, it passed<br>[45:18] >> to a documentation that's alive that<br>[45:21] tells you how the app performs and how<br>[45:25] does it do its job. And it's it's almost<br>[45:29] like testing is a good thing. It's<br>[45:32] >> Yeah, we might be on to something there.<br>[45:34] >> Mhm.<br>[45:36] >> But before we go to the next question, I<br>[45:37] just want to say anyone that is uh<br>[45:39] watching live, you can pop into Discord<br>[45:41] and put any questions to Sebastian. Um<br>[45:44] I'm sure be happy to answer anything<br>[45:46] that you put put in there.<br>[45:50] I mean, I'm sort sort of half half<br>[45:51] expecting Nuno to ask ask another<br>[45:53] extension for for pest in a minute.<br>[45:58] >> Nuno is in our Discord and does<br>[45:59] occasionally watch the podcast.<br>[46:01] >> Mhm.<br>[46:04] >> Um so, um I noted that uh um PHPUnit<br>[46:08] 13's just recently released.<br>[46:11] >> Yes.<br>[46:12] >> Um back in February, was it? I've noted<br>[46:14] down.<br>[46:15] >> First Friday of February.<br>[46:17] >> Yeah. And so, so what what's new? what's<br>[46:19] what's being brought to new to the table<br>[46:22] in there.<br>[46:25] >> I could be really<br>[46:27] w try to be witty and say the new thing<br>[46:31] about PHP unit 13 is that there is<br>[46:34] something new.<br>[46:36] But um unless you are familiar with um<br>[46:41] how PHP units major versions normally<br>[46:44] work that would not be funny. So let me<br>[46:48] explain. So usually<br>[46:52] um the first release of a new major<br>[46:55] version is rather boring as in there are<br>[46:59] no or only very few new features.<br>[47:04] Why is that? because the uh the O<br>[47:07] release which is always on the first<br>[47:09] Friday of February is the annual<br>[47:12] opportunity to<br>[47:16] get rid of technical debt, remove all<br>[47:19] the code for features that have been<br>[47:21] deprecated for quite a while. Clean up<br>[47:23] under the hood, bump the PHP version<br>[47:27] requirement, things like that. And<br>[47:30] this.0 release lays the foundation for<br>[47:33] feature development throughout the year.<br>[47:36] Um on the first Friday of April, June,<br>[47:39] August, October and December um are the<br>[47:43] feature releases and they usually are<br>[47:47] the ones that bring new features.<br>[47:50] This year it was a bit different<br>[47:53] because the 13.0 release has a couple of<br>[47:58] new features.<br>[48:02] nothing. Well, that's not true. There<br>[48:06] are there are some significant changes<br>[48:09] in there. Um, so for example, there are<br>[48:13] a couple of new eight to be exact<br>[48:16] assertions that deal with arrays<br>[48:19] comparing arrays for identity and<br>[48:22] equality<br>[48:24] from<br>[48:26] very very strict like the order of the<br>[48:29] elements matters, the key value<br>[48:32] relationship matters and the triple<br>[48:34] equal sign operator needs to be used all<br>[48:38] the way to the other other end of the<br>[48:40] spectrum where it's very loose. The<br>[48:43] order of the elements does not matter.<br>[48:46] The key value relationship does not<br>[48:48] matter. Basically, the keys do not<br>[48:50] matter. And we use a double equal sign<br>[48:53] operator to only compare for equality<br>[48:55] and not a type safe comparison.<br>[48:58] And if you multiply that out, you you<br>[49:01] arrive at eight different assertions.<br>[49:05] And they have been like some of them<br>[49:08] have been requested for quite a while.<br>[49:11] Like I I remember Jordi from from the<br>[49:13] composer project asking me about ones of<br>[49:17] those eight. I forgot which which one it<br>[49:19] was a couple of years ago and I never<br>[49:23] really got around to doing that. And<br>[49:25] then somebody else asked for for<br>[49:28] something else. And then I<br>[49:32] sat down with Jordi and Teo Fedri at um<br>[49:38] Symphony Con in Amsterdam last year<br>[49:41] and we discussed this for uh for a bit<br>[49:44] and then arrived at okay if we are going<br>[49:48] to do this then we need all eight of<br>[49:51] these and um because if we only<br>[49:54] implement one or two then people will<br>[49:56] complain and say hey this this is<br>[49:58] missing and why is this and not that? So<br>[50:01] we imple so I implemented all eight of<br>[50:03] them.<br>[50:07] >> I would say the major change or major<br>[50:10] addition improvement in 13 is two new<br>[50:16] parameter matchers when working with<br>[50:18] mock objects.<br>[50:20] So in the past, prior to PHPUnit 10, we<br>[50:23] had a parameter matcher that allowed you<br>[50:25] to say, okay,<br>[50:28] um I want this method or I expect this<br>[50:32] method to be called three times and the<br>[50:35] first time it needs to be called with<br>[50:36] these parameters, the second time with<br>[50:38] these parameters, the third time with<br>[50:40] these parameters.<br>[50:43] But the sequence was fixed and strict.<br>[50:47] >> Mhm. And sometimes the order in which<br>[50:52] these expected method calls happen<br>[50:55] is not relevant.<br>[50:58] And having then only the option of<br>[51:01] having this fixed order becomes a<br>[51:04] maintenance burden when you do a<br>[51:08] refactoring of the code you're testing<br>[51:10] and suddenly the events h or like like<br>[51:14] um method calls happen in the in a<br>[51:16] different order.<br>[51:19] uh and the test fails although it should<br>[51:21] not fail because the test is not<br>[51:24] interested at all in the order but it is<br>[51:26] because that's the only way the API<br>[51:28] supported it and that was one of many<br>[51:31] many many limitations and frustrations<br>[51:35] with the old API we had prior to PHP 10<br>[51:40] and the old API was unfixable<br>[51:45] without a backward compatibility break.<br>[51:48] And believe it or not, back then I<br>[51:51] arrived at the conclusion that the<br>[51:54] minimal amount of backward compatibility<br>[51:57] break would just be to delete this<br>[51:59] method because changing it like keeping<br>[52:03] it, fixing it and breaking backward<br>[52:06] compatibility would have been a lot<br>[52:09] harder with when when it comes to<br>[52:11] migration because<br>[52:13] it's it does not fail in obvious ways in<br>[52:17] certain certain situations and you would<br>[52:19] get false positives or false negatives<br>[52:22] and I could was not able to figure that<br>[52:25] out. Maybe I'm just too stupid. I don't<br>[52:27] know. But back then I did not have a<br>[52:29] solution.<br>[52:31] So I deleted it and put on the road map<br>[52:36] finding a replacement for that<br>[52:38] functionality but never got around to<br>[52:40] implementing that.<br>[52:43] And then at the end of last year, I was<br>[52:46] doing a training and one of the<br>[52:48] attendees of my training said,<br>[52:54] "Well, I'm missing this functionality<br>[52:56] here. I I I really want to test this,<br>[53:01] but I can't because this what this<br>[53:04] feature was removed and there is no<br>[53:06] replacement or I'm unable to find the<br>[53:09] replacement."<br>[53:11] um what gives please explain and then<br>[53:14] then I explained the situation and she<br>[53:17] said I understand<br>[53:19] I'll use this ugly workaround I found on<br>[53:22] stack overflow but I'm not happy with<br>[53:25] that<br>[53:26] and then a week after the training she<br>[53:29] sent me a pull request and said I think<br>[53:32] I have found a solution<br>[53:35] um and it was a solution and it is the<br>[53:39] solution that is now in 130 and this is<br>[53:42] un like I said coming back to what I<br>[53:44] said a couple of minute minutes ago this<br>[53:46] is unusual that PHP like O release has<br>[53:49] new features.<br>[53:50] >> Mhm.<br>[53:53] >> Because usually it's just clean up<br>[53:55] technical debt<br>[53:57] PHP version bump things like that.<br>[54:00] >> Okay.<br>[54:01] >> So the exciting thing about the 130 is<br>[54:04] that there was something exciting about<br>[54:06] it.<br>[54:08] Normally it's intended to be boring.<br>[54:13] >> Okay, I understand. Okay. Well, thank<br>[54:15] you for for going through through that.<br>[54:18] What have you got planned for this year?<br>[54:21] What sort of features coming into it<br>[54:23] over the next 12 months<br>[54:27] >> that you're allowed to say? way that you<br>[54:29] the way that you phrase the questions.<br>[54:31] What what what have I planned that<br>[54:35] that insinuates that I do have a plan?<br>[54:42] >> Um,<br>[54:43] >> okay. Is there anything that you know<br>[54:44] you're going to be putting in? So, I can<br>[54:47] tell you what I worked on over the last<br>[54:49] couple of days, which I definitely had<br>[54:52] not planned to do, but um I woke up one<br>[54:56] morning last week and thought screw it.<br>[55:00] I I've been annoyed and frustrated by<br>[55:03] this limitation for 10 plus years. So, I<br>[55:07] finally want to tackle that. And I got<br>[55:12] most what I wanted to accomplish done in<br>[55:15] about a day. And then I needed only two<br>[55:17] more days um to clean it up and make it<br>[55:20] actually work. Uh and by now you're<br>[55:23] wondering what the heck is he talking<br>[55:25] about. So I I rewrote the code that<br>[55:30] serializes code coverage information to<br>[55:33] a file, merges multiple of those files<br>[55:38] into a single code coverage file and<br>[55:41] then generates a report from that. while<br>[55:45] solving all the bugs that have<br>[55:47] accumulated in that area of of PHP unit<br>[55:52] code coverage functionality over the<br>[55:54] last 10 plus years.<br>[55:56] So there is a command line tool in<br>[55:59] addition to PHPUnit that is called PHP<br>[56:01] COV which can merge code conference<br>[56:06] information from multiple PHPUnit runs<br>[56:09] and this is useful in at least two<br>[56:12] scenarios.<br>[56:14] one, you have so many tests that you<br>[56:16] want to run them in parallel using um<br>[56:20] wrappers around PHPUnit like par test or<br>[56:23] parunit to just improve test um<br>[56:27] execution speed<br>[56:30] that works well.<br>[56:32] But when you want a single unified code<br>[56:36] coverage report for all your tests and<br>[56:38] you run the tests in parallel, you need<br>[56:40] to merge the code coverage information<br>[56:42] from all the runs into a single one.<br>[56:46] And<br>[56:49] that merging was not very robust because<br>[56:51] the serialized format that was used um<br>[56:55] was not very good.<br>[56:59] I hope it is a lot better now. I got<br>[57:01] really promising feedback from the<br>[57:03] maintainers of parunit and parest<br>[57:06] uh already and some feedback from some<br>[57:09] other people as well.<br>[57:12] And<br>[57:14] that might sound boring but it makes<br>[57:17] something as essential as code coverage<br>[57:21] reporting in certain<br>[57:24] scenarios finally robust and actually<br>[57:28] usable.<br>[57:29] Yeah. Another scenario where you need<br>[57:31] that is is if you have<br>[57:36] operating system specific code paths in<br>[57:39] your application.<br>[57:42] So for example you you are an open<br>[57:44] source project you need to support<br>[57:47] for whatever reason Windows. So you also<br>[57:50] run your tests on Windows but you have<br>[57:52] certain lines of code that are only run<br>[57:55] on Windows. Now when you run your tests<br>[57:57] on Linux, those lines of code are not<br>[58:00] run. So they are red in your code<br>[58:02] coverage report.<br>[58:04] If you run them on Windows, the lines<br>[58:07] will be green, but other lines that are<br>[58:09] specific to Linux will be red. So but if<br>[58:12] you want to see the full picture, you<br>[58:14] need to merge that into one.<br>[58:16] >> Or you have code that is specific to<br>[58:19] different database backends. Yeah, we<br>[58:22] have Marco uh in the chat as far as I<br>[58:25] can see at least and he will tell you<br>[58:27] from the doctrine project they need to<br>[58:30] test doctrine against all the databases<br>[58:34] that are supported by doctrine<br>[58:37] and some of them like I I would assume<br>[58:41] most of them are not mutually exclusive.<br>[58:43] So you can have the extensions in the<br>[58:45] same setup, but maybe you do not want<br>[58:47] that from a CI perspective<br>[58:50] and have specific jobs in your CI<br>[58:53] pipeline for the specific database back<br>[58:54] ends. And then you need to merge that<br>[58:56] together into one coherent report. Boom.<br>[58:58] Same problem, just a different use case.<br>[59:02] Anyway, that code is now in a much<br>[59:05] better shape than it used to be. And<br>[59:08] along the way, I rewrote the PHP COV<br>[59:11] tool and finally wrote some<br>[59:12] documentation for it, which I always<br>[59:15] forgot to do. Um, so hopefully that will<br>[59:19] be better. Now,<br>[59:23] >> that one is a lot more important than<br>[59:25] some people may realize. in PHP I just<br>[59:29] remember that PHP unit 13.1 which will<br>[59:31] be released at the beginning of April<br>[59:34] will also bring<br>[59:37] hopefully but I have I've said the<br>[59:39] following sentence a dozen times over<br>[59:42] the last two years it will hopefully<br>[59:45] bring the final piece into PHP unit<br>[59:50] to make most of Symphony's PHP unit<br>[59:54] bridge superfluous<br>[59:59] So I've I've worked a lot with the<br>[60:02] Symfony developers over the last couple<br>[60:04] of years to bring the features that that<br>[60:07] are<br>[60:09] useful not only to Symfony developers<br>[60:12] but to all PHP developers.<br>[60:15] Make them generic. Make them available<br>[60:17] in PHP unit. And all of that has to do<br>[60:20] um with issue handling. Yeah. like e<br>[60:23] deprecated, e user deprecated and things<br>[60:25] like that to properly report that and<br>[60:28] filter<br>[60:30] and basically filter based on is it a<br>[60:34] deprecation in my code that is triggered<br>[60:37] by my code. Is it a tri uh deprecation<br>[60:40] in third-party code that is triggered by<br>[60:42] other thirdparty code or is it a<br>[60:44] deprecation in third party code that is<br>[60:47] triggered by my code or is it a<br>[60:49] deprecation in my code that is triggered<br>[60:52] by third party code and it it's a<br>[60:54] combinatoral explosion and it's a<br>[60:57] nightmare to work on because it's<br>[61:00] sometimes really bizarre and obscure<br>[61:03] what types of edge cases you need to um<br>[61:06] to to think of but I'm<br>[61:10] like I said I've said I've said this a<br>[61:13] dozen times over the last two years. I'm<br>[61:16] hopeful that this is the final piece<br>[61:18] that is missing from getting rid of most<br>[61:21] of what the Symfony bridge uh or the PHP<br>[61:25] unit bridge for Symphony is about.<br>[61:31] >> Does sound uh very exciting. Yeah.<br>[61:34] >> Yeah. Uh, we had a message from someone<br>[61:38] on you that's watching on YouTube. I'm<br>[61:40] not going to try and pronounce that<br>[61:41] name. No offense. Just uh saying thank<br>[61:45] you for your involvement in everything<br>[61:47] that you've done.<br>[61:49] >> Thank you for those kind words. You're<br>[61:51] very welcome.<br>[61:56] >> So there was a little convers<br>[61:59] volunteering to rewrite PHP unit in<br>[62:01] Erang. Go for it.<br>[62:04] So I think we negotiated a bit after<br>[62:06] that and we're now doing it in SIG.<br>[62:15] I think the AI agent will not mind<br>[62:18] whether they transform the PHP code into<br>[62:22] Erlang, Rust or ZIK codes.<br>[62:27] If you if you ever want to have a laugh<br>[62:29] at anything that an AI produces, just<br>[62:32] ask it to do anything slightly more<br>[62:34] advanced than hello world in assembly.<br>[62:37] It just goes, "Yeah, I don't know what<br>[62:38] to do with this." Bit like most assembly<br>[62:40] developers. See, a couple of weeks ago,<br>[62:43] I wanted to find out how good that is<br>[62:47] and asked an AI agent to write a really<br>[62:53] simple routine<br>[62:56] in Motorola 68K assembly.<br>[63:00] Yeah, just turn the screen black and<br>[63:02] draw a white line that scrolls from top<br>[63:05] down from top to bottom and back up.<br>[63:10] It confidently told me that it generated<br>[63:13] the right code. The code sure enough<br>[63:16] assembled correctly and I got an Omega<br>[63:19] binary,<br>[63:21] but when I tried to run it, it crashed.<br>[63:30] >> Yes.<br>[63:31] >> So, I have to say this is the episode<br>[63:33] where I thought we wouldn't end up<br>[63:34] talking about AI, but somehow we've got<br>[63:37] back onto AI.<br>[63:39] >> Yeah. Please don't.<br>[63:40] >> Yeah,<br>[63:41] >> I'm about to go to bed and I don't want<br>[63:43] to have nightmares for one.<br>[63:45] >> Well, let's let's let's go to something<br>[63:48] that's um that that fascinated me.<br>[63:51] Something you said just before we went<br>[63:52] on there. You told us about the first<br>[63:55] podcast you appeared on.<br>[63:57] >> Mhm.<br>[63:58] >> And it was to do it was a board game<br>[64:01] podcast. I can see from your background<br>[64:04] you got from what I can see quite a lot<br>[64:06] of board games back there. I'm assuming<br>[64:08] they're all board games. Um,<br>[64:10] >> they are all board games. Yes.<br>[64:12] >> Yes. Um, but you use them in your<br>[64:15] training.<br>[64:17] >> Yes.<br>[64:18] >> And I'm intrigued to hear a little bit<br>[64:19] more about that. So once upon a time I<br>[64:23] was at a customer on site<br>[64:27] way back when I used to travel a lot<br>[64:31] because I did almost all my work onsite<br>[64:37] at a customer<br>[64:39] and I was there at the company for<br>[64:42] something completely different than what<br>[64:45] I'm going to tell you about. Um towards<br>[64:48] the end of the week that I was there,<br>[64:51] they said, "Well, we basically<br>[64:54] did everything we wanted to do or wanted<br>[64:58] to learn from you this week already, and<br>[65:01] we had not planned this, but we would<br>[65:03] really also like to<br>[65:08] get started with testdriven development.<br>[65:11] Can can can you show us testdriven<br>[65:14] development?" and after you've shown us<br>[65:17] a little bit of it, we would like to um<br>[65:21] get started on ourselves and you coach<br>[65:23] us while we do that. And I said, "Sure<br>[65:25] enough, we can do that.<br>[65:29] Give me an example of what we should<br>[65:32] what I should build or what we should<br>[65:34] build together in test-driven<br>[65:36] development."<br>[65:37] And they blanked.<br>[65:40] They were unable to tell me something<br>[65:43] that they wanted to do because<br>[65:45] everything they could think of from<br>[65:47] their domain. They were really sure we<br>[65:51] would not be able to do that within a<br>[65:54] day because it all they could think of<br>[65:56] it was too large, too big, um too<br>[65:59] complex.<br>[66:02] And I refused to do something generic.<br>[66:08] Mhm.<br>[66:08] >> I did not want to do one of the cutters<br>[66:11] or some some arbitrary bland you<br>[66:18] run-of-the-mill example that everyone<br>[66:20] knows. I wanted to keep it interesting,<br>[66:24] not only for myself, but also for um for<br>[66:28] the participants of the training. And<br>[66:31] then that's when I noticed a shelf at<br>[66:34] the back of the room, the training room<br>[66:37] we were in. and it had board games in<br>[66:39] it. And one of the games I knew and I<br>[66:44] asked the people in the room, do all of<br>[66:46] you know that particular board game? And<br>[66:49] they all agreed, yes, we've all played<br>[66:51] it dozens of times. That's great. Then<br>[66:55] you know the rules. And that's what<br>[66:56] we're going to do here today. We are<br>[66:59] selecting<br>[67:01] a subset of the rules from that game and<br>[67:05] will implement<br>[67:07] these rules in a test-driven fashion.<br>[67:14] And I did that<br>[67:18] out of me seeing like between me seeing<br>[67:21] that game asking the question and<br>[67:24] deciding we are going to do this couple<br>[67:26] of seconds.<br>[67:29] And that worked so well that I've done<br>[67:33] that since then a couple of times<br>[67:37] >> because it is something different<br>[67:42] from the domain that the the<br>[67:45] participants of such a training are used<br>[67:48] to and work in day in and day out.<br>[67:54] While it is still something that at<br>[67:57] least some of them are familiar with or<br>[67:59] can relate to and it's not<br>[68:05] a simple example where you quickly lose<br>[68:08] interest because it's either boring from<br>[68:14] from the topic perspective or boring<br>[68:16] from there is no challenge in<br>[68:18] implementing that. So it keeps things<br>[68:21] interesting.<br>[68:25] So, I've done that with a couple of<br>[68:26] games for like the first one that I did<br>[68:29] was Pandemic, the original Pandemic.<br>[68:32] Um,<br>[68:33] before the pandemic.<br>[68:37] Um,<br>[68:39] and then I did it with Clans of Calonia.<br>[68:41] I did it with Irish Gage,<br>[68:45] uh, and some other games. Ticket to<br>[68:47] Ride.<br>[68:51] I even used chess once because that was<br>[68:53] the only board game people knew and<br>[68:56] wanted to do.<br>[68:58] Also works.<br>[69:01] I I've done a similar thing with domain<br>[69:03] driven development. I've uh I've used um<br>[69:06] Dungeons and Dragons as the example of<br>[69:08] domain driven development because it<br>[69:11] basically is a domain driven<br>[69:12] development.<br>[69:13] >> Yeah. The the whole book just gives you<br>[69:15] the entire domain for Dungeons and<br>[69:17] Dragons.<br>[69:18] >> Yep. I did that as well, not with D&D,<br>[69:22] but um with the system that is the most<br>[69:25] popular one over here in Germany because<br>[69:27] I was working with German developers and<br>[69:29] they of course knew the system that I<br>[69:32] played when I was a teenager way back<br>[69:35] when. Yeah,<br>[69:38] >> it's one that because the rules are so<br>[69:40] clearcut.<br>[69:42] >> Yes. It makes it so easy to demonstrate<br>[69:46] any of the domain driven event driven<br>[69:49] testing.<br>[69:50] >> This basically put development on the<br>[69:53] end of a word and you can probably teach<br>[69:55] it with a board game.<br>[69:57] >> Yeah, I've I've taught domain driven<br>[69:58] design with a board game. I've done I've<br>[70:00] uh trained test-driven development with<br>[70:02] board games.<br>[70:04] All of that works. Yes.<br>[70:07] >> Interesting. Very interesting.<br>[70:11] And once in a while I actually get to<br>[70:13] play those games because most most of<br>[70:16] the time I'm just<br>[70:22] >> happens to tech quite a lot, isn't it?<br>[70:24] There's board games afterwards varying<br>[70:26] different forms.<br>[70:27] >> Oh yes. Yeah. Um the both So um let me<br>[70:31] get my days right. Normally open on the<br>[70:33] Tuesday. So Tuesday and Wednesday<br>[70:36] evenings there's normally a lot of ball<br>[70:38] games going on. Um, you normally find me<br>[70:41] in the corner playing chess with<br>[70:42] someone. Um, there's always I think one<br>[70:45] of the nights is generally you'll find<br>[70:47] John playing poker with a table of<br>[70:49] people. So, the poker comes up. But<br>[70:52] yeah, there's all sorts of board games<br>[70:53] and things uh get played. Um, John<br>[70:57] normally brings a selection, then some<br>[70:58] other people bring them all. Um, I I<br>[71:01] can't remember what ones they are. Um, I<br>[71:04] certainly can't remember which ones were<br>[71:05] there last year because unfortunately I<br>[71:06] wasn't I was I wasn't well. So most of<br>[71:09] the week was just a blur to me now. I<br>[71:11] don't remember any of it. Um, yeah,<br>[71:14] that's uh it certainly certainly seems<br>[71:17] to be a link between developers and<br>[71:20] board games and I love board games and<br>[71:22] yeah, I do I do love<br>[71:25] >> trying out new new games and board<br>[71:27] games. Yeah, once a once a year I go to<br>[71:31] a board game weekend, which no longer is<br>[71:34] just a weekend because by now it starts<br>[71:36] on Thursday evening and goes all the way<br>[71:39] to Sunday,<br>[71:40] but at least 50% of the people there are<br>[71:45] developers or<br>[71:48] >> similar things. Yeah.<br>[71:52] >> Cool.<br>[71:54] >> All right. Well, I think uh on that<br>[71:55] note, I think we're kind of coming to<br>[71:57] the end of uh today. So, uh thank you<br>[72:00] very much, Sebastian, for joining us and<br>[72:02] talking to us about PHP units and uh how<br>[72:05] we got where we are with with the with<br>[72:08] um the testing framework, which<br>[72:12] as far as we're aware most people use,<br>[72:15] or if they don't, they should be using<br>[72:16] it.<br>[72:17] >> Yep. Um, and uh, yes, again, thank you<br>[72:21] very much uh for for joining us and<br>[72:23] giving us your your time today. We'll<br>[72:26] let you go because I know it's you're<br>[72:27] wanting to get off and go to sleep. Um,<br>[72:31] so<br>[72:32] >> thanks for having me. It was was a<br>[72:34] pleasure.<br>[72:34] >> Yeah. Well, thank you very much. And<br>[72:36] hopefully our paths will cross again<br>[72:37] very soon. Um, and we'll meet up and and<br>[72:40] chat some more, I'm sure.<br>[72:42] >> Yep. So, and thank you very much for<br>[72:43] everyone for uh watching or listening,<br>[72:46] however you're however you're<br>[72:48] interacting with us and everyone that<br>[72:50] was uh that participated live with us in<br>[72:53] our chat. Um you can always go into our<br>[72:56] Discord channel at any point. Um people<br>[72:59] are great people are in there talking<br>[73:00] about all sorts of things um in there<br>[73:03] all week long. You don't have to be<br>[73:05] there during one of our live shows.<br>[73:08] Um, I've got my script up in front of<br>[73:11] me, so I don't know if Chris has put up<br>[73:12] the Discord link. Uh, no, he hasn't.<br>[73:15] >> I haven't.<br>[73:16] >> No. Come on, Chris. You got one, John.<br>[73:18] You press buttons.<br>[73:20] >> Right. Yeah. Join us over in our Discord<br>[73:23] for the all those listeners. That is<br>[73:24] discord.phparch.com.<br>[73:27] And um, also don't forget to like and<br>[73:30] subscribe on our YouTube channel. Help<br>[73:33] us get these videos out to more people.<br>[73:35] Would be great. Um, also don't forget<br>[73:38] our magazine discount for all our<br>[73:40] listeners. A live three will get you the<br>[73:42] first three months free of a yearly<br>[73:46] digital subscription. I'm getting there.<br>[73:49] I'm getting there. I can get those words<br>[73:51] out just about.<br>[73:53] And don't forget, PHP Tech is almost<br>[73:56] upon us. It's not long now.<br>[73:59] It's It's a matter of what um where are<br>[74:02] we now? We're almost<br>[74:04] eight weeks. Is it eight? I don't know.<br>[74:06] I should have counted how many weeks<br>[74:07] away it is so we could say it, but yeah,<br>[74:10] it's not long now. Not long now. Um, if<br>[74:11] you haven't got your tickets, get your<br>[74:13] tickets and it'll be great to see as<br>[74:15] many people there as uh as possible. Um,<br>[74:19] alongside that, we've got JStech. So, if<br>[74:21] you're a JavaScript developer or you're<br>[74:23] a PHP developer and you fancy looking at<br>[74:25] a bit of JavaScript, we've got you<br>[74:27] covered. We've got some uh great talks<br>[74:29] uh all around JavaScript running at the<br>[74:32] same time as uh PHP uh tech. And<br>[74:35] finally, don't forget to head over to<br>[74:37] our swag store. Um that is<br>[74:41] store.phparch.com<br>[74:43] uh where you can get all sorts of<br>[74:44] t-shirts. And maybe next time we go<br>[74:46] live, we'll actually have our t-shirts.<br>[74:49] >> Maybe.<br>[74:50] >> No, I don't think we'll remember.<br>[74:52] I mean, we keep saying every show that<br>[74:54] we there is one particular t-shirt we<br>[74:56] both really like. We're going both going<br>[74:58] to order and we we just never never<br>[75:00] remember to order it.<br>[75:02] Uh maybe if we keep saying it enough,<br>[75:04] Eric and John will just send us one.<br>[75:06] >> Yeah. I mean, it hasn't worked in 25<br>[75:09] episodes yet. So,<br>[75:10] >> yeah. No.<br>[75:12] Well, uh thank you very much for<br>[75:14] everyone for listening again, Sebastian.<br>[75:16] Thank you very much for for joining us.<br>[75:18] Um keep up the the amazing work that you<br>[75:20] you do. um with uh with just not just<br>[75:23] the PHP, you're also involved in the PHP<br>[75:26] Foundation as well.<br>[75:29] Um and I think that is uh pretty much it<br>[75:32] for us. I'm just trying to find the<br>[75:34] right video outro video whilst I'm<br>[75:37] talking. I can't do two things at once.<br>[75:39] Um but thank you very much everyone and<br>[75:41] we will all see you soon. Bye<br>[75:44] >> bye.
<!-- deep-read:sections end -->