First of all, I seem to be the proverbial man who can't do it so he teaches it. I've not worked in a Scrum or XP environment, but I did read a few books about them and this is what I gathered. I beg of you to point out any mistruth or inconsistency. You might want to take a look at this previous post, more general post, on the matter of agile development.

Some key elements of all agile methods I've read about are:
  • the code does not belong to any programmer, in other words anyone can change any piece of code in order to solve an issue
  • the members of the team are interchangeable, so not a bunch of experts in different fields, but people that can do all things (and be easily replaced by people just as agile as them :) )
  • the members of the team must have similar competencies, one cannot do pair programming between a rookie and a senior, for example. That is called teaching :)
  • the client is supposed to change their mind often and unpredictably, one plans for the unplannable
  • the client must be represented in the agile team, so as to not have delays or misunderstandings in requirements


Scrum



The Scrum system does seem to be more of a disciplined way of developing than a method in itself. There are Scrum principles that must be upholded, but if you ignore them, the whole system looks like this:

  • All development is done in fixed time increments called Sprints. Scrum specifies 15 or 30 days, although I bet most dev companies actually plan this on a calendaristic month.
  • At the start of each Sprint a meeting of 8 hours takes place (so the first day) in which half of it is to present the requests by the Product Owner (in our case that would be either the client or the person that did the analysis) and the other half to plan which of the tasks in the Project BackLog (requirements list) can be done in the current Sprint. This last part if the responsability of the Team (that would be the developers and their team leaders and managers).
  • In the last day of the Sprint two meetings will be held: a 4 hour meeting that will allow the Team to present what was done in the current Sprint to the Product Owner (this would be an informal meeting that "is intended to bring people together and help them collaboratively determined what the Team should do next") and a 3 hour meeting in which the ScrumMaster (the person in charge with the implementation of Scrum in the project) "encourages the Team to revise, within the Scrum process framework and practices, its development process to make it more effective and enjoyable for the next Sprint"
  • The development is one in the rest of 28 days
  • Each day there is a 15 minute Scrum Meeting held within the Team in which "each Team member answers three questions: What have you done on this project since the last Daily Scrum meeting? What do you plan on doing on this project between now and the next Daily Scrum meeting? What impediments stand in the way of you meeting your commitments to this Sprint and this project? The purpose of the meeting is to synchronize the work of all Team members daily and to schedule any meetings that the Team needs to forward its progress".


What is important about these Sprints is that at the end of each sprint the product should be fully implemented, tested and ready for production. At each increment the client could just take the product and leave. Any changes to the specifications must be included in the backlog and prioritised so that the developers apply them in the next Sprints. Once a Sprint is planned, there are no changes to it.

So, as far as I understand, this is a method of making rigid planning for very small periods of time, then executing it, effectively reducing each project to a bunch of smaller ones. Instead of "Make me a business management application" there will be projects like "Make me a member management interface", then "Add activities management" and so on. It reminds me of the time when I wanted to learn in college and I would divide the number of pages I had to understand and memorize to the number of days remaining till the exam.

I don't consider Scrum a very innovative way of development, although back in 1986 it probably was, but that's also good. One can easily adapt some of these ideas to their own system of development. By allowing the developer to build a finite number of things in a predetermined time, they can select a time to test the application in which they are certain no more requests will delay that process. Of course, I don't know what happends if the client changes their mind about a thing that is supposed to be done in a Sprint. Do we abandon the task in the current Sprint and plan it modified in the next? Do we build it as if nothing happened, then start making the changes or, worse, remove it?

XP (Extreme Programming)



The Extreme Programming development method seems to have the same roots as Scrum does. The idea is to develop in successive iterations that encapsulate planning, testing, development and refactoring. The "12 principles" of XP are again and again mentioned in the book, but I think that's crap. The most important ideas in XP, to me at least, seem to be :
  • User stories as requirements gathering; Most important! a detailed story of what the user will do and why, like a narrative, the Word version of an UML flow diagram, which is the responsability of the client! The actual developing is the implementation in code of those stories
  • iterations, which in the case of XP don't have a specific time length, each one is planned depending on what there is to do and what can be done
  • the separation of user and client, the user is the one that actually uses the program, while the client... well, you know
  • user-on-site, you can always ask the user what they think and receive quick feedback
  • Test driven development, which, together with pair programming, seem the only actual extreme parts of XP, where they insist on tests first, programming later.
  • Spikes: small bursts of programming for no other reason than to research an idea. Developers don't have to be rigurous in spike programming, since they only do the bit of code, test its functionality, then throw it away, the idea being that they learn how to do the actual code they wanted to do and what problems they might be facing. In this particular case, the spike is part of the planning or designing of a piece of code.


I will mention here Pair Programming as well, although I clearly don't see it happening. The idea is that two programmers sit on the same machine, one programs, while the other does just-in-time code review and thinks of the large implications of the code. While the concept is sound and I seldom find myself wanting to be able to code and also think in a larger context, I don't see how this can be done anymore than a master painter could get help from a second one that watches from afar and keeps nagging him on how to do things. Besides, sitting near a code that is being written sounds both boring and terribly frustrating.

But then again, I always like talking to other programmers that are as passionate as I am, so maybe a hands-on discussion, even an argument, might provide the drive to good code. Besides, it is harder to waste time on news sites and online games when you have some guy next to you :)

Conclusion



My conclusion is that agile is a solution to the problems that arose during the Waterfall days. It is not a solution to all problems and it certainly presents some level of difficulty in implementation.

I believe it would be hard to do in a small team with high turnover. One needs a stable team that works well together and has a decent management to implement agile development. But I do see it as a positive thing, as it puts the needs of the customer first and, no matter how good a coder you are, your primary goal is to satisfy the client.

and has 0 comments
In this day and age, being or getting fat is treated like a drug addiction, in all sense of the word treated. Fat people are marginalised, socially pushed to find a solution. Many solutions are provided, from pills that help you lose weight to food replacement things and "health food" so that they can slowly get rid of this addiction to food. And in many respects, fat people are behaving like addicts. They have cravings, they find reasons for eating "just a little bite", they show withdrawal symptoms, they try quitting and they fail. There are also "pushers", trying their best to hook you on chips, sugary drinks, fatty meats and fast foods as well as food suplements and slim drinks.

The funny thing is that the actual solution to extra weight is the same as in the case of hard drugs: you want to get rid of heroin addiction, stop taking heroin. There is this slightly annoying fact that you can live without heroin, but you can't without food. But there are people working on it.

Anyway, I started writing this because, as far as I am concerned, I know I have found the solution. And it is not so hard to do it, either. I've started from 116kg, lost 16 in 4 months, started drinking Coca-Cola like crazy while keeping the diet, didn't gain much weight, then started eating a lot of pasty, bready, pizzy and fatty food and gained 10 kg in about 1 month and a bit, then I started a custom (less strict) diet again and got to 104kg in 1 month. In other words, even if I stop the diet, I have to make an effort to gain weight. Even if I slip a little, it doesn't matter. And if I make my own food style, one that avoids too much fat and bread and sugar, I don't gain weight, even if I stop the diet completely. It is way easier to gain weight than to lose it, but that is not the point.

Bit by bit, though.

You have to consider that this is not a weight loss blog and that I am only describing my experience here, but hey, it worked. From what I could gather there are three points that need covering:
  1. Don't gain extra weight
  2. Eat the right stuff to maintain your weight
  3. Keep your metabolism running to lose weight
. Pretty easy.

In order to not gain extra weight, eat less. A normal sedentary human needs about 2000 calories per day. We eat a lot more than that and a lot of it just goes out in the toilet. A small part (but significant to this blog entry) is stored as fat. By eating 1500 calories you get to stop gaining weight and start losing it. But how does one know what 1500 calories mean? Very simple: you get a list of what you are supposed to eat every day at every meal and you don't stray from it.

In order to maintain your weight even after stopping the diet, you need to eat the right stuff. I don't know exactly what that means, but guessing by the food I am allowed to eat and what I am not and what I Googled on the net, I found out that there is a separation of food types into alkaline and acidic foods. Supposedly, you need 75% of the first category and 25% of the latter. A normal Western diet is the other way around, hence the weight gain and the accumulation of fat. Also, the division of foods in these two categories seems to have nothing to do with pH, as lemons are considered highly alkaline. Probably the terms refer to the body's response to them. Also, you need to stay off carbo-hydrates. This is called a "low-carb" diet. Carbo-hydrates is a fancy word for sugars, but there is the good sort (like in fruits and a bit honey) and the bad sort (like refined sugar and refined flour products).

And last, but not least, eat many times a day. That is counter intuitive, but if you think about it, it makes a lot of sense. The human body is very adaptive. If you eat once a day, it will remember to shut off functions that use energy the rest of the day. Not to mention that you'll probably get an ulcer anyway. So instead of losing weight, you will lose energy. Even worse, when you start eating again, the body will just store it, since it is running in energy-saving mode. Instead, if you eat many times a day, your body knows energy is freely available and the metabolic rate will go up instead of down, helping you to burn reserves (fat).

Ok, enough theory. I will give you a general 1500 calory diet to follow every (fucking) day. If you get bored, read the part about the routine. Don't stop. Remember, I lost 16 kilos in 4 months and then I had to make an effort to put 10 kilos back.

So, there are 5 meals a day! breakfast, brunch, lunch, lupper (sorry, couldn't help it :) ), supper. You are allowed to drink water and green tea with no sugar only. Maybe coffee in the morning, but that's frowned upon :D.

Breakfast (7:00-8:00): 100g of low fat meat (like grilled chicken breast, fish, cremwurst (the thing in the hot dog), etc.) and/or low fat cheese (like mozarella or any low fat cheese). 100g in total. That means like 3 (slim) cremwurst sausages. Also a tomato and a cucumber (a normal cucumber, like the ones that are the total size of a tomato :) not the huge ones). You are allowed two slices of bread, not white, but wheat bread.

