It goes like this:
[…] Suppose everyone had a box with something in it: we call it a ‘beetle’. No one can look into anyone else’s box, and everyone says he knows what a beetle is only by looking at his beetle. — Here it would be quite possible for everyone to have something different in his box. One might even imagine such a thing constantly changing. — But suppose the word ‘beetle’ had a use in these people’s language? — If so it would not be used as the name of a thing. The thing in the box has no place in the language-game at all; not even as a something: for the box might even be empty. — No, one can ‘divide through’ by the thing in the box; it cancels out, whatever it is. (1958, §293)
Wittgenstein, L., (1953), Philosophical investigations, translated [from the German] by G. E. M. Anscombe, Oxford: Blackwell, 1968.
Due to how we express thoughts, it is possible that in a real conversation two individuals believe they are talking about the same "thing", but in reality, they are talking about things that are totally different. It all depends on the subjective interpretation of each one and the assumption that the other knows what is being talked about.
A good example of this is a discussion, where each one wants to express the feelings about the beetle inside the box as if both were aware of what that is:
Person A: The beetle is cute.
Person B: The beetle is definitely not cute.
Person A: I can ensure you it is because I know it!
Person B: And I know it too, that is why I am saying it is not cute!
They could try to describe the beetle in more details:
Person A: The beetle has 6 legs.
Person B: Yes, and 2 eyes too!
Person A: You are right, I know exactly what you are talking about!
Although, even with objective descriptions, there is no guarantee they are the same.
Wittgenstein's beetle represents the individual perception and experiences that form a point of view.
Now, what about software engineering?
Let's say that you are talking with a person and you want to suggest how to improve a piece of code.
You can start making suggestions to create maintainable code using standard development principles. The other developer will understand that create maintainable code is a good thing and that using standard development principles is useful; you both agree.
But then when the work is done you realize the code is totally different from what you expected. The other developer is not using standard development principles or creating maintainable code. But wait, what exactly are "standard development principles" and the act of creating more "maintainable code"?
Of course, you know what they are, right?
… or not?
What if you really don't know what you are talking about?
You might have been a victim of the famous Dunning-Kruger Effect. The developer might have implemented principles that are unknown to you and you just don't see the benefits because you lack context.
What if the other developer don't know what they are talking about?
The other developer might have less experience than you. Or have different opinions over "good" principles.
What if neither of you has any idea of what good principles are?
Remember, the feeling you have when you are wrong is the same feeling as when you are right. You just feel bad when you discover you were wrong, not when you actually are. Both of you can discuss naturally, and still, both of you can be wrong.
When talking about software design we are still tied to the subjective nature of the human being. You can try to be as objective as possible, but when it comes to subjects such as design patterns, principles or abstractions, we are still bound to subjectivity. Even for more objective matters, we are still bound to the level of knowledge and experience that you or the other person have, for that there is no such thing as the proper solution.
Sometimes it is impossible to be completely objective, each individual will always have one box, and you will only know the content of yours.
Next time you talk with someone using technical jargon, try to avoid making assumptions as much as possible. Try to go as deep as you can to make sure both understand, in detail, what is being discussed.
There will always be a level of subjectivity, even in basic language. But what you can do to facilitate a conversation is try to reduce the amount of subjectivity into the smallest possible range, just enough for the task you have in hand.
This way there will be a point where the subjectivity becomes irrelevant in practice.
But it will never be null.
Edit Jul 26, 2016:
I have recently stumbled upon a post called Naming Is The Hardest Problem In Computer Science. It shows very good examples of Wittgenstein's Beetle happening in Software when different languages use the same terminology (like "object") to represent things that are completely different.