Metaphors We Code By - Kevlin Henney
1:07:41
KanDDDinsky Open Space
2:16
Жыл бұрын
KanDDDinsky 2022
2:43
Жыл бұрын
Пікірлер
@sikelelankohla7271
@sikelelankohla7271 6 күн бұрын
Wow thank you so much
@JDogB-tc3lx
@JDogB-tc3lx 13 күн бұрын
what the hell? dude you can easily make a function in c# or java that takes a type of whatever (fruit in this example). you make an enum called fruit, put your types of fruit in the enum, then pass that into the argument of the function. bro do you even code???
@AlexTurpin
@AlexTurpin 17 күн бұрын
I wish I had this talk back when I was first trying to figure out why people liked functional programming so much. "It's all just data and functions" didn't sound that helpful without algebraic data types, and those sounded too scary to try and understand before coming around full circle with TypeScript discriminated unions and now exploring languages like ReScript and Gleam. Great talk Scott, my next FP exploration is how IO fits in all this and I see you have another one on that that I will be watching next.
@seNick7
@seNick7 19 күн бұрын
An underrated talk.
@samasoule9357
@samasoule9357 Ай бұрын
imo the main key point is to demo VERY often to stakeholders, which leads to short feedback loops!
@Infinitesap
@Infinitesap Ай бұрын
Regarding unittest (kzbin.info/www/bejne/aHulYpKbatyNo7c) I think a unittest is necessary to ensure the logic is correct?
@akshaypunnath3838
@akshaypunnath3838 2 ай бұрын
Brilliant video. Thank you, Tobias.
@JohnMcclaned
@JohnMcclaned 3 ай бұрын
Don't waste your time listening to this talk. He is advocating for one extreme on the spectrum between orchestration and choreography. The real solution probably lies somewhere in the middle. The amount of issues companies run into when implementing event driven architecture is immense. Most solutions he brings up when avoiding workflow engines in this talk are to waste months rebuilding observability and scaffolding around your code just to understand what is happening. There are so many footguns with event-driven architecture that can become known only AFTER you have implemented your domain. He loves this fire event and it's someone else's problem pattern. It might say a lot about his personality. He probably doesn't pick up after his dog when he takes it for a walk. This type of pattern promotes teams divided by "microservice" where they all claim "I did my job, here is the event, now it's someone elses problem", where no one is responsible for the entire business process.. which is always worst for the business. 28:18 - "Enjoy the organization clarity that it produces" hahaha
@luizhenriqueamaralcosta629
@luizhenriqueamaralcosta629 4 ай бұрын
Amazing Ideas in a clear and simple presentation. Thank you all.
@fytubevw
@fytubevw 4 ай бұрын
"Hit F6? Hit a key?? Oh, I sed -i " [sic]
@fytubevw
@fytubevw 4 ай бұрын
I will aim to make a temple of Rainsberger. Huge fan of the talks.
@surajitchakraborty1534
@surajitchakraborty1534 4 ай бұрын
Do you need VIDEO EDITOR or THUMBNAIL maker ?
@JohnAzariah
@JohnAzariah 4 ай бұрын
Some glorious puns in this talk, as you'd expect! And the unwarranted swipe against Australia was entirely superfluous! :D
@barrett8637
@barrett8637 5 ай бұрын
"remember the saga? probably not needed anymore?" uhh, no. absolutely incorrect.
@barrett8637
@barrett8637 5 ай бұрын
"Less waste of resources" == premature optimization. Make your event handling pure functions. running an aggregate through an unnecessary function should be literally nanoseconds. It's better to say "an aggregate's event stream *always* includes all events belonging to that aggregate". every time.
@gzoechi
@gzoechi 5 ай бұрын
So much emptyness for a 4y old and really good presentation. YT algo seems to really hate this video for some reason.
@giorgos-4515
@giorgos-4515 5 ай бұрын
im writing a thesis on automating development, and everything there is object oriented, glad to see something fresh
@saidamir98
@saidamir98 5 ай бұрын
Hands down, my favorite among all the speeches at KanDDDinsky 2023 that I personally attended! The insights shared were not only interesting but also incredibly valuable. I'm still reaping the benefits by watching it again online here on KZbin. Kudos to the speaker for delivering such an impactful session! 🌟 #KanDDDinsky2023 #FavoriteSpeech
@wadecodez
@wadecodez 5 ай бұрын
legacy code to me is code that is hard to navigate and there is no real urgency to fix it. usually this means there is no core, a complicated dependency graph, and an imbalance of the Iron Triangle. from what I have seen, the best way to combat this is to develop a microservice architecture. you don't need docker or anything, but each aspect/concern of the software needs to be organized into something more manageable. also, the core needs to be something tiny. like an event bus or ioc container. then you can build the next layer of importance on top of that core. eventually you'll have a core, a few layers of abstraction, and business rules. when done right, business rules will feel like an orchestra. otherwise it will feel like a derailed train.
@marna_li
@marna_li 5 ай бұрын
The biggest challenge in software development is communication, or the lack of sufficient ones. Coders start coding without clarifying to others what they mean. Diagrams seem to be few, or left to the architect to make. Still that is just high-level and doesn’t capture the details. Developers thinking that the code is enough to explain what is happening.
@MichaelPohoreski
@MichaelPohoreski 2 ай бұрын
Amen! *Code documents HOW.* *Comments documents WHY.* Diagrams and external documents document WHY NOT. Sadly, these are never prioritized. :-(
@mircdom4603
@mircdom4603 5 ай бұрын
nice one!
@robz4632
@robz4632 6 ай бұрын
Thank you Julie. That helped a lot!
@thatpaulschofield
@thatpaulschofield 6 ай бұрын
I think it's very important for your application infrastructure to enforce the semantic difference between commands and events. Commands are point-to-point and are merely an intent. They do not represent a fact that something has happened other than that intent has been expressed. Commands should only ever have a single logical consumer, and so on. Choosing a service bus platform that runs on top of your messaging infrastructure (e.g. NServiceBus, MassTransit) can guide you into using these patterns correctly and providing the implementation to make it happen. This infrastructure also handles the details like ensuring that event messages are distributed to all subscribers' queues, handling message de-duplication, providing a message outbox so outgoing messages to be published will be persisted transactionally with changing business data.
@GintsPolis
@GintsPolis 6 ай бұрын
Do you think this code gets easer to read and will run faster, after changes made 19:35 and forward?
@balazs.hideghety
@balazs.hideghety 6 ай бұрын
It is. Extracting methods, and replacing the 3-5 line code with a meaningfully named function results later in much easier (and less) readability when we're looking for errors. But probably the biggest achievement is found when he makes members private and creates constructors for some of the objects and this place: kzbin.info/www/bejne/oYCWfX19l7ZmgKc - this part is extremely important, as until NumberOfActiveOffers is public and changeable from anywhere in the code, it's too easy for someone to mess up that data (same for the read-only list of AssignedOffers).
@GintsPolis
@GintsPolis 6 ай бұрын
@@balazs.hideghety that is done till 19:35. Further it gets more difficult to read.
@user-go1mc6ue7r
@user-go1mc6ue7r 6 ай бұрын
Nice talk. Aggregate was always one of the concepts of DDD that was hardest to understand. Provided you read this at some point, would it be possible to explain how you solved the technical issue of maintaining an optimistic concurrency boundary like in 39:41, local or global, in the case when you suddenly have 2 tags instead of aggregate identifiers 46:00?
@eprohoda
@eprohoda 6 ай бұрын
How r u?,wow~insane - talk to you soon!🤩
@djgreyjoy1495
@djgreyjoy1495 6 ай бұрын
Amazing talk! However it does not seem to support reading verified emails from the database ;)
@TJ-hs1qm
@TJ-hs1qm 6 ай бұрын
6:03 APL: hold my beer🙂
@Pemo99
@Pemo99 7 ай бұрын
Why is the room so empty? It should be full.
@NaveenSiddareddy
@NaveenSiddareddy 8 ай бұрын
Kenny used many time "event"ually - ofcourse
@NaveenSiddareddy
@NaveenSiddareddy 8 ай бұрын
18:04 "The greatest obstacle to our discovery is not ignorance but it's the illusion of knowledge" -- "Freedom from the Known" --J. Krishnamurti
@very_uniq_handle
@very_uniq_handle 8 ай бұрын
It looks nice in the ideal world, until one day when the business rules change but all the hard coded types have been widely spread everywhere in your codebase, even in the codebases owned by downstream systems. Then you need to refactor a large portion of the code and convince other downstream teams for migration, which could be painful as I can imagine.
@dipendrasingh352
@dipendrasingh352 6 ай бұрын
You can create an architectural boundary for this. You can read up on Clean Architecture or Hexagonal Architecture. Domain model never leaves your service & you just have to make sure to not allow other services to depend on your domain model. To add: Other services have their own domain model on which they depend independent from your own.
@huigangZhang
@huigangZhang 8 ай бұрын
Great talk, I wonder how easy to implement it using typescript instead of F#
@csbnikhil
@csbnikhil 8 ай бұрын
15:54 The wrapping of an option inside a result is unnecessary. There should have been two Errors and one Ok wrapping a Trainer.
@safikonrad591
@safikonrad591 5 ай бұрын
Do you mean something similar to the Sum Type example at around 24m16s?
@csbnikhil
@csbnikhil 5 ай бұрын
More like 37:49, where the error variant can represent the two scenarios (one would represent the `Ok None` with a meaningful type).@@safikonrad591
@marna_li
@marna_li 8 ай бұрын
People aren't communicating about what they build. It might be a quick conversation in a meeting,, but who is focused on that part of the software, but then someone has to implementing it in isolation without a strategy for the whole of the system.
@Babs42
@Babs42 9 ай бұрын
@Babs42 0 seconds ago Anyone know what he means by there's "the esess" and "2b" process level event storming and how 2b goes into design?
@Eagle3302PL
@Eagle3302PL 10 ай бұрын
Ok, but I can't just send Email | VerifiedEmail to the DB or to the FE, they need the flag to be able to distinguish. So my options are to convert my model to FEModel -> BEModel -> DBModel on every transaction, or I just keep a flag and put in a single if statement in my code. I'm struggling to see how this helps us build APIs specifically for CRUD, there is actually more boilerplate here, it's just sitting in Types rather than Services. All my conditionals will still have to occur in whatever API interface is responsible for receiving and sending data to the client, so why not just have them in the service and let exceptions propagate? I guess you can claim that now all these conditions are in the model, but in OOP I can have my conditions in the model too, just put the rules into setters.
@heimeshoff
@heimeshoff 10 ай бұрын
Oh that is definetly true. Your arguments/examples are optimising for a different scenario than Scott's. In a CRUD world with simple domain rules and a handful of if/then/else statements, I'd say you might be better off with a simple DB and some OR-Mapper or simple object model. The benefint you get from Scott's talk arises in complex domain models. When the difficulty of development lies in linguistic nuances and context specific behaviors that will never be stable but constantly evolve with your learning about the domain. Then you want a domain model that can never be in an illegal state and where everything is semantic and typesafe. That has not been made explicit enough in the talk for a later KZbin audience, but is part of the common knowledge at a DDD conference like KanDDDinsky.
@pchoudhary
@pchoudhary 11 ай бұрын
IMO we mixed different bounded contexts and modelled them as one. Train could be one thing in booking and another in station management context where freight and passenger ther things will come. For journey train could be different. Most issues aabout having to use Unions can be eliminated by proper separation. But sometimes you absolutely need them. One day...
@aguluman
@aguluman 11 ай бұрын
What do you mean by "proper seperation" could you offer small knowledge on that. I don't know what that mean. Thank you.
@simonk1844
@simonk1844 Жыл бұрын
The main point of DDD is to chose a single model which works for both business experts and software implementers. Object oriented languages work well for this because they represent things in the "real world' as single types. A developer and business expert can then talk about "an account", meaning its state and its behaviours (can be opened, closed, debited, credited); the concept of a "class" works in both worlds. How does this work in functional programming languages, ie is it possible to keep an "account data record" and the operations that operate on it tightly enough coupled to effectively be a single concept at both logical and implemented level?
@sbditto85
@sbditto85 Жыл бұрын
Depending on your language a class could be a module that contains a struct with associated methods where instead of having a compiler inject the “this” parameter you have to pass it yourself. When doing OOP classes aren’t _just_ things, but mostly actions where you create an object and send it a message to do it’s responsibility. This is very similar to a closure. Basically there are a lot of parallels between FP and OOP. Pure functional programming further constrains things as does immutability and lazy evaluation but those aren’t a requirement in order to do FP
10 ай бұрын
Ou should start thinking outside your Box. Definitely have a look at FP.
@andriisukhoi5672
@andriisukhoi5672 Жыл бұрын
Brilliant talk, many thanks!
@noelcarloshernandezperez7051
@noelcarloshernandezperez7051 Жыл бұрын
www.txime.com does not work ...
@ismaelgrahms
@ismaelgrahms Жыл бұрын
Interesting
@berish_rav
@berish_rav Жыл бұрын
Big work! Thanks for this
@Dave09182010
@Dave09182010 Жыл бұрын
The talk was great but why didn’t you stay on the slides? I don’t need to view the crowd and I don’t need to keep my eye on the speaker.
@darkomaksimovic3456
@darkomaksimovic3456 Жыл бұрын
On 32nd minute, still waiting to get functional DDD
@dmsanz_youtube
@dmsanz_youtube Жыл бұрын
This is fantastic. Really. I've been in the exact same situation, having to write checkpoints, versioning weak schema, projections boilerplate, etc. I am adopting eventuous for a new event sourced product we're using. The travel in time feature looks amazing. I didn't quite get the returning the state in http response. I guess what's returning is the aggregate state, but not the "system"/projection state, as read models could span multiple streams/aggregates, right? In any case, it looks great. Very good presentation
@zackmendax8002
@zackmendax8002 Жыл бұрын
Amazing Talk
@oliverfrench1028
@oliverfrench1028 Жыл бұрын
Excellent content! This content desperately needs P R O M O S M.
@ThomasPraxl
@ThomasPraxl Жыл бұрын
Dieses Video hat zu unrecht nur wenige Likes. Danke Matthias für diesen sehr übersichtlichen Vortrag, der gerade für den Einstieg in praktisches DDD im Real-World-Szenario einen sehr guten Überblick liefert.
@h3techsme
@h3techsme Жыл бұрын
Brilliant "lightning" ⚡ talk! 😃 The advice on "closing the information loop" with stakeholders was especially good. Those early "course corrections" can help prevent major rework down the road - and of course builds trust up front.