Brunch (10:00-11:00): 250g of fruit. Any fruit. Or 4-5 dried fruits.

Lunch (13:00-14:00): 150g of low fat meat (preferably grilled, else you start dreaming of warm meals) and a salad (tomato salad, green salad, boiled vegetables whatever. Use olive oil and as little salt as possible. Use lemon juice, not winegar). For example if you want to make yourself a tomato salad, you use 2 tomatos and a cucumber, some olive oil and lemon juice and a little salt. That's the size of a salad, not 4 kilos of tomatoes with mayo salad dressing. Two slices of wheat bread.

Meal between lunch and supper (16:00): 250g of fruit. Any fruit. Or 4-5 dried fruits.

Supper (18:30-19:30): 400g of yoghurt and/or low fat meat or salad. 400g in total, use at least 200g of yoghurt, though, it has enzimes that will help you during the night. Maybe replace the yoghurt with a less fatty soup. One slice of wheat bread.

That is it! You eat nothing else. You drink nothing else than water and grean tea. You avoid sugar as much as possible, onions and carrots and peas are sweet, too. No diet drinks or sugar-free chewing gum, they don't really help. Chocolate is a no no. Icecream is a crime. Alcohol deserves capital punishment. (well at least that's what the nutritionist told me).

My opinion of it? Well, things are not so bad. Remember that you cannot put more weight than what you eat. Even if you live by breathing air and you store everything you ingurgitate, you cannot gain 10 kilos if you only eat 1. Does your body store the Coca Cola drink you crave? No. But it uses that sugary goodness as energy and stores anything else you eat. Will you inflate like a balloon if you go to someone's birthday party and you eat a little cake and drink some champagne? Not really, unless people start looking at you funny while you are the only one eating the cake and there is not much left. This doesn't apply if you go to birthday parties every day!

And, remember, this is for a person that makes no physical effort whatsoever other than getting up each morning and going to work. Riding your bike at work or jogging or doing physical exercises will make this go even faster. They don't have to be difficult or complex. Finding your food in restaurants or shops is difficult, therefore you should prepare your lunch at home. That might look strange, to carry your own food, but weigh it (pun intended) against the purpose of your diet and the benefits of not being fat.

The thing is that after you reach your desired weight, you still have to keep up with this kind of eating. It keeps you fit. You can eat normal food, go to restaurants, drink sugary drinks and alcohol, but remember to balance it with the diet you just went through. Sugar and alcohol is somewhat like a really unhealthy fruit, fat is like a lot of meat, not eating vegetables is just not good. Your body is the result of evolution working on people who ate mostly plants and sometimes a little meat. Consider that when you order your double cheese hamburger and a diet Coke. Anyway, speaking of diet soft drinks, it doesn't really work. Drink the regular ones (unless you like the taste of the diet ones) just don't overdo it. It's the same with the food. Eat it rationally, even if you like to eat.

I felt no real feeling of hunger during this diet. The 5 meals a day thing keeps you full of energy and always with something in your stomach. You might feel hungry in the evening and then, if you reeeeeally find it hard to resist, drink a small glass of milk. Not regularly, just when you are really hungry. The milk makes your hunger go away, but also keep your body from losing weight.

The Routine

Well, you noticed it. The whole diet is based on daily routine. It might drive you crazy for a while, but consider that you have been doing it anyway. You wake up in the morning, wash, piss, drink the ritual coffee or whatever, get dressed, go to work, do the same thing you do every fucking day, return home and watch TV or spend "quality time" with the wife or play some silly game on the computer or even work part jobs. Then you go to sleep. It's a routine.

All you need to do is alter it a little to suit your needs.

People worst than you have done it. People incarcerated and tortured every day found solace in the real life inside their heads while living the reality in a state of trance brought on by routine. Routine is the basis of one's comfort. You only explore when you leave your comfort zone. You can do it "in your free time", if this mythical thing even exists, or just in your head, while your body is running the automated program you set up. Now I am not really talking about losing weight here, I am going general. The thing that keeps everyone content and not going crazy is not the quality of life, but the routine of it. We train ourselves to function in the given conditions.

Talking about drugs you cannot not talk about Trainspotting. The film that old people took as a drug promoting movie while for all the people that actually watched it, it was a powerful anti-drug statement. There is this part of the movie where Renton tries to quit heroin and he just hates his life. It's not because of the withdrawal symptomps, but because of the sheer boredom of it. When something that defines your pleasure is taken away, when the excitement is gone, your life feels like a slow death. It's easy to just go back to the pleasure you know. Even if it is just as boring, it feels good. But routine is what saves your ass.

The same applies to food. You dream of all the possible combinations of taste and texture and what you would do if you weren't on the diet. You don't feel hungry, you see, you don't need food, you need the pleasure of it. You want to fuck that food with your mouth and make it cum saliva. But it's all fake. When you slip and try to eat that food you realise that the fat you craved makes you feel sick, the food you want may be not on the diet sheet, but you can just about make it with those ingredients. You don't need junk food to eat good. And that is what this is all about after all. You get healthier by adjusting some parameters, not by losing something. Even if you can't lose all the weight you wanted, who gives a damn if you are still a little fat? You are a healthy fat guy! Not a morbidly obese piece of blubber that just waits miserably for their coronary.

So stick to the routine. Experiment with food while keeping to the principles of the diet when you get out of it. Stay in the comfort zone and leave it for short periods of time when you feel good about yourself. Choose your next stage of development and get to it when you feel like it.

Now I sound like those people trying to sell you stuff. I wanted to write this for a long time, mostly because I had to explain all of this to a lot of people over and over again. Now I have this post, you can read it here. I guess the bottom line is that your body as well as your brain is always in training mode. Whenever you do something that feels good, you train it to want more, whenever you do something that feels bad, you train it to want less. So it is your responsability, after all, to choose the things that make you feel good.

Ok, what's done is done, Maria wanted to spend more time with her sister and we both got tired of Kyparissi, so we went back to Sparti. This time we went alone, having gotten directions on how to get there. The GPS was useless, since it had no maps of that area whatsoever. I did pin the house on the map, though, so I knew the general direction.

Back towards Sparti, Greece (5)

Of course, we got a little lost. We entered a town we did not know the name of and we found ourselves on a road to Monevasia. We have been to Monevasia, it was in the south, we wanted to go a little north. What should we do? I pointed out to Maria that the road to Monevasia probably meets another one that comes from Sparti, using her own words from the experience with Kulata and Sofia. Of course, now that the same words of wisdom came from my mouth, she decided to turn back. We again entered the nameless village and we noticed a sign towards Sparti (fixed on a wall, so you can only see it when coming from the other direction) so we took that road. We've had the inspiration to stop next to a guy and ask if that was the road to Sparti. No, of course not, it's the other one! (the one from which we came from).





Sparti, Greece (6)

Finally we got back on track and reached Sparti and the small village next to it where Maria's sister lived. We stayed there a few days, during which the girls either spent talking to each other (and dragging me into it as much as they could, while I was trying to read the boring books I brought with me) or my sister in law spent at work and me and Maria sight seeing.

We first went in the city of Sparti to visit "Ancient Sparti". It was a big sign that directed us to it. It was a bloody park, a small one at that. Just a few stone looking modern roads, olive trees (of course), and some ruins, partly escavated and surrounded by do-not-cross tape. There were people that had parked their cars there, even their RVs! There was a modern contraption in the middle of it, something like a concrete electrical thing or maybe a janitor house, I don't know, full of graffiti. The only good thing that came out of this was a great view from above of the town of Sparti.







When we came back we took the car through the orange orchard from the back of the house and we found a goblin tree! Heh, just look at the picture, you will see what I mean.



Trip to Kalamata, Greece (7)

After that we decided to go to Kalamata, which is a rather large city in the south, taking first a mountain road that would take us directly, then return on a path that would follow the seaside and go around the mountain. It was a very nice trip. The mountain road felt like normal country for once, with actual green, non olive, trees and even rain! The towns on the edge of the sea were all nice, even if we only saw them from afar. In Kalamata, for example, we got lost trying to find the center of the city. There were signs for the center, but after following them, we would always get to the same spot, which was obviously not the center. On this trip we actually noticed vast regions covered with black ash. We theorised it was related to the extended fires that had plagued Greece the previous summer. But it could have been just as well new fires or even some weird agricultural system.







After the few days in Sparti we decided to go back to Bucharest. Again a night trip through Greece that would let us do Bulgaria during the day and reach home in the afternoon. This is were it got interesting. I told the GPS to take me home. Not only did I specify Bucharest, but the exact address. I then trusted it to take us there, without (as Maria would soon point out) actually checking the path. My only defence is that I am a software developer and I instinctively trust the electronics more than any paper map.

So, in the middle of the night, we found ourselves on a twisting road, dark and full of poorly signaled curves. Maria got upset immediately and asked me to look at the GPS. I did and I found out that the highway would take a large curved path and that the road that the GPS put us on was cutting that path. I did remember a setting on the GPS that involved road tolls. I thought the machine wanted us to avoid the tolls so it took us away from the highway. So I checked the setting off.

The road now went on another path. I could see that both previous and current path were taking european roads, but it didn't specify which was a highway and which was not. Maria was angry as hell and I was slowly losing my patience. I can stand hysterical shouting just as any guy, maybe a little better, but I do have my limits. I proposed to stop the car and look at the paper map and decide together on the path we want to take. Maria refused. So we went on.

At one moment I was actually reasoning that impulsive reactions (like swerving the car at high speed off the curve and killing us both) were usually an effect of low levels of serotonin, the comfort hormone. Both in animals and humans, serotonin is produces when the subject is caressed. So I actually caressed my wife, cooing her to close to normal levels of serotonin, when I almost felt like ripping her head off. Of course, that would solve nothing, since I can't drive (not to mention I am a rookie at ripping heads as well).

