Archive for the ‘DDD’ tag
Are you coming to OOPSLA?
In a couple of weeks I will be at the OOPSLA conference in Orlando, USA. I am absolute OOPSLA nOOb but am already excited about it. I’ve heard lots of nice things from the OOPSLA “veterans” at factor10 and now I can’t really wait to get there.
I will be giving a tutorial on using AOP to solve some domain problems, not just removing the infrastructural noise from your domain models. Also, I’ve been invited to be part of a panel on my best-loved-hated subject … modularity. I will also take part in the Cloud Computing Design workshop.
There’s also an amazing line up for the other tutorials and OOPSLA still has a “Pay for 3 and attend 4″ promotion going on. Take advantage of it. If you already signed up for 3, then just sign up for the 4th. If you’ve signed up for 2, then pay for the third and register for the 4th too.
So much happening in just a short week. But, it will be lot’s of fun and worth the 24 hour travel time from Cape Town.
Trust Everything
Trust has popped up in so many of my conversations recently. It came up at home, at a new school that Lia will be starting next term, in the DDD course that I gave earlier in the month, in Peter Hundermark’s scrum master certification course. And I got a one line email that said this.
The entire world lives on trust. Every aspect in life moves with trust.
The more I think about situations in life that will prove this statement false, the more it seems to hold true. Even in design it holds true. Your most fundamental architectural decisions are based on trust and the implementations of that architecture work because of trust.
It’s true for code too. If you don’t trust the code on which you build or depend, then you might as well write everything yourself, and give up your place on your team.
I was thinking about the AOP with DDD tutorial that I will be giving at OOPSLA this year, and this trust thing came up. Here again, aspects and the classes into which they get woven, need a trust relationship. It may seem like a stretch to make that statement, but I think it holds true again.
So, how do you gain trust? I am not sure, but I think you have give up something first. Maybe you need to show your vulnerability first, then it becomes easier to let someone into your space. Then, perhaps, they will let you in to their space too. When ego walls are erected, then trust finds it hard to grow. By ego, I don’t mean arrogance, I mean awareness of your self that you hide from others for fear. Perhaps, it is only when you show your true interface, that the other will worry less about hidden agendas.
In code, trust lies in interfaces and types, not in implementations. It’s really about trusting the implementation that makes types worthy. When you trust the type and send it a message and it behaves as expected, then you trust it. If you request something of an abstract type and the message was received by an instance of a subclass, then you expect the subclass to behave like the abstract type. You don’t hope that it does behave consistently, you trust that it does!
Trust is tied in with ubuntu too. You can’t be part of a community nor allow yourself to be defined and shaped by the people around you, if you can’t trust them. I think ubuntu coding needs trust as one of it’s values. It’s already a value in XP, and Scrum, and families. It needs to be in teams, and organisations, and communities and nations too.
Fast Track to Domain Driven Design
I finally got out of neutral and pulled together the first public offering our Domain Driven Design courses in Cape Town, South Africa. Normally we give these courses on-site with people on the same development team but I thought it may be fun and inspiring to open it up to everyone for a change. Now I’m all excited again and really looking forward to a diverse mixture of people. Hopefully, I will see some old faces and lots of new people.
The one thing I can tell you is that the course is a very immersive experience. I really hate lecturing but I enjoy probing conversations and that’s how I give the course. I don’t have answers to the practical work and concerns are addressed as we go along. As a result, the day takes unexpected turns and routes. But in the end I get you to the right destination. Come along; you will leave exhausted, but inspired!
Take the Fast Track to Domain Driven Design
about the course / course contents / should you attend? / register for the course
factor10 has expanded its services in South Africa to include our advanced and
expert level courses aimed for the software professional. On September 8-9, 2009,
we will be offering a fast track to DDD for Architects at the BMW Pavilion in
Cape Town.

Who should attend?
This course is for software professionals that want to take the right steps towards
advanced and expert levels in their careers. Register for this course if you want to …
- learn more than just another syntax and set of tools
- write software for large, long living systems
- increase the quality and maintainability of your design
- design high quality models and use code to represent those models effectively
- develop applications with a good APIs
- add a design edge to your skill set

