Wednesday, July 27, 2011

Concurrency issues in real life

"Non-determinism comes from parallel processing and mutability" (Martin Odersky)... true for information systems and real life also.
This was the tweet I posted on midnight of 27th July 2011 to my twitter followers, while watching this video: O'Reilly OSCON Java 2011, Martin Odersky, "Working Hard to Keep It Simple".
I immediately thought that this phrase is a compressed dose of a great portion of wisdom. The art of information systems architecture and real life seem to have many things in common.

Real life could be multithreaded:

Thread 1: Health
I consider health to be the most important thing in our lives. And health depends of course of the conditions in the environment where we live. We live in a city and we prefer to spend some weekends and some holidays at the country side. We get sweat in the summer and we get cold in the winter interchangeably. The quality of the air we breathe and the water we drink is changing. And of course we need more regular physical exercising.

Thread 2: Family
Being a man, you know that your wife's character is more floating than you would expect. Living with another person always takes some tries to keep the moods in sync. Problems begin when one person is equiped with happiness while the other is seized by sadness.

Thread 3: Job
As a dangerously enormous part of our timeline, job significantly qualifies our lives. We may feel productive or we may feel stressed from a deadline. We may be satisfied of the subject, the conditions and the colleagues, or we may need a change of workplace, or even a change in our career.

Thread 4: Friends
Friends bring a great balance to our lives. Like family persons, friends are also persons who need to get and who can give sadness and happiness interchangeably.

Thread 5: Money
Since everything in life ended up to be needed to be measured somehow, we got money, and we got selling, buying, lenting and renting transactions. Sometimes, for some months, your salary is not enough to pay the bills. Some other times, unfortunately fewer, you may be surprised of the balance of your account, because you managed to spend less in that month.

And there are more than 5 "threads" in real life, all manageing:
a. mutable qualitative data as emotional states and
b. mutable quantitative data as money.
Unfortunately our brain is one "physical processor" with several "logical cores" but all of them have to use the same "shared memory"... So, all people have to deal with mutable data while processing threads in parallel.

Apparently, real life is naturally non-deterministic because it has to deal with parallel processing of mutable data. But, a software engineer should design information systems in a completely different way. An information system should be deterministic, so, it has to build a shield against parallel processing and mutable data.

Concluding, a deterministic information system allows the software engineer to:
1. take more time to take care of his health,
2. spend more time with his wife,
3. prepare better deliverables in time,
4. drink beers with his friends,
5. produce more in less time.

Wednesday, July 13, 2011

A year full of passion

I just turned an exciting year on my current job at www.xe.gr. I feel that much happened during this year, and now it's time for an account of things done, and scheduling tasks to be done in the future.

During this year:
1. I contributed to an e-commerce application and its shopping cart.
2. I got introduced to the Restless services, and implemented a restless API.
3. I found out that there are JSP alternatives, that are better for front-end developers.
4. I discovered the power of dynamic languages. Perl, Python and Scala are now in my immediate interests.
5. I realised that Tomcat servlet container can do the job as an "application server". JBoss, Websphere and Weblogic are great application servers for those who don't care about the overhead (or configuration) of preinstalled frameworks.
6. I dropped my absolute belief to relational databases as Oracle and MySQL, as I discovered NoSQL databases as MongoDB and Cassandra.
7. Now I am aware of over a hundred open source projects that can be usefull and I must use during my career.
8. I studied many lines of bad written legacy code, and I supported it.
9. I was introduced to the agile development process, and especially to Extreme Programming.
10. I used 2 major bug tracking systems professionally: Bugzilla and JIRA.
11. I created an account to a social network for professionals: linkedin.com
12. I created my account on twitter and twitted about 50 times.
13. I dropped an eye out of the box and I saw Javascript can be a server side programming language.
14. I decided to regulary attend the meetings of 2 user groups: jhug (Java Hellenic User Group) and greecejs (greek javascript user group).
15. I first used Maven as the build tool of my projects.
16. I extensivelly used subversion for versioning.
17. I created my account at github, started 2 new open source projects and started learning git for versioning.
18. I recently acquired an android smartphone, so, I started using mobile internet and I read more using the kindle application.
19. Now I can see much more potential in the smart mobile devices, and as a result I care more about mobile software development.
20. I purchased about 15 ebooks and 5 printed books about software development.

Phew! Pretty awsome and fascinating year!
And there is more...
I met great people with great personalities, who communicated their invaluable experiences and their interestingly different point of view.
I made some friends, and I spent great time lunching and drinking beers.

At the personal level, I admit that the current and the next year will be the greatest years of my life because in a few months I will take the greatest responsibility of my life: being a father.

Monday, July 11, 2011

Importance of Testing

To all hard working programmers around the world, I should verify this principle:
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.

No, this is not a blog post full of unnecessary repetitive nonsense. It's a priceless truth that should be burnt in your mind as you decided to be a coder for a living.
Don't ever, EVER forget this.