We passed through the town of Thiba, then we continued on a road that was nothing close to a highway. It was a good road, but not what we expected. The darn GPS took us from the highway because I checked that road toll setting off. Maria finally decided to stop and look at the map. The map showed us that the highway was 2 km from Thiba. We were already 20km away from it. But the small town where we stopped had two clear (albeit very thin) roads taking us directly to the highway. We inquired of the way to the highway to a gas station lady. She said that no, the only way is back to Thiba. So we went 20km back to Thiba, 2 km to the highway, 20km on the highway, where we noticed an exit to the small city we just left from.

At least everything went cool from that. It was good that we looked more attentively on the path home, since the GPS had prepared another surprise for us: it wanted to cross the border to Macedonia, then Bulgaria. I think that it would have been a more interesting road, but Maria insisted we take the known path through Kulata. Remember Kulata? Anyway, we got to Sofia, where the ring road around it was still under contruction!

Bulgaria (8)

After following a long queue of cars going at 4m per minute on dusty unmarked unpaved roads in the middle of Sofia, we got to the ring road again. It was under contruction there as well. So we stopped at a gas station and asked for directions. Bulgarians are different from Greeks. When they say they know a little English, they actually mean they don't know some of the words, not they just know a few. They were nice, showed me where I was on the map, where I should go to exit Sofia and reach the road to Ruse (the border town to Romania) and they even gave me a Bulgarian map. I told them I have no money to pay for it and they gave it to me anyway! I gathered that the map costs less that 5 euros + the repairs to the cracked lateral mirror, but still it was amazingly nice of them.

Then we got to the road to Ruse. This time, the GPS took us on another road that had no more 40 and 60km speed limit signs. I was glad to see it, especially since Maria had exclaimed "oh, now we get on that boring road" only minutes before. I was thus surprised to hear her complain the entire way to Ruse that it was NOT the way we came on when going towards Greece.

And that's about it. We got home, I started writing all this, I enjoyed my last 4days of freedom before going to work, answered my emails, I couldn't believe the people leaving spam and messages on the blog DEMANDING work done for them, etc.

and has 0 comments
Many a time I find myself looking down on people that are not born and raised in a city. Provincial people that come in the capital to find their fortune are always different and, even if most of the time they are nice, hard working and intelligent, the feeling is there. I try to muffle it down immediately, of course, I am not proud of it, but I've never found a proper explanation for the phenomenon. Not until now, that is.

I believe that people from smaller communities (be it a small town or a small group of people with the same interest - see? I am a provincial too, in some respects) can dream a lot easier. They can compare themselves with their peers and find that they are good at what they do, or that they are original and refreshing. The city folks or the people in large groups, find it harder to be exceptional. Events are not singular, they are many, they become statistics. People are no longer resembling a person they know, but rather an archetype that their brain has compiled from so many similar people. One doesn't think back at their own experiences to solve problems, they Google it.

Back to my feelings of false superiority. It is easy for me to label any person, after meeting so many people. The root of my feelings comes from the fact that those people don't understand how I know things about them or the reason I label them. Most of them don't even realise it, when they spew the same thing other people of their category had, that I've heard it all before, that maybe I've even met some of the people in their genetic neighbourhood so I know not only the upbringing from which they came, but also what they are likely to do. And they usually see my reaction as arrogance and become hostile, just as I could interpret their proud banality as annoying.

I come from Bucharest. It is a capital city, but a small one. A New Yorker, for example, would see me as a provincial fool. Maybe that's why I feel so sick when I see movies like Sex and the City where the rituals there feel more foul than the rites of cannibal savages. But it makes sense. You need a 300$ pillow and a 15000$ hand bag if you want to stand out in a crowd that big. Of course you need to hysterically shout out your feelings (after careful considerating if those feelings are appropriate or not, socially). Everything is directed because everyone has seen it all before!

For me, a society of socially omniscient (and omni-demanding) beings is hell. Mostly because I care not for social etiquette. Etiquette is French for label, by the way. Or maybe, because I know it is a game I can never win, I choose not to play, labeling myself as a tech, a solver and a fixer, not a socially astute decision maker. But how much can I last in this artificial provinciality when the big international firms are flooding the city, coming with more and more absurd demands, like dress codes or (more horrible) mandatory code comments? And, compared with all these young kids, full of energy and knowledge, I may not be such a good a tech anyway.

Did I finally understand why I felt so foolishly superior because I am slowly becoming on of "them"? A provincial? A boring, banal, average person?

Sparti, Greece (3)

When I first heard my sister in law lived in Sparti, the modern Greek town built at the site of ancient Sparta, next to the medieval settlement of Mystras, I had expected to see myriads of ruins, tourist attractions, museums and so forth. Not that I like this kind of stuff, but if Romanians had a city in Sparta, they would quickly turn it into a tourist attraction, always crowded and nauseatingly full of people and garbage. Not the Greeks. They did have something organized at Mystras, which is a small mountain fortress with a church next to it a mountain fortress towering over a small settlement boasting over 20 churches from different eras (quoting from Maria who was upset I didn't think much of Mystras), but Sparti was just like any other provincial town. We didn't visit the "Ancient Sparta site" yet, at the time we were just looking for a good long sleep in something like a bed.

Anyway, we met with Maria's sister, went to her house-in-progress in a small village next to Sparti and tried to get accommodations. The house is not finished yet. It does have its walls in place, but there are no doors inside, no floors except the raw concrete and so, after spending a day there and sleeping for the night, we decided to relocate to Maria's brother's home, in Kyparissi. But not before I got acquainted with the local cuisine, visited Mystras and made some pictures of the place. It was necessary for me to shed off some preconceptions about Greece as well.

First of all, orange and grapefruit trees don't grow everywhere in Greece. Even if my sister in law's house lay next to an orange orchard, that wasn't really very common. Instead, olive trees were practically everywhere! I love grapefruit juice. I thought I would get tons of it, freshly squeezed from recently picked fruit. The Greeks don't like grapefruit much. I had to make due with the supermarket variety of juice, of which I think I used a significant percentage. When trying to buy it, a clerk warned us that that was not orange juice! To be fair, it wasn't fruit picking season, the oranges in the nearby orchard were still green, so maybe I just visited the place at the wrong time of the year. I think I would have had more fun in the winter.


Then, the food is not that spicy or original. Greek cuisine seems to orbit the suvlaki and gyros, which are medium sized chicken meat on a stick or wrapped in pita bread. Being used to shawarma and döner kebab in Bucharest, I found it banal. I also knew about tzatziki, which is a mixture of yoghurt, cucumbers and garlic. However, most people there were amazed of my willingness to order and then ingest large quantities of the stuff. The mousaka we also have in Romania. We ate a nice one at a road diner just after entering Greece, but from then on every restaurant we asked did not have it available. Also to note is the pastitio, which is like a lasagna made with normal pasta, not sheets of it.



The only spice worth mentioning is the Greek oregano, which they called rigani. Very aromatic and flagrantly different from the Italian sort. Also, if I had ever imagined Greek peasants selling cheap olives on the side of the road (like one would find in Romania), I was sadly disappointed. When leaving the country, we actually bought the olives from a supermarket, after trying a few and not finding any except in small jars.



Driving through Sparti was shocking to us. They had no semaphores, the town was full of steep roads and the cars were packed together making it hard to move through. Or at least that's what we thought at the time. We heard they tried to implement traffic lights in the town, but that only made the situation worse. They also had some roundabouts (we were told that's what they were) which were pretty much poles in the middle of normal road intersection. The houses were the usual block like yellow model, since they never have significant snow to warrant tilted roofs and any color except yellow would probably be burned through by the relentless sun.



The cars are either small, and of all kinds, all pickup trucks, which are almost all Asian cars. Mitsubishi is a popular brand in Greece for trucks, although I have seen only about three Colt and three Lancer models around. Instead zillions of truck/van variations, from the ancient Canter model to the more modern L200. You can find a lot of Nissan, Toyota, some Ford and Isuzu, etc. In the area people seemed to love pickup trucks.

Greek villages are built like mountain villages, even those placed in valleys. The houses are packed together, with barely enough space between for cars to pass by each other and with no sidewalks. If driving through Sparti was a bit new and awkward, driving inside the village where my sister-in-law lived was hell! No straight roads, no markings anywhere. The convex mirrors that I sometimes saw installed in Romania in difficult mountain curves are popular even in flat valley Greek villages. During church days, a side of the road is used for parking so if two cars face each other, one of them must back up all the way to a larger portion or an intersection. Amazingly (for a Bucharest guy like myself), they hardly ever honk.

The logic behind it is that they built the houses in (and with) the rock of the mountain, obviously in the portions that were easiest to support a house, like flat and safe. They left space for two loaded donkeys to pass by each other, they didn't need more. In the ancient Greeks view, the roads had two lanes! Things were perfectly fine until all the nonsense with the cars came along. But why would they apply the same crowded style to their valley villages, I don't know.

I will not linger on the nearby Mystras. It is a ruined fortress on a mountain side full of foreign tourists. I made some quick photos and ran away. It was hot and I found it less than inspiring, although beautiful to look at for a few moments :)




Kyparissi, Greece (4)

Oh, boy! If we were shocked by the roads so far, we were in for a surprise. The village of Kyparissi was over a mountain from Sparti and near the sea. The way there was carved into the rock and both steep and curvy. The same lack of safety installations or warning signs was apparent. We kind of got used to it, in a while, and then we entered the village. Imagine a place where your car has just enough place to squeeze through and where the main road has portions that allow for two cars to pass by, in the others, one must back up in steep, even tightly curved places to allow for the other to pass. How we haven't bumped, scratched, crashed our car is beyond me.




