- 69
- 118 872
Tech Excellence
Serbia
Приєднався 30 тра 2022
Technical Excellence is the foundation of sustainable software engineering. Without technical excellence, there's no quality; the development is slow and cannot be sustainable. Without technical excellence, there's no agility.
Do you want to share knowledge about software quality, to build better products?
This group is for engineering leaders and software developers who are motivated by building high-quality solutions and continuously improving. Technical Excellence is both a mindset and a set of practices to help us build quality software faster and deliver value sooner.
Our focus will be on the following topics:
- Extreme Programming
- Test Driven Development
- Continuous Delivery
- Trunk Based Development
- Clean Architecture
- Domain Driven Design
Our sessions will be in English, held remotely, and open to participants across the globe.
Our goal is to share knowledge, discuss diverse perspectives and synthesize our collective knowledge.
Do you want to share knowledge about software quality, to build better products?
This group is for engineering leaders and software developers who are motivated by building high-quality solutions and continuously improving. Technical Excellence is both a mindset and a set of practices to help us build quality software faster and deliver value sooner.
Our focus will be on the following topics:
- Extreme Programming
- Test Driven Development
- Continuous Delivery
- Trunk Based Development
- Clean Architecture
- Domain Driven Design
Our sessions will be in English, held remotely, and open to participants across the globe.
Our goal is to share knowledge, discuss diverse perspectives and synthesize our collective knowledge.
So you think you might be an architect (Sonya Natanzon)
We are all familiar with the title software architect, but you may not know what a software architect does or how to become one. Perhaps someone even gave you the title, but you are not sure what’s expected of you. Or you suspect you might be doing a job of a software architect, but can’t pinpoint when or explain how you made the leap and whether you are fulfilling the expectations of this nebulous role.
In this talk, you will learn:
• How to define a role of a software architect for yourself and your organization
• What do software architect do (a day in the life)
• Typical pitfalls to avoid
ABOUT SONYA
Sonya is a seasoned engineering leader and software architect. She works at the intersection of social and technical aspects of software engineering, leading enterprise software development.
She experiments with various methodologies such as Domain-Driven Design, Team Topologies, Architecture Advice Process and others to improve building and operating software in the healthcare sector. She speaks about the outcomes at international software conferences and meetups.
- LinkedIn: www.linkedin.com/in/sonya-natanzon/
TECH EXCELLENCE
- Subscribe to our UA-cam channel www.youtube.com/@TechExcellence
- Join our Meetup Group www.meetup.com/techexcellence
- Follow us on LinkedIn www.linkedin.com/company/techexcellenceio
- Follow us on Twitter techexcellence_
- Join our Discord Community discord.gg/KXdf4t4j2m
#softwarearchitecture #leadership #softskills #softwareengineering #techexcellence
In this talk, you will learn:
• How to define a role of a software architect for yourself and your organization
• What do software architect do (a day in the life)
• Typical pitfalls to avoid
ABOUT SONYA
Sonya is a seasoned engineering leader and software architect. She works at the intersection of social and technical aspects of software engineering, leading enterprise software development.
She experiments with various methodologies such as Domain-Driven Design, Team Topologies, Architecture Advice Process and others to improve building and operating software in the healthcare sector. She speaks about the outcomes at international software conferences and meetups.
- LinkedIn: www.linkedin.com/in/sonya-natanzon/
TECH EXCELLENCE
- Subscribe to our UA-cam channel www.youtube.com/@TechExcellence
- Join our Meetup Group www.meetup.com/techexcellence
- Follow us on LinkedIn www.linkedin.com/company/techexcellenceio
- Follow us on Twitter techexcellence_
- Join our Discord Community discord.gg/KXdf4t4j2m
#softwarearchitecture #leadership #softskills #softwareengineering #techexcellence
Переглядів: 917
Відео
Domain-Driven Refactoring (Jimmy Bogard)
Переглядів 1,2 тис.8 днів тому
Books, workshops, storming and more, all build up an idealized domain model. All describe great techniques for domain-driven greenfield applications. But what about the code we have? How can we take what's already built, and move it towards a better, more cohesive design? In this session, we'll look at anemic, procedural, boring code and examine code smells that can point us in the right direct...
Hexagonal Architecture (Alistair Cockburn)
Переглядів 4,5 тис.8 днів тому
Learn from it’s creator the rules and structure of the “Hexagonal”, more correctly called the Ports & Adapters architecture. In this lecture, Dr. Cockburn will describe why he created it, its benefits and also its costs, the UML description, and also some sample code. As an extra challenge, he will invite you to write your first Ports & Adapters application in your favorite language /during/ th...
TDD: Theme & Variations (Kent Beck)
Переглядів 6 тис.8 днів тому
Test-driven development (TDD) has become a polarizing development practice. Claims about TDD range from “absurd” to “essential” to “damaging” to “joyous.” In this talk, we’ll take a step back and look at TDD in context, including its history, current practice, and potential future. Outline of the session: - History of TDD - Canon TDD - Variations: TCR, Exploratory, Mocks, Top-down, Bottom-up, U...
Orchestration vs. Choreography: The good, bad & the trade-offs (Laila Bougria)
Переглядів 8848 днів тому
One of the goals of building microservice-based architectures is to reduce the complexity of individual components. In doing so, much of that complexity shifts from individual services towards interservice communication, making how we design those service interactions essential in our system design. That's where orchestration and choreography come in, two coordination techniques that can help u...
Architecture Modernization: Aligning Software, Strategy & Structure (Nick Tune)
Переглядів 8558 днів тому
Legacy architectures are a business risk, stifling your organization's ability to innovate. On the other hand, modernized architectures can be a competitive advantage allowing your business to innovate at speed and scale their organizations. But effective modernization is far more than just rebuilding the old system with new technologies and the latest architectural patterns. It's an opportunit...
Test Doubles without Tears (Marco Consolaro & Alessandro Di Gioia)
Переглядів 7808 днів тому
Introduction: Join us for a focused session on the practical use of test doubles popularised by the London School of TDD, where we will also demonstrate it in real-time. The session will be live coding: Morse Code Kata. Learning Outcomes: • Differentiate between Dummies, Mocks, Stubs, Fakes, and Spies. • Understand the concept of Command/Query separation in software design. • Choose the appropr...
Optimizing for a fast flow of value with Architecture for Flow (Susanne Kaiser)
Переглядів 6698 днів тому
In today’s fast-paced business environment, it’s essential for organizations to continuously adapt and evolve to remain competitive and stay relevant in the market. This talk explores the synergy of combining Wardley Mapping, Domain-Driven Design (DDD), and Team Topologies as "Architecture for Flow". Architecture for Flow provides a holistic, pragmatic toolset for designing, building, and evolv...
Complexity and Modularity: Two Sides of the Same Coin (Vlad Khononov)
Переглядів 1,1 тис.8 днів тому
Every software engineer and architect strives to design modular software systems and avoid complexity. Yet, frequently, the outcome is the opposite: what promised to be an elegant, well-thought architecture results in another big ball of mud. Why does this pattern persist and how do we learn not to repeat it? In this talk, I will explore the nature of modularity and complexity, including their ...
Modern Software Engineering: Building Better Software Faster (Dave Farley) - TE Conf 2024
Переглядів 3 тис.8 днів тому
What really works to help us build better software faster? What are the fundamentals of our profession, that if we get them right, and apply them whatever our goal and whatever our technology, will increase our chances of success. Some of these ideas have been hiding in plain sight, and if we just take them and build our practice and process on them, we do get better results. So what are they, ...
Software Maintenance Costs (Valentina Jemuović)
Переглядів 1,5 тис.8 днів тому
The biggest cost in software development is software maintenance. With bad technical practices, software maintenance costs sky-rocket, they become unmanageable, and eventually, like an avalanche, they destroy successful products. We’re in 2024, talking about AI, yet we’re stuck with primitive technical practices. Software is getting increasingly complex, and we’re spending the majority of devel...
Clean Architecture: Crafting Flexible Software Systems (Olaf Thielke)
Переглядів 1,4 тис.Місяць тому
This talk explores the concept of Clean Architecture, its importance in software development, and how it addresses common challenges. We'll discuss the purpose of software architecture, examine traditional development pitfalls, and introduce Clean Architecture principles. Through a real-world case study with audience participation, we'll demonstrate the practical application and benefits of thi...
Metal-In Test-Driven Development: A Dual-Target TDD Approach (Fran Climent)
Переглядів 907Місяць тому
How can we get rid of the hardware bottleneck in order to speed up our embedded development processes? Could we treat our embedded code as a complete subsystem decoupled from the underlying hardware? If yes, how could we achieve it? Outline of the practical session: - Develop a highly decoupled and portable ‘BatteryMonitor’ module following Metal-In TDD approach. - Highlight the differences bet...
How Domain-Driven Design scaled a Big Ball of Mud product (Kenny Baas-Schwegler)
Переглядів 1,1 тис.3 місяці тому
Many products start out with a simple, naive model able to prove market fit. And most of the time that one model grows, because more features need to be put in at a fast pace. This can have a huge impact once the product needs to scale. Because that fast pace can turn the model into a Big Ball of Mud, and most of the time that model isn’t the most useful model to solve the core business problem...
From EventStorming to TDD (Oliver Zihler & Alina Liburkina)
Переглядів 1,6 тис.3 місяці тому
Last time, we showed how EventStorming, DDD, and Clean Architecture can help us foster shared mental models between domain experts and developers effectively. This time, we will focus on one main variation of EventStorming, Design-Level EventStorming, to demonstrate how we can effectively employ it during iteration planning to split user stories and derive business rules and aggregates, such th...
@Kent Beck, would love if you reach out to Jim Coplien on his alternative to TDD. With it, I think he is ok if we learn TDD like we learn a kata. But moving assertions into code You have TCR (which I dislike). Jim Coplien has something different too. An evolution of TDD
I got one question... When you have driven adapters outside the app, and they are mocked up in the tests... Should not the driven adapter-code be tested ? Or should they be tested seperatly ?
brilliant channel
Excellent talk !!
I asked about optimistic locking and transactions and @Rob van der Linden Vooren asked a similar thing about propagating context from/to adapters. Unfortunately, the answer is "I don't care". This sounds like an "ivory tower" architecture to me...
Hi! I'm not really used to this specific approach, but I do try to isolate interfaces and their responsibilities in my work, so what Alistair says landed nicely in my mind. To try to figure out some working design of the interfaces, I'd start by asking questions like this to myself: For passing of the context: is it an important part that should be accessed and used in the app itself? I'll make it a part of each interface then (both driving and driven). Or is it an implementation detail? Then I'd try to delegate this to the supporting libraries, to make it a sideband context and then work on supporting it on all types of the adapters (which can be a tedious task and it would be an easy thing to lose). If there is no way to do that in the language/ecosystem, then only option A is left. For supporting a transaction or distributed transaction: Is it an important part of the app itself? I'd expose the transaction control on the driven interfaces and make some kind of transaction manager your required dependency. Then wire it up in the app configuration, so it would control all the driven interfaces that need that management. Or is it just an implementation detail? Then I'd make the transaction control a part of your adapter that would expose only "Save" method on the complex object to the app and do all the work without exposing the complexity of the actual storage. For optimistic locking: Is it important to the application? I'd expose the "Update" method with both expected and desired state of the object as the parameters and make it properly return the updated state with failure status or success status as a result Is it an implementation detail for which I can figure out the automatic resolver of the conflicts? Then I'd expose the "Update" method with the set of desired changes to the object state What do you think, should these approaches and this way of thinking work?
24:30 Anyone who doesn't do it every day hasn't understood it either.
Exactly, we need daily practice to truly understand something.
What a co-incidence - I got interested in Hexagonal Architecture today and this was streamed yesterday <3
Hi Jimmy. Nice one, highly appreciated. Though you didn't mention about bounded contexts, aggregates, etc, so this one is not about domain-driven refactoring.
Thanks Alistair. Nice one, appreciate it. Though you drew an ideal world picture and problems emerge when abstractions start to leak or when a port abstraction boundary is wrong
Very informative. Thank you.
You're welcome!
Really dissapointing at (ua-cam.com/video/C5IH0ABmyc0/v-deo.html ), Kent talks about 'Test'. He is just babbling. There is no reference to those who have spent a lot of time to explain 'test'. Yet, no one has a problem with this. This is the same problem with all the books related to agile, including Agile Testing, which talk about testing. For the record, I think Kent is a great intellectual and has made great contributions to software development. But, he doesn't understand 'test'.
Hi @nilanjenator, what are good references on 'Test' in your opinion? Would be interesting for me to contrast it with what Kent is saying. Thanks
@nilanjenator Are you serious? You know he is one of the few global technicians playing this game in god mode. His explanation sounds more than correct and he also explain additionally why he has not renamed this concept. You are disappointed because he argued thoughtfully and not about the facts he have told. I would like you to remind you here, that those Smalltalk guys (such people as Beck and Cockburn corresponds to your comment) have no need to offer monkeys their cigarettes but still remain friendly when their lighters do not work properly right away. With all due respect, your comment is that of a troll and this is a problem of the receiver here, not it's sender.
@@redsea9931 you are right, maybe I wasn't clear. When we are trying to develop a deep understanding of a software, in order to find risk, there is no substitute for using the software in an environment as close to the end-user as possible. If you compare with the design or marketing of physical products, it makes no sense for any delay in using the product/MVP/mockup in order to check fit-for-purpose. To evaluate a software for risk, you must *use* the product. Of course, you can do a lot before the product is developed - thought experiments, what-if scenarios, mock-ups. But, they are not a substitute for actual use of a product. Moving on, TDD does very little in terms of testing. In TDD, you have a test with a *known* outcome. That helps with code design. But that has *nothing* to do with testing. BTW, I still find TDD helpful, in terms of the what-if questions the possible exploration. However, the *test* part of TDD is *not* testing. And the problem is not with the name. It's about educating users to not be under the delusion that that is testing.
I agree with Kent Beck's definition. In essence, a test is just given some input, we have some processing of the input to achieve some output, and we have expectations regarding the output. That's it, simple.
@@valentinajemuovic are you aware of any alternate opinions/definitions?
For those who have not had the opportunity to work in shops who practice XP. For those who do not yet have a good mentor to learn from. For those of you struggling to find someone to code review your code because you aren't pairing or mobbing just yet. I was there at one point in my career. When I was trying to get into XP, I was alone trying it on real work. I was surrounded by teams that wanted nothing to do with TDD and Craftsmanship at the time. But ChatGPT would have been a neutral buddy to throw questions to, and probably could have pushed me further and saved me hours from searching the net for everything. Being a hard core TDD practitioner I absolutely think Chat GPT and other AI tools can help critique code. It may not be able to hand hold you through TDD like a real person, but you can use it for refactoring ideas, and reviewing production code. Ask ChatGPT to review the code you wrote after your test passes, it can actually give you some really interesting feedback. Be aware that it's not always correct so verify by trying things (go to people's blogs, Fowler, Kent, etc.), but hell why would you not see what ChatGPT has to say about the code you just wrote if you're not pairing or mobbing? I wish I had something like ChatGPT 15 years ago at the time to help review the Production code I just wrote. Some prompts that could be helpful: Was there a simpler way I could have made that test pass? How could I have applied Clean Code techniques on the code I just wrote? Is this code emphasizing Domain Driven Development? How could I write this code in a more Hexagonal architecture approach? Can you see a way I could have written a simpler test here? I eventually found mentors who were already awesome at TDD, then later got into XP shops but man, if I had this, rather than spend all day searching the net, wow would that have been helpful. - Dave Schinkel.
No attempt to explore the word 'test' further or to reference those that have??!!! - TDD has nothing to do with testing. TDD is about code design - Test-first is not an *alternative* to test later. Why? When you use a software in a real environment, it is a powerful learning experience. That is critical to think about what can go wrong (tests). - When you TDD, 95% of your time is spent in thinking. The final *test* is almost trivial compared to the thinking that preceded it. - The test is not the outcome of your TDD. Homework: What is the outcome? - Developers are not motivated to use the software (as real users would) in order to think about risk. Either get motivated, or hire a tester. - When talking about testing in agile, stop saying "TDD, BDD, ATDD". Each of those may have an application, but they do not encompass testing. - *Agile* testing is not a thing. Stop the delusion. - If you are a developer and want to emote about testing, please take the effort to read "Lessons Learned in Software Testing". Be familiar with the names Satisifce, Kaner, Developsense, Weinberg. Engage with testers to understand testing.
This is a nice intro. Ports and adapters is such an awesome pattern, but you see it again and again that the terminology confuses people (it was evident in the live chat, too). And while I understand the hand-waving away of specific concerns, given that AC will have been using ports and adapters for the best part of a decade now, some real world practical “recipes” and model examples for different stacks could really help.
Yes, many developers have been requesting guidance regarding specific concerns about implementing Hexagonal Architecture. Alongside the TDD in Legacy Code series, there are also plans for Hexagonal Architecture in Legacy Code series - to give specific guidance about introducing Hexagonal Architecture. journal.optivem.com/p/tdd-in-legacy-code-transformation
Very insightful - best practices reduce unnecessary development costs.
Yes, especially in the long term.
Great content, as always! Just a quick off-topic question: I have a SafePal wallet with USDT, and I have the seed phrase. (alarm fetch churn bridge exercise tape speak race clerk couch crater letter). How can I transfer them to Binance?
Thank you, Vlad Kononov
You're welcome!
Great explanation of the concepts with the drawings 🙌
Thank you!
Amazing live talk, thanks Valentina! 👏
Glad you enjoyed it!
Thanks for your support Jelena!
Here's the link to the slides: docs.google.com/presentation/d/1EQQh99IQXh0sXLJl2qlZ-1elAN7pJEt15nRvfSHKyEM/edit?usp=sharing
@Olaf Thielke is great technologist. Today talk is awesome.
Glad you enjoyed it!
Github repo: github.com/olafthielke/CleanArchitecture
Just avoid layers. Simple as that. The result of you instead localizing your code around subjects will end up in about this architecture. The name is bad as it could suggest you should stick with the layers.
Thank you for this excellent talk! It is probably the best one I've heard regarding this topic. Is there any tool available that will collect all three metrics (S, V, D), that will automate the calculation for me? I guess no, because I think it will be hard to find the connections for some of the coupling types.
Yes
man OOP makes this stuff so overcomplicated this entire architecture just looks like a request handler function anyone that has any experience with express.js for instance has already been using this architecture.
isnt this BDD?
next time please add some transparency to the top right TE logo, or move it outside the presentation area
Thanks for the feedback!
loved the exercice ! thank you so much
It’s not because I am from Serbia like Cupać but I really don’t know if there is better channel than this one about the TDD! Keep going guys!!!
Appreciate it! Glad that you're onboard with TDD 👏
Totally agree!
Keep doing this amazing work. Great content indeed.
Thanks for the support :)
Great video! 😊
Thank you!
This is excellent one.
Thank you!
A very nice session on service boundaries and fat messages. However I still prefer to store the OrderDetails on the First Order Microservice, in one place and use a Saga and specific Commands to send specific portions of the OrderDetails Data to each of the rest Microservices in the ecommerce scenario. Otherwise we need to have extra layer of temporal persistency for each microservice (we already have a local-database at each microservice, we propably have a lookup database, and we have to deal now with a new temporary storage ), add on top to implement all these using hexagons and CQRS projecions and the code becomes really-really complex. My two cents......Great session though!
Fantastic pragmatic presentation.
One thing I didn't hear you talk about is using Read Models to avoid the cross-service interactions. I have always professed that a Read Model is generally UI oriented and ignores all boundaries. Then again, I have been talking about Packaged Business Capabilities (UI + API + Data + Events all packaged as one thing) for about 6 years.
I am 20 minutes into the video and I can tell by now that it is awesome, packed with real life examples.
Glad you enjoyed it!
Here are the slides: www.dropbox.com/scl/fi/jtyb6lmscycau8axkmg5t/ddd-service-boundaries.pdf?rlkey=gxpcxtadgx7iq7c7og4orhizr&e=1&st=a6atkiny&dl=0
Thanks Adam for the awesome session!
You're welcome!
Designing a UI for Microservices: go.particular.net/tech-excellence-ui-2 Service Oriented Architecture: go.particular.net/tech-excellence-boundaries-2
This architecture has been around for over 20 years in the modular monolith/modular client. What this video really shows is how little most developers really understand about software architecture and how poorly it seems to have been taught for a long time.
Agree and then populating all medias with good clean architecture courses :) I feel same aspect Divide and Conquer only different context.
Hexagonal Architecture should just be called what it really is, to avoid so much confusion. What it really is a way to organize code based on the concepts of Input or driver ports and Output or driven ports. Input ports are driven by the users or the app and they drive the application, Output ports are driven by the application and they drive interactions with external systems. That's it. Just some ports. How you organize your projects is not prescribed. You only have to call your inputs and outputs ports and abstract them away however you see fit, so that you can focus on testing the app's behavior based on how it's driven.
I used already Vertical Slice architecture at the beginning of my career, it was then known as Big Ball of Mud
Can not agree more😅😅😅
The biggest advantages of using vertical slice architecture is FEWER MERGE CONFLICTS!
People that have had to face the difficulties of not having taken the right micro decisions at the right time, will totally understand this talk and even have some flashbacks, 😹😹
Totally agree 😂
This is the Gilded Rose github repo: github.com/emilybache/GildedRose-Refactoring-Kata
I hope you end up using Mock Service Worker instead of mocking window.fetch... will have to watch to the end and see, because I don't like having to dirty the API adapter by injecting what is basically an http client. It might make sense in C# but in JS world you have things like window.fetch or axios and their interfaces are not compatible, unless you abstract them yourself and create a common interface.
If we mock the request (a method that communicates to the outside world) using MSW, the test will run a bit slower than if we pass a fake implementation of the request. Doing MSW in the integration tests - where we assert user journeys by rendering specific parts of the app - totally makes sense. However, asserting all the implementation details of the adapter (e.g., headers that are passed into the request) by involving MSW in the unit test is inefficient, nor it's efficient to assert these implementation details in integration tests. A better approach is to have a trivial unit test doing this job.
23:44 I find the IBAN validation API adapter a bit too complicated. You shouldn't need a closure to cache the IBAN to be validated. You could just create an Adapter class or object that would contain IBAN related functions like validating an IBAN, extracting encoded information from that IBAN and so on. This would mean less mallocs to just validate an IBAN. Just have a singleton adapter and functions you can directly call on it, like `validateIBAN(iban: string)`.
The closure leaves an opportunity to pass an argument when the adapter is for mutations: // Adapter factory function createAdapter(options) { return (x) => { // do communicate with an outside world }; } // Use Case const useCreateTodo = () => { const factory = useAdapterFactory(); const mutation = useMutation({ mutationFn: factory() }); const [formValues, setFormValues] = useState<FormValues>(); const handleSubmit = () => { const result = await mutation.mutate(formValues); }; };
Plus, the closure allows passing the request (a method that communicates to the outside world). This makes it easy to write a unit test for such an adapter because a fake request can be provided.
I've discovered the same architecture, in the same way you did. And, by experience, do not reuse code between handlers. There is nothing wrong on having copied/pasted code. Keep in mind modifications will come per feature, so, probably, this code will need to evolve independently, and the duplicated code will not be duplicated any more.
Here's a link to code demo: github.com/javisan81/hierarchy