Hey Huu, I'm no guru when it comes to the source but have been progressively learning. It is my understanding that line 854 of the main.cpp: static const int64 nTargetTimespan = 30 * 60; specifies re-target time. 60 seconds by 30 being 30 minutes (30 blocks at 60 seconds per). We've seen a number of new coins with this variable seeming to be stable and having no problems.
I do see what you're seeing in that the wallet re-calcuates each block as you do see a new difficulty with each block found. However on pools it specifically states and you can see that it attempts to re-calculate at estimated 30 block intervals. So we're also learning as you are how some of these aspects specifically work. I don't personally enjoy admitting some technical aspects are above me as we'd like to be all over it and understand every detail but there you go. I think NorrisK may be on to something.
Regarding the fluctuations - we had some big miners with 50Mh/s+ jump on and off over the last couple of days between us and others (perhaps Coinye) - so that was sending us from 1 to 3 difficulty a number of times.
Difficulty retarget seems to work correctly, and the fluctuations should ease once the network reaches high enough hashrate.