The village itself is nice to look at. Not much to do in it. It consists of houses covering a side of the mountain from the top down to the beach. Whatever space is left is covered in olive and carob trees. With the typical Greek nonchalance, the beach is not regulated in any way, nobody seems to clean it or the water and there are no tourist accommodations to be seen on it. The sea is light blue and very clear, so the combination of mountain, sea with some yachts on it and small houses is very beautiful.



What striked me, a guy used to the sandy beaches of Romania, is that the beach was small and full of rounded rock. I could barely walk on it (although, to be fair, Maria had no problems). There were no birds that I could see, no oyster shells, just a lot of wasps! The Greeks don't seem to mind, I even heard the idea that they enjoy rocks more, since they don't get into their bathing suits. After a first very unpleasant beach day, I found the solution: I would use my slippers on the beach and when entering the sea, then I would move them from my feet to my hands and use them to either support by head when floating around or as swimming accessories. It worked wonders and it allowed me to enjoy the sea.

The sea itself was very clear and very salty. When it entered my nose and eyes it stung to high heaven. I got used to it eventually. There were small fish swimming around and, if there were no waves, the water was very clean. However, when the waves came rolling in, they brought plastic bags, plastic cups, twigs and big red jellyfish! I noticed that if I let the waves bring this crap closer to the shore, it eventually got stuck in some places and the water was clean again in about an hour.

It was funny to see the fish jump from the water one after the other. One less attentive fish jumped right in my shoulder. He probably expected some warning sign that I was there, so maybe it wasn't a Greek fish! One day I noticed something red in the water. I thought of warning Maria, but then I saw the same thing on another wave of water, looking exactly the same. I thought it was a reflection or something until Maria shouted that something touched her. Swimming there I found that the waves brought jellyfish close to shore, big fist sized reddish-brown tentacled jellyfish that now I believe are of the species Pelagia noctiluca. I never seen them glow in the dark, but then again, I didn't go swimming at night either. I was right not to touch them, as they apparently are the stinging type.

While in Kyparissi I visited an abandoned "old village" which consisted of some old buildings that very few people lived in. It was like a good MMORPG map, people could learn a thing or two about how to make games wandering around there. I forgot to bring my camera that time, sorry. Then we went to a cabin higher up the mountain, which provided us with more beautiful scenery and more Greek road horror. Imagine an unpaved road full of broken rock that goes higher and higher, while the wheels of the car are centimeters away from free fall. Made a lot of plant pictures and I even photographed an eagle in the sky.



We also went to the Wine "Panigiri", which is Greek for festival, in the close village of Pistamata. We saw a lot of people in front of a church with lots of wine, we turned the car around and went back :) What did you expect? I am a software developer. If I'd had people skills I would have had some other job!

Other places we've seen are the town of Molaus and the citadel of Monevasia. The latter was a nice castle city at the edge of the sea, something like the Romanian Sighisoara, but with a lot more good taste and with the sea :) Took some pictures there, as well.







We spent a little over a week in Kyparissi, lazing around. I brought a few books with me, but they weren't all so interesting so I ended up watching Romanian satellite TV and eating a lot. It was like an advanced course in couch potatoing. I slept, I ate, I went to the beach (sometimes), I watched TV. I gained like 5 kilograms doing this :)

I promised to tell you about the Greek schooling system. Well, in order to get to a university you have to learn everything you've been taught in highschool. It makes sense. In order to help children to learn it, sometimes parents hire tutors, paying them for the service of upgrading their children's knowledge. Again, understandable. What is really nasty in Greece is that eveybody hires these tutors, so much that then entire educational system pretty much assumes the children will go to these "frontistirio". The demand is so great that the market is not controlled by the parents, but by the tutors. They get to teach and, if things don't work out, blame it on the child! All the time the parents are paying 5000-10000 euros per year for this crap! While it is nice to see Romania doesn't have the crappiest educational system on Earth (although we are working on it), I can't help feeling sorry for all those kids and their parents.

Next post will be about the trips around Sparti and the way home to my beloved computer! Yay! Coming up right after these commercials!

Sorry for being away and not thinking of writing a small explanative post. I went to Greece for my holidays, to visit my wife's brother and sister who moved there some years ago. This is going to be a long post, so grab your popcorn.

Bulgaria (1)

When you have never been to Bulgaria on your own and you plan to go there with your personal car or at least transit the country, you hear the following things:
  • it is an ugly country
  • it is overrun by car thieves, corrupt cops and enterprising murderers
  • it has no, little or bad roads
  • it is poor like a third world country
. Well, I can tell you it is all pretty much bullshit.

I only transited the country, so I can't tell you I did a lot of sight seeing, and all I knew about Bulgaria is from a few years ago when I went to Balchik and I found it charming and full of lovely people. This time we went with our own car (Maria driving, as I am not really into cars) and I found it a beautiful country at least from the road towards Greece. People always helped me out (to an extent that I would have never expected, but that is for later to discuss) and a lot of them knew English to a reasonable degree (which put me to shame, since I all but forgotten the perfect Bulgarian I spoke when at 8 years of age). The roads are better than those in Romania by a long shot, almost highway material, only not with so many lanes.



My only problem lies with the way towards Greece, where the road was peppered with 40 km/h and 60 km/h speed signs accompanied by hidden police cars waiting for you to snap and go over the legal limit. Unfortunately the Bulgarian cops are crooked and even if I find placing a 5 euro banknote in the passport when they stop me - making both the bill and the speed violation disappear as by magic - a lot easier than all that dancing one normally has to do in Romania ("please officer, my grandmother is dying and I have to get to her before my granddad finishes strangling her"), I still found it annoying, especially since almost all local vehicles were passing by us like we were standing still.

Well, only one encounter like this actually took place, the cops pulled us over and then we did the 5 euro magic trick and, as we were preparing to leave, a moron with his trailer door unlocked passes by us and cracks the left rear-view mirror with the aforementioned door. I am grateful that the mirror did not break, that the metal door only hit the mirror and not the car door or (I might add) a child's head or something like that.

Anyway, we traveled all day through Bulgaria in order not to stop (we still gave credit to the third world country hypothesis above) and I took some pictures of what I think was beautiful: green forests on small mountains, long tunnels and bridges, nice straight perfectly asphalted roads (with 40 km/h speed limits on them!). I am not the world's greatest photographer and I have to sift through all the stupid pictures, but I promise I will update this post with media in a few days.




The other incident on our way to Greece was in Sofia. Apparently the ring road around the city was under (re)construction and we had to take a detour. The detour was not clearly marked in any way and the only thing the Bulgarian cop that directed the traffic had to say was "follow that car", showing towards one that was just leaving and which had a more enlightened driver in the way of the Bulgarian language. It all went nicely until the said driver decided to pull over for some reason. We followed the small serpentine road, took some guesses on which direction to take later on and quickly got lost. The GPS we had with us had only the most basic maps loaded so when we left the road it knew, we were pretty much in the Wild West.

At this time my wife decided to go through a PM moment and started shouting at me, at the GPS and blame everything on me. In this kind of emotional state trying to use logical reasoning only works to enforce the idea that I am not empathetic to her feelings and only opaque to the obvious truth that everything that ever went wrong is my fault. The GPS was of no use, the map showed very clearly that we were dangling on the vertical line of the letter F in Sofia and we were going nowhere. Since getting angry would not help, making her more angry would make her more expressive by use of car throttle and breaks and since I didn't want to die I agreed that it was all my fault, lack of preparedness, a lot of laziness and that I was very sorry for it. Then I tried directing the conversation towards a solution.

I mean, how bad could it be? We were next to the darn capital of the country, where could we get lost? At a moment where the panic was going bubbly bubbly on the seat next to me, I got to read a sign that pretty much placed us on the map of Bulgaria we brought with us and this time not on any of the capital letters on it (capital letters, get it?). So we went on a small road that was parallel to the one we should have been on and (at least in my opinion) were fortunate enough to see raw country, beautiful scenery and not to many cars. Of course, the panic ended only 50-60 km or so after, when we were back on the GPS tracked course, but that was still to come.

The next big hop was when trying to decide what road markers to follow. I looked at the map, noticed that the biggest city after Sofia that we were going towards was Blagoevgrad and decided to look for that name. My wife was nagging me constantly that her sister told her we should always go towards Kulata. I could not find any major city called Kulata on the map, so I was skeptical of the information. But we did find Kulata road signs and we followed them until there were none. Did we pass Kulata? Where the hell was Kulata?? Where the fuck was Blagoevgrad?!?

At one time we noticed a big Sofia sign. My wife said we should take it. I didn't understand, we just came from Sofia, what would be the point? She finally (after some shouting from both our parts) articulated that the road going towards Sofia probably comes from somewhere, and we should go that way, once we reach the road. It made sense, but then why would the road sign say only Sofia? What happened to the damn Blagoevgrad? Or Kulata for that matter.

Turns out she was right. People just didn't put all the markers. Why would they? In Romania that would probably happen very rarely, at least our road markers are top of the line (and I was pretty happy with my country at the time). One marker finally told me Kulata was 82 km on the road, so I looked it on the map approximately 82 km from our location. I found it, written with letters about five times smaller than the letters used to spell Blagoevgrad. It was the border town towards Greece. I found it odd; it was like trying to go to Sibiu but finding only Nadlac signs. (they are Romanian cities, mind you).

Well, we did manage to get out of Bulgaria, pretty much upset by the GPS maps, my own performance, Maria's sensitive nerves and the Bulgarian road markers.


Greece (2)

If Bulgaria started up pretty much like Romania in terms of soil and plants, when getting closer the Greece everything got more and more yellow. The soil turned red or disappeared completely, replaced by sun whited rock or yellow-red sediment compression rock. The plants got more and more Mediterranean until only olive trees remained. Imagine a humid air hot, dry soiled, olive tree infested land and you get Greece. They don't have much in terms of railways, so they have a lot of roads. Good roads, only very sinuous, since they have to go up and down a whole range of mountains.



