
The Torre del Mangia, the 'Eating Tower' in the Piazza del Campo, Siena.

A blog about my life, thoughts and work. This blog will consist of programming, philosophy, politics, poetry and anything else that I want to talk about.
I dream of the day when these connection pool implementations are replaced by complete implementations and I no longer have to scatter catch and finally blocks across my code.
I am always ready to substitute tools with one that is more appropriate for the particular job, but generally these are my preferences.
In my life outside of work, I apply this mantra too. I have a garage of tools for my classic car and for overclocking and my kitchen is well stocked with the correct utensils.
In many ways the most abused tool in the developer's toolbox is XML and it's associated technologies. Here are a few examples of abuse.
I really could carry on ranting from here on in, but the best thing for me to do is stop and just plead with you to really think about the right tool for the job.
Just because you can see how to solve a problem with a particular tool doesn't mean that it is the best tool or will solve the problem in the best way. Always spend time learning and looking at new tools so that your toolkit has the best chance of solving problems well.
The first three attributes are mandatory, the last is optional. The most recent address is the one with no relationship end time. The current address is the one whose relationship includes now.
This allows us behaviours that are extremely useful in a business sense. One can work out the address a pay cheque went to or a change of address notification can be filed and automatically used when the move occurs.
Temporal modelling is an essential part of object modelling and should never be ignored.
If you run into javahl library problems check that the alias has not been broken by the copy and also check that the Java directory that was created in step 7 is on IntelliJ's library path (the complete library path is listed in the error message from IntelliJ). If it is not present choose another directory from the library path for the copy destination in step 8.
Hopefully you will now have full refactoring/version control goodness.
The first message is bad enough. It takes the judgement of Solomon to determine whether there really were mitigating factors, and the mitigating factors have to really outweigh the negative consequences, not just outweight them in the mind of the offender.
The second message is far more dangerous, it goes to the heart of what makes us part of an human society. This means that it's alright to act as a criminal as long as you didn't think clearly about it, you didn't act as a thinking human being so we'll allow you back into human society sooner. That is a very bad thing. It attacks our humanity in general, it means that there is a general belief that we are unable to aspire to be rational beings and it's fine just to act without thought.
I take this very, very personally.
My immediate family has a preponderance of engineers, not software engineers but the old fashioned kind that build physical objects. I always find it enlightening to observe the similarities and differences between classical engineering disciplines and software engineering.
One dictum that has come down to me that I always follow, 'Simplify and Add More Lightness'. My father applied it when designing racing cars, my sister a trained engineer applies it in her chosen engineering discipline - dressmaking (just think about it).
So what are the ramifications?
Primarily it means, as the XP programmers have it, that a piece of software should only be as complex as it needs to be to do the job and no more. I agree whole-heartedly that the avoidance of abstractions, neat tricks and anything that obscures the intent of code is to be avoided. The problem is that, despite whatever the sellers of methodologies tell you, there is no substitute for experience in determining how complex a piece of software needs to be.
I have a few questions that I use to make this judgement call:
A second important ramification of this dictum is that a piece of software should be as 'light' on the system it is using as possible. With certain exceptions (see above), overly complex systems are not performant, if messages are flying backwards and forwards, the code tends to be tangled and to make inefficient use of resources.
A good physical example of the application of this dictum is that of a bicycle, the most invariant elements are the carriage of a person, pedal power and two wheels leading to the relative simplicity and inflexibility of a frame. The more fluid elements are direction, speed and incline. Direction is handled by a simple steering abstraction. Speed and incline require a much more complex abstraction, that of gearing. It is interesting to note that there is still room for valid variation in the design of the 'skeleton'of the bike (prone bicycles) but the frame remains a static structure.
In the early days of bicycles, they were designed to be maintainable by non-specialists, either blacksmiths or the cyclist themselves, and were thus extremely simple and made of basic materials such as iron. With the rise of cycle technicians, more sophisticated materials were used such as steel, aluminium and now composites; the gearing solutions became increasingly complex and now there is even non-essential complexity, suspension systems.
I always try to design systems to be as simple as possible, but I am sophisticated in how I do this.
Using naked Collections is not object-oriented, when I see them used I know that someone has skimped on the modelling.
Groups of objects are objects too.