Why should you learn DDD?
More and more developers and architects realise that learning every detail of a new
API just isn’t the way to deliver the best business value. It’s such a tough balancing
act; focus on the solving the business problem and focus on building working software
with your frameworks.
One way of taking a big leap in the right direction is to learn and apply domain driven
design. It is definitely not abstract and fluffy; it deals a lot with the code also. DDD
leads us to focus on understanding and to communicate that understanding very well;
in language, in design and in code. You will shift your focus away from designing for a
technology, and you will learn to design for the business domain; to the core of the
problems and solutions. Those are the most interesting parts and what your users
and customers really care about.
about the course / course contents / should you attend? / register for the course
Ubuntu Coding for your Friends
Last week I gave a domain driven design course and one slide I put up was titled “Coding for Friends” with a single message “Avoid conceptual corruption”. In other words “Code so I can understand you and you don’t screw up my mind”. I did not realise the significance until I started working through the practical exercises with the groups and kept on referring back to this simple idea.
So often we write code in isolation and the code reflects our personal interpretation of the problem and a personalised solution too. We easily forget that other people will execute this code, modify it, and, at the very least, read it. Coding is a social exercise first, then a technical exercise. We have a responsibility towards increasing the probability of success for the next person or team that will work this code.
We can write code in isolation that is of high quality, focusing on self and metaphysics of quality, etc. That’s a zen view and it is about you. I like to think (believe?) that Ubuntu is zen for a group, not for an individual.
In Zulu, the Ubuntu philosophy is summed up as
Umuntu ngumuntu ngabantu
which roughly translates to
A person is a person through (other) persons
And in geek-speak it is
A developer is a developer through (other) developers
I get better because you make me better through your good actions. And the opposite also holds true: You get worse at what you do when I am bad at what I do.
How do we write ubuntu code? It’s not hard. It’s based on “old” principles and wise words of many people. It’s old material but worth revisiting with ubuntu glasses on: when you think about what the effect is on other developers and what the reciprocal effect will be, back onto yourself.
Reveal your intention, not your implementation. If you have designed a project management app with tasks and decided to implement it as a graph, call the class Task and give it a method called resolveCyclicDependencies(). Don’t create a class Node with a method called topologicalSort().
Avoid side effects. Let a method do one thing, and one thing only. It’s frightening how many developers don’t do this. For example, if you add a line item to an invoice, don’t update the total. Have something else that calculates the total. Basically, be boring and predictable. I long time ago a SQL guru looked at my code and said “The optimizer does not like fancy code”. Same thing.
Broken metaphors. Metaphors exist for conceptual understanding. Once you get the conceptual break through, leave it. It’s ok! Trying to build an economic model with a metaphoric model of fluid flows (or bears and bulls!) will just create havoc downstream.
Where am I? Figure out where you are in the bigger picture. Are you upstream or downstream? Is someone going call my code to create that Book object? Am I going to call someone else’s code to get the Customer object? In other words, know what you supply and what you consume.
Fail fast. Assert! It’s allowed in production code too. I would rather fail quickly and dramatically than delay the effect until it is obscure. More importantly, when I read an assert then I know that the particular condition is critical. It is an invariant that must be honored.
Pairing. Programming in pairs is an active exercise, not a case of a second syntax checker. I see many teams that pair mechanically and it does nothing for increasing code quality at all. If you practice active pairing, you are closer to ubuntu coding.
There are other techniques which increase the collective responsibility of your design and code such as context maps in strategic design, values and attitudes such as responsibility and feedback. I’ll deal with those on another day.
But for now, I think that
Code is code through (other) code!
Do you have any other ubuntu coding techniques? Attitudes?
Great Quotes for Domain Driven Design
I am revisiting the material for the factor10 Domain Driven Design course as part of a “freshen up” for the when I give it to a development team on July 1, 2009. So I started hunting for some quotes to liven it up a bit.
Here are some choice bites for ubiquitous language.
“They have been at a great feast of languages and stolen the scraps” – William Shakespear
and
“Thought is the blossom; language the bud; action the fruit behind it” — Ralph Waldo Emerson
And on the need for simplicity, I really liked this one.
“There is never any justification for things being complex when they could be simple” – Edward de Bono
Robert Bravery commented on an old blog post of mine and I re-discovered this one
“Don’t indulge in any unnecessary, sophisticated moves. You’ll get clobbered if you do” – Bruce Lee
Lastly, and the one I’m definitely going to use to stress the importance of working directly with the domain expert.
“Never hold discussions with the monkey when the organ grinder is in the room” – Winston Churchill
What a diverse group of people but such collective value. Do you have any classic quotes? Obscure quotes?