If Bulgarians forgot some cities on their road markings, the Greeks forget the markings completely. You enter small villages or towns and you have no idea where you are. If you are lucky, you find out when you exit. The curves are rarely secured with metal sheeting and sometimes not marked at all. A person could drive into any number of precipices just by missing a turn. Both me and Maria felt that they used "dangerous curve ahead" markings on easy curves, while on the really dangerous ones they used nothing. And to top it all, their writing is both complex, uselessly complicated and there are hardly any markers written in Roman characters. If there are Roman characters markings, they are 10 meters after the Greek ones. My brother in law explained it by a joke: the Greeks are hard headed and need more fore warning. Anyway, it's not that all Greek roads are this badly directed, it's just that some of them really are. And it is shocking to come from a normal, protected, with proper signs and directions on it, road and getting on portions where the signs are missing or wrong and a problem with the steering would probably send you in a beautiful, albeit short, flight.

I knew a little Greek lettering and tried to understand where we were and where we were heading. The GPS was of real help. But it was not without gain. Just by reading the Greek for Exit (Exodos) ,for example, made me realize that both Exit and Exodus are based on the same word.

Our plan was to get to Thessaloniki, visit the city, sleep somewhere, then continue on our way. We got to the city, left the car on a street, asked the people there for the name of the street and how to get to the "White Tower", a construction Maria had heard about that was worth visiting, we were directed there, and started visiting Tessaloniki. Alas, the directions were idiotic, we turned out walking aimlessly through the city, tired, nervous and hot (there were about 35C in the shade at that time).

The city itself was really beautiful. And when I say beautiful, I don't say it lightly. I usually hate sight seeing, I care nothing for buildings and I am interested in the local cuisine more than the local ancient art. But this one was a very balanced mélange of beautiful things. It boasted a great deal of hotels and nice houses and shops, mingled with ruins from the old citadel (which almost no one bothered to mark in any way) having mountains on one side and the sea on the other. Other people that visited Thessaloniki told me they found it crowded with people and didn't enjoy it so much. Maybe it was a good time of the year, but when we visited it, the only people we saw were sitting in outdoor cafés.

A great deal of photos came out of it, but after a while we realized we did not know how to get to the car. I knew where the car was, obviously, and so did Maria. The problem was that our views differed substantially. Tired and in the beginnings of another PM moment, we decided to ask a cabbie where the street where we left the car was. "Do you know English?", the typical Greek answer was "No". On a hunch I asked him if he knew Romanian and turns out he knew more of it than English, since he was married with a Moldavian girl. If you are Romanian, you probably would get a few kicks from seeing a Greek mispronounce Romanian words that he learned with a heavy Moldavian accent anyway. But we got to the car.






The next step was to find somewhere to sleep. We asked in a hotel nearby; they charged 60 euros per night without breakfast. We thought the price might be lower in a motel on the highway. You see, Romania is in the middle of an economic boom. People have and find new business opportunities every day. On the Romanian highways you find a lot of motels, hotels, places to rest, drink or sleep. No, the Greeks had some places to eat and some highway parking places where you could stop the car and fall asleep in it, nothing else. We searched for somewhere to sleep for so long that we got to the point where I was wondering if Maria would fall asleep on the wheel or not.

At one particular bad moment we reached the conclusion to leave the highway and (instead of driving another 40km to Lamia) stop in a place called Sourpi. We immediately found the Greeks gathered around three or more taverns, enjoying their social lives in the relative cool of the night. And just as fast we learned that they have no place for someone to sleep in the whole town! Again, coming with a Romanian mindset I expected some of the Greek people there to offer a place to sleep in exchange for a nominal fee. I was surprised to see that the thought didn’t even cross their tanned little heads. They directed us, though, to a town nearby where they should have had hotels or something like that. The directions sounded like follows: “go 4 km and you will find a biiiig blue sign that says the name of the town (which I immediately forgot, of course)”. After 20 km of pitch black country roads we haven’t found any blue sign. We managed to find a gas station and ask where we could find a place to sleep. They directed us to another town, which boasted two hotels. Enough said, when we found one of the hotels, no one answered the door!

Maria got angry immediately and we went back to Sourpi (in the process finding the biiig blue sign as a little blue tree branch covered tin foil), back to the highway, stopped in a parking and slept there for a few minutes, until we realized that sleeping with the windows closed doesn’t work and keeping the engine running just to have air conditioning wasn’t really cool and also that we care not for mosquitoes. Maria fearlessly drove on. Fortunately her metabolism allows for great surges of energy from just minutes of sleep.

So this is how we got from Bucharest to Sparti in southern Greece in 27 hours, with some visiting, lost and found ways, and some awkward sleeping. (we got some real sleep just before Sparti, fortunately).

See you in the next part, where I explain the horror of driving in small mountain Greek towns, the way they like stony beaches instead of sandy ones and how they live out of tourism, but do nothing to help it out. Also, about the incredible Greek learning system, which pretty much sucks.

This post will be quite lengthy and it will detail my findings on best practices with SQL, specifically Microsoft SQL Server.

I started with an article written by Vyas Kondreddi in 2001: SQL Server TSQL Coding Conventions, Best Practices, and Programming Guidelines. In 2001 people were not microblogging!

Well, to summarize the article and bring it up to date a little, here are some of the most important points (in my view):
  • Decide upon a database naming convention, standardize it across your organization, and be consistent in following it. It helps make your code more readable and understandable.
  • Write comments in your stored procedures, triggers and SQL batches generously, whenever something is not very obvious.
  • Try to avoid server side cursors as much as possible.
    As Vyas Kondreddi himself says: "I have personally tested and concluded that a WHILE loop is always faster than a cursor"
  • Avoid the creation of temporary tables while processing data as much as possible, as creating a temporary table means more disk I/O. Consider using advanced SQL, views, SQL Server 2000 table variable, or derived tables, instead of temporary tables.
    This is interesting, because I usually use a lot of temporary tables in my stored procedures to make the code more orderly. I guess that in the case of SQL Server 2005 and later one can always use Common Table Expressions to make the code more readable. For SQL 2000 and such I found two interesting articles about not using temporary tables and replacing them with either derived tables (selects in selects) or with table variables, although they do have some limitations, thoroughly explained in the latter post. Here are the links: Eliminate the Use of Temporary Tables For HUGE Performance Gains and Should I use a #temp table or a @table variable?
  • Try to avoid wildcard characters at the beginning of a word while searching using the LIKE keyword, as that results in an index scan, which defeats the purpose of an index.
    For a short analysis of index scans go to SQL SERVER - Index Seek Vs. Index Scan (Table Scan).
  • Use the graphical execution plan in Query Analyzer or SHOWPLAN_TEXT or SHOWPLAN_ALL commands to analyze your queries.
  • Use SET NOCOUNT ON at the beginning of your SQL batches, stored procedures and triggers in production environments, as this suppresses messages like '(1 row(s) affected)' after executing INSERT, UPDATE, DELETE and SELECT statements. This improves the performance of stored procedures by reducing network traffic.
  • Use the more readable ANSI-Standard Join clauses instead of the old style joins.
  • Incorporate your frequently required, complicated joins and calculations into a view so that you don't have to repeat those joins/calculations in all your queries.
  • Use User Defined Datatypes if a particular column repeats in a lot of your tables, so that the datatype of that column is consistent across all your tables.
    Here is a great article about Sql UDTs (not the new .NET CLR types): What's the Point of [SQL Server] User-Defined Types?. Never used them, myself, but then again I am not an SQL guy. For me it seems easier to control data from .Net code
  • Do not let your front-end applications query/manipulate the data directly using SELECT or INSERT/UPDATE/DELETE statements. Instead, create stored procedures, and let your applications access these stored procedures.
    I am afraid I also fail at this point. I don't use stored procedures for simple actions like selecting a specific item or deleting a row. Many time I have to build search pages with lots of parameters and I find it really difficult to add a variable number of parameters to a stored procedure. For example a string that I have to split by spaces and search for all found words. Would it be worth to use a stored procedure in such a situation?
  • Avoid dynamic SQL statements as much as possible. Dynamic SQL tends to be slower than static SQL, as SQL Server must generate an execution plan every time at runtime.
    Personally, I never use dynamic SQL. If I need to create an SQL string I do it from .Net code, not from SQL.
  • Consider the following drawbacks before using the IDENTITY property for generating primary keys. IDENTITY is very much SQL Server specific, and you will have problems porting your database application to some other RDBMS. IDENTITY columns have other inherent problems. For example, IDENTITY columns can run out of numbers at some point, depending on the data type selected; numbers can't be reused automatically, after deleting rows; and replication and IDENTITY columns don't always get along well.
    So, come up with an algorithm to generate a primary key in the front-end or from within the inserting stored procedure. There still could be issues with generating your own primary keys too, like concurrency while generating the key, or running out of values. So, consider both options and go with the one that suits you best.
    This is interesting because I always use identity columns for primary keys. I don't think a data export or a database engine change justify creating a custom identity system. However I do have to agree that in the case that data is somehow corrupted a GUID or some other identifier would be more useful. I am sticking with my IDENTITY columns for now.
  • Use Unicode datatypes, like NCHAR, NVARCHAR, or NTEXT.
  • Perform all your referential integrity checks and data validations using constraints (foreign key and check constraints) instead of triggers, as they are faster.
  • Always access tables in the same order in all your stored procedures and triggers consistently. This helps in avoiding deadlocks. Other things to keep in mind to avoid deadlocks are: Keep your transactions as short as possible. Touch as few data as possible during a transaction. Never, ever wait for user input in the middle of a transaction. Do not use higher level locking hints or restrictive isolation levels unless they are absolutely needed. Make your front-end applications deadlock-intelligent, that is, these applications should be able to resubmit the transaction incase the previous transaction fails with error 1205. In your applications, process all the results returned by SQL Server immediately so that the locks on the processed rows are released, hence no blocking.
    I don't have much experience with transactions. Even if I would need transactions in some complex scenarios, I would probably use the .Net transaction system.
  • Offload tasks, like string manipulations, concatenations, row numbering, case conversions, type conversions etc., to the front-end applications.
    Totally agree, except the row numbering, where SQL 2005 added all those nice Getting the index or rank of rows in SQL Server 2005 aggregate ranking options
  • Always add a @Debug parameter to your stored procedures. This can be of BIT data type. When a 1 is passed for this parameter, print all the intermediate results, variable contents using SELECT or PRINT statements and when 0 is passed do not print anything. This helps in quick debugging stored procedures, as you don't have to add and remove these PRINT/SELECT statements before and after troubleshooting problems.
    Interesting, I may investigate this further, although the SQL debugging methods have improved significantly since the article was written.
  • Make sure your stored procedures always return a value indicating their status. Standardize on the return values of stored procedures for success and failures. The RETURN statement is meant for returning the execution status only, but not data. If you need to return data, use OUTPUT parameters
  • If your stored procedure always returns a single row resultset, consider returning the resultset using OUTPUT parameters instead of a SELECT statement, as ADO handles output parameters faster than resultsets returned by SELECT statements.
  • Though T-SQL has no concept of constants (like the ones in the C language), variables can serve the same purpose. Using variables instead of constant values within your queries improves readability and maintainability of your code.



The next stop was SQL Server Best Practices from Microsoft.

Here are the articles I found most important, covering stuff from testing the I/O system of the system you want to install SQL server to up to Database backup, mirroring and maintainance:
Predeployment I/O Best Practices
SQL Server 2005 Deployment Guidance for Web Hosting Environments
SQL Server 2005 Security Best Practices - Operational and Administrative Tasks
Comparing Tables Organized with Clustered Indexes versus Heaps
Troubleshooting Performance Problems in SQL Server 2005
Implementing Application Failover with Database Mirroring
SQL Server 2005 Waits and Queues
TEMPDB Capacity Planning and Concurrency Considerations for Index Create and Rebuild
The Impact of Changing Collations and of Changing Data Types from Non-Unicode to Unicode
XML Best Practices for Microsoft SQL Server 2005
Performance Optimizations for the XML Data Type in SQL Server 2005
Top 10 Hidden Gems in SQL Server 2005

Lastly some links that I will not go in depth on:

SQL Server 2000 Best Practices
SQL SERVER - 2005 Best Practices Analyzer Tutorial - Sample Example describes the Microsoft Best Practices Analyser application. I tried it myself, it's not much. It touches mainly on the maintainance and security issues that I don't really concern myself with.
Top 10 Best Practices for Building a Large Scale Relational Data Warehouse. I don't think I will need it soon, but it is a short and interesting read.
SQL Server Pre-Code Review Tips. This Pinal Dave guy is pretty cool. He seems like a good resource for SQL related issues.
CMS Database Administration SQL Server Standards, a set of SQL coding standards for a medical government agency.

I am sure there are a lot of interesting resources on the net. I will update this post with new information once I get to it.

and has 0 comments
A year ago I wrote about being a bicycle rider in Bucharest. I complained then that there are no bike lanes and no one gives a damn about bicycle riders or the very law that should protect them. Things have changed, apparently, and now beautiful bike lanes are criss-crossing Bucharest's sidewalks. But it is all for show and appearance.

First of all, they serve no purpose on the sidewalk. Given the peculiar psychology of the majority of the population when they have to choose between walking on a nicely marked yellow/green stripe and the normal gray sidewalk, they will walk where the nice colors are. Even if they would somehow decide to think a little and ponder on the significance of the big bike signs painted on those lanes, there are children that have no idea what they are doing and could always jump in front of you. Normally, the population of the bike lanes in bucharest is comprised of mothers with babies, lovers holding hands, old ladies and people that just wouldn't give a damn. Very often I see young stylishly dressed women walking right towards my bike, ignoring me completely, expecting me to move aside. Do they even consider the damage that I would do if I'd just decided on a whim NOT to move aside? Not to mention places where there is space only for the bike lane and it would be stupid to expect people not to walk on it. And of course, the cars that park right on the lanes and about nobody does anything.

Second of all, the lanes were built close to autumn last year, a season not favourable to biking. Then, of course, winter came, and the plastic like stripes that mark the lanes were pretty much destroyed. So they had to put them again. However, during the spring they started working on fixing the streets. That meant scraping the asphalt (bike lanes on the street included) and puting it back on. But they did draw the lanes back on. Then they started changing the street border stones, usually placing them idiotically high right on the bike lane. And if it wasn't enough, they started placing all above ground wires under ground. That meant digging narrow, yet deep trenches in the sidewalk, interrupting the lanes from side to side, so that there is no way to go around, and they never filled them up! Basically every one in two bike lanes is now broken by this. And, as this was not enough, more often than not the lane is of worse quality than the rest of the sidewalk.

Therefore I will ignore these lanes completely, except the days when I am really tired and don't trust myself around cars, and risk my life and the paint on the cars around me rather than the lives of the people on the sidewalk. What a sham this all is. The Bucharest European mask is there only for outsiders, NOT for the people living in it.

and has 0 comments
There are a lot of movies about aliens, creatures from another world, coming here for whatever reason and trying to communicate. They usually are well versed in English, but sometimes they use some other language like the Klingons or they snarl and rip you to pieces or, sometimes, have to find a protocol of communication first, by using mathematics, gestures or music (like in Close Encounters of the Third Kind). Yet none of those creatures astound me more than some of the people on Earth doing things I could never ever imagine doing and using it to communicate.

One of these people is Michael Moschen, who uses juggling as language of sorts in order to comunicate his perception of time, space and movement. You can watch a small demo he gave at TED and have your own say:



You can see that he uses separate elements to create, to build, larger ansembles. He uses juggling moves like a language, with structure and building blocks and architecture. Now, what would we do if aliens would want to talk to us by moving objects around and making sounds with their limbs? Would be build a computer that can be programmed by juggling? Would we immediately fly in Michael Moschen as the Earth ambassador? Or is it too science fiction to imagine alien creatures communicating in the same way some people do?

and has 1 comment
As a software developer with no formal training, I sometimes feel humbled by the more standardised approaches to programming like, for example, Test Driven Development or TDD. But I think that today I finally figured it out.

You see, TDD is supposed to "cover your code" with tests. Once all your tests run without fail, you know that you can focus on other parts of the code, like refactoring, interface or performance improvements or on new features. But what it actually means is a simulation of your client and/or debug person. Once you automatically simulate a client, you can make sure it is satisfied before you move on to the real person. And this is also where the whole thing fails, because it is obviously impossible to simulate a human being without real effort that surpasses the building of the very software you are trying to test. It would be fun to actually do it, then watch the software complain on its own functionality. If any software is going to take over the world, one that emulates an annoying client probably will.

One of the hardest parts to simulate is the work with the interface. No test will ever be able to look disappointed while expressing a lack of enthusiasm on your choice of colors. It is even harder to test web interfaces, although software that can test some of the behaviour of web apps and sites exists, with limited functionality. Also, it is impossible to test for functionality that is not there.

A good use of tests is to address (and in this way document) the bug findings! When you see a bug, you create a test that fails because of it, then you fix the bug. Also, by trying to cover as much of your code with the tests, you get to formalize the access to your code and also are forced to decouple interface from code. No wonder that all the test frameworks are used for Unit Testing. Once you can create a unit or a library of code with no other inputs or outputs than data types, you can test the hell out of it.

But it still leaves the interface out. I have been thinking of ways of describing the test procedure not in code, but in English, something like a unit test for a person rather than a testing framework. This can be further automated, where possible, or just followed by a dedicated tester.

What I would really be interested in would be a general way of creating tests for recurring bugs. A sort of code policy enforcement, if you will, but one that would test for the same bug multiple applications. Can it be done without also formalising the structure of those applications?

and has 0 comments

Agile development is something of a growing software culture. Every dev team is trying to become agile. Programmers I know working like that are all happy and evangelizing the concept as the best thing since the fire simulation algorithm. The word is that Agile gives control back to the developer.

So, what does a code monkey have to do to become agile? (and no tree algorithm jokes here, please!). As experience dictates, Google for "become Agile in 11 seconds" and see what tools one can download and integrate in the personal toolbox! Surprise! There are tools, but they only help you when you are already agile. WTF? It was supposed to be a developer empowering thing!

Actually, this has an only marginal connection to the developer. Agile development is actually a management strategy. No programmer can become agile without the support of their manager. Management in itself is the application of scientific methods to achieve business goals, which are, almost every time, to maximize profits. You see, managers have noticed that they could hardly quantify programmer work. Software development was becoming more artsy and less scientific as technology grew ever faster and more complex.

The typical development cycle of a piece of software is to plan it (sort of) do stuff to it depending on the planning (which always results in changing the original plan or ignoring it altogether), then show it to the customer. They will, almost every time, just applaud and ask you "ok, this is nice (albeit full of bugs), but where is what I wanted?". The manager then gets scolded for not doing their job. But how could one possibly know what the client dreamed of when they said something completely different at the start?

So, what does a manager do when they have a big problem they can't get their hands on? They split it in smaller problems! Divide et Impera! said the Latin managers of old. So the Agile solution was to copy the development process in its entirety, make it as small as possible, then repeat it until it reaches the original size. It's like when you kill the monster at the boss level and he splits in many small bosses (let's call them middle managers) that you have to kill individually to continue the game. Hopefully I have explained this in a way most code monkeys would understand :).

What about empowering the developer? It was a really nice side effect, one that was taken into consideration at the beginning, of course, but I am sure exceeded the expectations of the designers of the process. You see, at the end of each iteration the application should work, somehow, and also be tested, documented, code reviewed and client approved. The client will undoubtedly notice a discrepancy between what he wanted and what was produced, but he can give feedback a lot sooner than at the end of the project. The developer doesn't have to work their ass off to finish the product, sometimes ignoring the most basic testing or documenting techniques in favour of speed, and then be forced to start work almost from scratch because the client either changed his mind or was not understood properly. Therefore there is an increase in motivation and thus productivity and a decrease in unnecessary work. This is also incorporated in one the agile principles YAGNI, which is actually a really buzzy and ugly acronym for "you aren't gonna need it" - in other words, do the least work to achieve the exact desired result.

But most importantly, this is a managerial process, one that is now easy to analyse and even quantify (since the idea to do as much automated testing as possible). If the bugs are too numerous, then testing must be improved. If code is too obscure, code review and refactoring must be done. If nobody knows how to use the product, documentation is needed. But only for the last small bit that was done. Even more cool, the documentation, code review and even refactoring can be done on the code from the previous iteration, while coders are working on the current one!

So, to summarize: to be agile means that your management has decided on a new strategy and you understand the principles enough to get the tools that would make it easier to work under them as well as design your applications to neatly mold to the concept. It does NOT mean you get some library or development tool and it does things for you. There is not an agilizer application (yet? :) take a look at Pex) and the different software patterns like MVC or MVP are used to facilitate the technical solution found to solve the managerial problem of quantifying results (in this case quality) which is Unit Testing.

It's not that Agile Development is not a good idea. Managers don't really see eye to eye with programmers because they have completely different goals - managers see things from the business perspective while developers see it from the beauty and functionality of code. It's like physicists and mathematicians all over again - but both are (or should be) scientific types that try to solve problems in the best possible way. Agile is a happy intersection of their goals, but as it happens, must be implemented in both worlds simultaneously.

and has 0 comments
There are a lot of things I want to blog about right now, but I'll start with this, since it is at the root of all the other articles I want to write. What is time management all about? It's about making use of those bits and small crums of free time!

I mean you wake up in the morning, you do what you need to do: make the bed, wash, pet the pet, wife the wife, make the meal, eat the meal, read your emails and blogs, etc... and you are left with about 17 minutes of extra time. If you leave home you get to the office too early, if you watch a TV series episode you leave in 50 minutes and you get there too late. You can't read a book, because that would mean make yourself confortable, open the book, get in the atmosphere of it, then get out of it and leave through the front door in 17 minutes. It can't be done and let you feel good about it. So, what to do?

My first choice is audio podcasts. I download a few (related to programming, but that's my personal interest), all in MP3 format, I choose one every morning and copy it on my cell phone. I use the handsfree to listen to it and that's it. In an ideal world I could do that while washing, making the bed, cooking the meal and eating it, but then I would mess the wife and pet part. Even so, audio files will run through the 17 minutes, through you leaving the house, walking to the car or bus or tram or even directly to the office, during the trip with any means of transportation and up until you get to the office.

Ok, you're in the tram, right in the middle of the distance between home and office and the podcast ends. You have a small cell phone with capacity for only one podcast or you ran out of battery. What to do?

My second choice: a PDA. I am using an 5 year old PDA, one that is black and white, has no screen backlight, it was a present from my uncle (Thanks, Alex!). I use a simple text reader like HandStory to read text books. The advantage is that the battery holds a lot (no cell or Bluetooth capability or graphics or lights to consume it) and you leave the book in the exact place where you stopped reading. Yes: turn PDA on, continue reading, turn PDA off. That means zero time consumed on finding the book, the page, the paragraph. The PDA comes with it's own protective casing and it fits perfectly in my jeans pocket. I can have tens of books on it and I need to recharge it once a week or even two weeks.
Of course, a new PDA could be used both as an audio player and a book reader.

So we've covered staying in touch with the world evolution with audio files and keeping literated by using text books. What's next? Video! In theory you could use the PDA for video feeds, but that would be pointless, in my opinion, since you cannot watch video while walking and something really small cannot give the output that is required for comfort. But that's me.

Anyway, I plan to write an entire article about open courseware next, but you may already know what I am hinting at. Use open courseware videos or video presentations on your computer while you are waiting for programs to compile, in the office lunch break or even in the background while you work. If something needs video, you can switch quickly, rewind a little, and see it done. You can watch parts of it before you leave for work or while you are eating when you come back.

And there you have it. Every single moment of your day can be used to absorb information. What are the downsides? Besides the obvious medical issues like reading or watching something on a screen every single moment (I don't have problems with this yet and I've been kind of glued to the screen for at least 10 years), there is the absorbtion capacity problem. At times you will feel totally wasted, tired, stupid, nothing works, you don't get the world around you, it's like your IQ has droppped a few stories to a neighbour below. Well, in that case TAKE A BREAK! Yes, that's all that is required. Take a day off or spend a weekend day doing absolutely nothing. With so many distractions around you, it will be difficult, especially after you've trained yourself to gobble down information, but think of it like jogging. Even if you manage to do it for half an hour, there is a small moment when you need to stop in order to continue running. Walking fast doesn't cut it, you need to stop.

Happy gobbling! :)

Warning: this is going to be one long and messy article. I will also update it from time to time, since it contains work in progress.

Update: I've managed to uncover something new called lookbehinds! They try to match text that is behind the regular expression runner cursor. Using lookbehinds, one might construct a regular expression that would only match a certain maximum length, fixing the problem with huge mismatch times in some situations like CSV parsing a big file that has no commas inside.

Update 2: It wouldn't really work, since look-behinds check a match AFTER it was matched, so it doesn't optimize anything. It would have been great to have support for more regular expressions ran in parallel on the same string.

What started me up was a colleague of mine, complaining about the ever changing format of import files. She isn't the only one complaining, mind you, since it happened to me at least on one project before. Basically, what you have is a simple text file, either comma separated, semicolon separated, fixed width, etc, and you want to map that to a table. But after you make this beautiful little method to take care of that, the client sends a slightly modified file in an email attachment, with an accompanying angry message like: "The import is not working anymore!".

Well, I have been fumbling with the finer aspects of regular expressions for about two weeks. This seemed like the perfect application of Regex: just save the regular expression in a configuration string then change it as the mood and IQ of the client wildly fluctuates. What I needed was:
  • a general format for parsing the data
  • a way to mark the different matched groups with meaningful identifiers
  • performance and resource economy


The format is clear: regular expression language. The .NET flavour allows me to mark any matched group with a string. The performance should be as good as the time spent on the theory and practice of regular expressions (about 50 years).

There you have it. But I noticed a few problems. First of all, if the file is big (as client data usually is) translating the entire content in a string and parsing it afterwards would take gigantic amounts of memory and processing power. Regular expressions don't work with streams, at least not in .Net. What I needed is a Regex.Match(Stream stream, string pattern) method.

Without too much explanation (except the in code comments) here is a class that does that. I made it today in a few hours, tested it, it works. I'll detail my findings after the code box (which you will have to click to expand).

StreamRegex - click to expand/collapse


One issue I had with it was that I kept translating a StringBuilder to a string. I know it is somewhat optimized, but the content of the StringBuilder was constantly changing. A Regex class that would work at least on a StringBuilder would have been a boost. A second problem was that if the input file was not even close to my Regex pattern, the matching would take forever, as the algorithm would add more and more bytes to the string and tried to match it.

And of course, there was my blunt and inelegant approach to regular expression writing. What does one do whan in Regex hell? Read Steve Levithan's blog, of course! It was then when I decided to write this post and also document my regular expression findings.

So, let's summarize a bit, then add a bunch of links.
  • the .NET regular expression flavour supports marking a group with a name like this
    (?<nameOfGroup>someRegexPattern)
  • it also supports non capturing grouping:
    (?:pattern)
    This will not appear as a Group in any match although you can apply quantifiers to it
  • also supported are atomic or greedy grouping.
    (?>".+")
    The pattern above will match "abc" but not "abc"d because ".+ matches the whole pattern and the ending quote is not matched. Normally, it would backtrack, but atomic groups do not backtrack once they failed, saving time, but possibly skipping matches
  • one can also use lazy quantifiers:ab+? will match ab in the string abbbbbb
  • posessive quantifiers are not supported, but they can be substituted with atomic groups:
    ab*+ in some regex flavours is (?>ab*) in .NET
  • let's not forget the
    (?#this is a comment)
    notation to add comments to a regular expression
  • Look-behinds! - great new discovery of mine that can match an already matched expression. I am not sure how it would hinder speed, though. Quick example: I want to match "This is a string", but not "This is a longer string, that I don't want to match, since it is ridiculously long and it would make my regex run really slow when I really need only a short string" :), both as separate lines in a text file.
    ([^\r\n]+)(?:$|[\r\n])(?<=(?:^|[\r\n]).{1,21})
    This expression matches all strings that do not contain line breaks, then looks behind to check if there is a string begin or a line break character at at most 21 characters behind, effectively reducing the maximum length of the matched string to 20. Unfortunately, this would slow even more the search, since it would only back check a match AFTER the match completed.


What does that mean? Well, first of all, an increase in performance: using non capuring grouping will save memory, using atomic quantifiers will speed up processing. Then there is the "Unrolling the loop" trick, using atomic grouping to optimize repeated alternation like (that|this)*. Group names and comments ease the reading and reuse of regular expressions.

Now for the conclusion: using the optimizations described above (and in the following links) one can write a regular expression that can be changed, understood and used in order to break the input file into matches, each one having named groups. A csv file and a fixed length record file would be treated exactly the same. Let's say using something like (?<ZipCode>\w*),(?<City>\w*)\r\n or (?<ZipCode>\w{5})(?<City>\w{45})\r\n or use look-behinds to limit the maximum line size. All the program has to do is parse the file and create objects with the ZipCode and City properties (if present), maybe using the new C# 3.0 anonymous types. Also, I have read about the DFA versus NFA types of regular expression implementations. DFAs are a lot faster, but cannot support many features that are supported by NFA implementations. The .Net regex flavour is NFA, but using atomic grouping and other such optimizations bridges the gap between those two.

There is more to come, as I come to understand these things. I will probably keep reading my own post in order to keep my thoughts together, so you should also stay tuned, if interested. Now the links:

.NET Framework General Reference Grouping Constructs
.NET Framework General Reference Quantifiers
Steve Levithan's blog
Regular Expression Optimization Case Study
Optimizing regular expressions in Java
Atomic Grouping
Look behinds
Want faster regular expressions? Maybe you should think about that IgnoreCase option
Scott Hanselman's .NET Regular Expression Tool list
Compiling regular expressions (also worth noting is that the static method Regex.Match will cache about 15 used regular expressions so that they can be reused. There is also the Regex.CacheSize property that can be used to change that number)
Regular expressions at Wikipedia
Converting a Regular Expression into a Deterministic Finite Automaton
From Regular Expressions to DFA's Using
Compressed NFA's


There is still work to be done. The optimal StreamRegex would not need StringBuilders and strings, but would work directly on the stream. There are a lot of properties that I didn't expose from the standard Regex and Match objects. The GroupCollection and Group objects that my class exposes are normal Regex objects, some of their properties do not make sense (like index). Normally, I would have inherited from Regex and Match, but Match doesn't have a public constructor, even if it is not sealed. Although, I've read somewhere that one should use composition over inheritance whenever possible. Also, there are some rules to be implemented in my grand importing scheme, like some things should not be null, or in a range of values or in some relation to other values in the same record and so on. But that is beyond the scope of this article.

Any opinions or suggestions would really be apreciated, even if they are not positive. As a friend of mine said, every kick in the butt is a step forward or a new and interesting anal experience.

Update:

I've taken the Reflected sources of System.Text.RegularExpressions in the System.dll file and made my own library to play with. I might still get somewhere, but the concepts in that code are way beyond my ability to comprehend in the two hours that I allowed myself for this project.

What I've gathered so far:
  • the Regex class is no sealed
  • Regex calls on a RegexRunner class, which is also public and abstract
  • RegexRunner asks you to implement the FindFirstChar, Go and InitTrackCount methods, while all the other methods it has are protected but not virtual. In the MSDN documentation on it, this text seals the fate of the class This API supports the .NET Framework infrastructure and is not intended to be used directly from your code.
  • The RegexRunner class that the Regex class calls on is the RegexInterpreter class, which is a lot of extra code and, of course, is internal sealed
.

The conclusion I draw from these points and the random experiments I did on the code itself are that there is no convenient way of inheriting from Regex or any other class in the System.Text.RegularExpressions namespace. It would be easy, once the code is freely distributed with comments and everything, to change it in order to allow for custom Go or ForwardCharNext methods that would read from a stream when reaching the end of the buffered string or cause a mismatch once the runmatch exceeds a certain maximum length. Actually, this last point is the reason why regular expressions cannot be used so freely as my original post idea suggested, since trying to parse a completely different file than the one intended would result in huge time consumption.

Strike that! I've compiled a regular expression into an assembly (in case you don't know what that is, check out this link) and then used Reflector on it! Here is how to make your own regular expression object:
  • Step 1: inherit from Regex and set some base protected values. One that is essential is base.factory = new YourOwnFactory();
  • Step 2: create said YourOwnFactory by inheriting from RegexRunnerFactory, override the CreateInstance() method and return a YourOwnRunner object. Like this:
    class YourOwnFactory : RegexRunnerFactory
    {
    protected override RegexRunner CreateInstance()
    {
    return new YourOwnRunner();
    }
    }

  • Step 3: create said YourOwnRunner by inheriting from abstract class RegexRunner. You must now implement FindFirstChar, Go and InitTrackCount.
. You may recognize here a Factory design pattern! However, consider that the Microsoft normal implementation (the internal sealed RegexInterpreter) has like 36Kb/1100 lines of highly optimised code. This abstract class is available to poor mortals for the single reason that they needed to implement regular expressions compiled into separate assemblies.

I will end this article with my X-mas wish list for regular expressions:
  • An option to match in parallel two or more regular expressions on the same string. This would allow me to check for a really complicated expression and in the same time validate it (for length, format, or whatever)
  • Stream support. This hack in the above code works, but does not real tap in the power of regular expressions. The support should be included in the engine itself
  • Extensibility support. Maybe this would have been a lot more easy if there was some support for adding custom expressions, maybe hidden in .NET (?#comment) syntax.

This book started great. It outlaid a structured view of how a software company should function, from the way one designs projects, to code and documentation standards. I really hoped this was the mother load: a book that would show me how a "standard" IT company functions on every level. It wasn't. Mark Horner started it well and ended it badly. A shorter book and more to the point would have been enough.

Bottom line, the book starts in an interesting way, describing what I would call "IT gap analysis", in other words the application of a simple idea: begin with a detailed (and documented) picture of what the current (start) situation is, then describe just as much detail the situation you want to reach (end). From then on, the job of describing the transition becomes orders of magnitude easier. That applies to software projects (start with what the client has and needs, then create the plan to bridge the gap), documentation (start with the functional and end with the structural) and ultimately code (start with abstract classes and interfaces, then fill in the missing code).

Other than that there are some (hopefully) nice references, then a lot of empty space filled up with irrelevant things: description of design patterns (which are nice, but there are books for something like this), a glossary of terms (some were never even used in the book!) and then the general way of describing something, then adding the "Standard acknowledges" part that basically says the same thing as his own description. It generally felt as a student paper from one that needed only a passing grade.

Sorry Mark, better luck next time. I will add here a short summary of what yours truly thought was noteworthy in the book:
  • use gap analysis for all the levels of your software work. When you define what you have and what you need, filling the blanks becomes easier.
  • use functional documentation, design documentation and structural documentation to detail what you wanted the software to do, how you designed to solve the problems and what are the basic building blocks of the project (classes, patterns, etc).
  • use code standards and peer reviews and even external code auditing to improve the quality of code. Refactoring is a must. Popular code development methodologies include Extreme Programming and Rational Unified Process.
  • use a design standard like the open-source architecture framework (TOGAF)
  • the enterprise vs. domain dichotomy. Should a software be started from scratch and done for the current set of requests only, or should it be designed as a general component ready for reuse? I would really go towards the enterprise, even when the profit from the extra work is not immediately obvious. Sometimes things that you have prepared in advance and nobody acknowledged become a real time (and life) saver when unreasonable requests tumble down upon you.
  • also linked to the enterprise/domain issue: an application framework solution. Create a basic Visual Studio solution that contains common components used in many projects and use it as a startup solution.
  • use the Visual Studio formatting options to keep your code well formatted. Use a standard of naming variables, methods, properties. My own choice is using lowerCamelCase for inner variables, prefixing the name with an underscore for fields. UpperCamelCase (or Pascal) for methods, properties and class names. Hungarian notation for controls (lbName for a label with a name). I don't really care if one names the control txtName, tbName or tboxName, as long as the prefix is revealing.
  • use the Obsolete attribute for methods and properties that are intended to be removed in the near future. In my own library I have used methods that became obsolete with the coming of .NET 2.0 and used this attribute to point not only to the obsolescence, but also to the blog entry detailing the reasoning behind it.
  • this is basically derived from other sources, but I do think it is relevant: best practices recommends using composition over inheritance, wherever possible. I admit that the coding of composition is much more complex, but with the refactoring tools found in Visual Studio and its add-ons (like my beloved Resharper), it becomes similar in complexity.
  • references:
    1. book: Programming C# by Jesse Liberty, published by O'Reilly
    2. dude: Martin Fowler is a leading authority on refactoring
    3. books to understand object-oriented development: Object-Oriented Analysis and Design with Applications by Grady Booch, published by Addison-Wesley in 1994
    4. Expert C# Business Objects by Rockford Lhotka, published by Apress in 2003
    5. book: Code Complete, by Steve McConnell, published by Microsoft Press 2004
    6. authorities on design patterns: Martin Fowler, Gregor Hohpe, Bobby Woolf
    7. dude: professor Trygve Reenskaug and his discussion on the role of object collaboration: Role Modeling and UML-VM discussions


My conclusion: read my summary and you don't waste two days of reading time.

and has 3 comments

I was bent on writing an article about tea. You see, tea :) is a word often used instead of "infusion", but the definition of the word says it is specifically an infusion of Camellia sinensis, or the tea plant. I drink tea a lot, although I prefer to alternate the different tastes as much as possible.

But the tea and coffee plants are far from being the only ones used for energizing drinks. In the Theaceae family alone there are a few species that are traditionally used for infusions.

Then there is the mate, from Yerba Mate, a species of the Holly (Ilex) family. 
Other members of the Ilex family are used for traditional drinks.

The Roiboos infusion is an African tea made from a plant that is part of the legume family! I've tried it and I didn't enjoy it much.



How about a little Coca to boost the spirit? The "Coca tea" or "mate de coca" is a traditional drink in the Andes.

You can try Bubble tea made from Tapioca, the processed root of the Cassava plant.

All these links are giving me headaches, but there is more! The stuff above is just the tip of the iceberg, or the most famous plant infusions that are known as tea, because there are all the other plant infusions that are covered by the more generic term "Herbal tea". On that particular page you can find over 60 herbal infusions not made from the tea plant, including mate.

Please follow the plethora of links as I can assure you you will find a lot of interesting things there. This also got me thinking of the way the markets are functioning right now. I drank about every possible tea I could commercially find without looking too deep and I've only experienced tea and mate infusions. How about all the others? When will I be able to drink tapioca tea or coca tea? The plant itself is not illegal! Perhaps deeper digging in the commercial part of the Internet will help me find sources for some of the drinks above. Also, if I only had the time, I would try to learn about herbalism.

Eh, enough of this. Now I must add the images to the post and hopefully someone will read it.