A picture says a 1000 words. This is quite true even of UML, the Unified Modeling Language that’s used as a diagrammatic representation of software artifacts. One of the key advantages of having a diagram is to convey a lot of ideas with a simple glance. Diagrams usually simplify one’s perspective, and can give a holistic view of the entire system where one may can instantly and intuitively see how different aspects are related.

For some engineers, career growth may mean getting into people management – leading bigger and bigger teams of people. There are some of us who like to stay rooted in technology, and even as an individual contributor, growth of course is still inevitable. Apart from being fun, it is a fundamental necessity to avoid the decay of stagnation.

In any case, one of the key areas we need to grow is in our ability to communicate ideas to others.

UML provides an effective means to help us do just that. The diagrammatic notation enables engineers to communicate aspects of the entire software lifecycle, and is intuitive enough to give even those unfamiliar with the notations a fairly good idea.

Sequence Diagrams are one of the types that depict a time based flow of events. Here’s a nice tutorial by IBM Developerworks, and another one on the agilemodeling site.

Long long ago I used to use Rational Rose, that was a pretty cool and intelligent tool to work with UML. This usually was purchased with a limited floating license, which meant that one of us on the network had to close it in case another one wanted to use it πŸ™‚ Once it was taken over by IBM, an organisational policy discontinued its use. An alternative we had was Microsoft Visio. This was a very very far cry from the intelligence and flexibility offered by Rose, and our average quality of diagramatic representation deteriorated to convenient block diagrams. Visio did provide good templates and support for UML, but seemed to usually be completely out of sync with any kind of understanding of what I wanted to do and quite a few times I found myself fighting with it esp for Sequence diagrams with dragging the mouse around resulting in items elusively moving around! (I found that changing some of the default settings made things easier, more info on the arcane topic available on request)

Anyway currently I have a license for neither Rose nor Visio, so to create some sequence diagrams now, I needed to look for something new. As I’m short of time, before that I first gave Microsoft Word drawing a try (aaack even though I could find workarounds like grouping text boxes and making everything I need in one place, and kept making copies of them, this approach was still horrible!)

Then I tried umlet( heh heh almost sounds like Omlet πŸ˜‰ ) This was an excellent piece of software, I particularly liked the Eclipse integration. The amazing thing about umlet is that it converts simple text into a sequence diagram. So, all the intelligence of putting in the arrows and objects and lines is built into the software 8)

But I got stuck with having no control of object lifelines. The diagrams could be exported as JPG, and I was almost prepared to get into jpg editing using something like Paint (ugh) but luckily found another tool on the net: Quick Sequence Diagram Editor (sdedit).

This was conceptually similar to Umlet, where we enter text and it generates the diagram. But this one was soooo amazingly cool and elegant, using it made me feel like I was literally falling in love all over again! What a lovely piece of software, it definitely saves me tons of time and effort, and especially provides a lot of maintenance and flexibility!

It could be added as an Eclipse plugin as well, I’m sure lots more people would benefit from that added convenience (just a thought, though its good enough for me right now as it is as a standalone).

Try out both these tools, and see which one you like. What follows are just some more details.

One roadblock I hit in sdedit was what seemed to be an inability to specify something that’s being returned – but after a while looking closer at the comprehensive example, it turned out I could use an = sign to display that text. Another problem was that export to JPG resulted in a red tinge (I even tried to explicitly set a white background going to options while exporting, still same output). But export to GIF was perfect (white background). Calling a self-message is forcing an additional return value that comes at the end.

When I’d compromised on that minor annoyance and settled down for this one, I was about to close my umlet window when I suddenly figured out the reason for the lifelines. With every line of text, one needs to put the lifetime of the object to be extended for that one line in a comma seperated list (in the examples there were only two values).

It looked like Umlet is more sophisticated and customizable, while Sdedit text is more lightweight, elegant and readable.

In software engineering, “refactoring” a source code module often means modifying without changing its external behavior, and is sometimes informally referred to as “cleaning it up”.

In particular, adding new behavior to a program might be difficult with the program’s given structure, so a developer might refactor it first to make it easier, and then add the new behavior. Refactoring is also a tool for removing bad code smells that exist in code.

~ Refactoring

what is refactoring?

Refactoring is a disciplined technique for restructuring an existing body of code, altering its internal structure without changing its external behavior. Its heart is a series of small behavior preserving transformations. Each transformation (called a ‘refactoring’) does little, but a sequence of transformations can produce a significant restructuring. Since each refactoring is small, it’s less likely to go wrong. The system is also kept fully working after each small refactoring, reducing the chances that a system can get seriously broken during the restructuring.

~ Martin Fowler’s site on Refactoring

Sometimes code gets messy over time, and investing some time not developing something new, but simply refactoring what already is there, really reduces a lot of time in maintenance results in a significant boost to productivity.

But the most common obstacle for refactoring is “I’m too busy to do it!

And so, given a programming task on some old complicated source code, there are two options. One is to straightaway start with the task – wrangling with timelines, struggling to debug and decrypt the code in order to complete a given task. An other is to spend time in refactoring and sorting things out first (with test cases) and then actually start with the given task. Of course there’s no ‘best’ solution but it depends on the situation.

The first one seems to be the easiest. The second option may require some courage – because there seems to be the somewhat overwhelming risk that it might affect the entire system, introduce new bugs, end up as a dead investment if the refactoring cannot be completed succesfully… all kinds of difficulties!

Socrates had said…

An unexamined life is not worth living.

Not sure exactly what he might’ve meant, but one guess is that he could be talking about refactoring one’s life.

I’ve actually done that gradually over the past year or so, and have found that it has tremendously improved the quality of my life.

For example, a lot of time was being occupied in driving around in traffic. I took up a new job (not the only reason of course) and moved to a new house to live in. Now my new workplace is just 15 minutes drive from home. This is not a single drastic event but happened gradually over time.

One more thing is I gave up ambitions of climbing the corporate ladder gaining a better and better position, to lead other people and so on (and earn higher and higher salary of course!). Instead, I decided my priority was simply to become a “good developer”. Btw this is below the dignity of a lot of software engineers, because compared to a construction industry, programming is like the basic cementing job which freshers from college do. At first this seemed to be a total lack of ambition. But this makes me happy, and I have any interest in impressing anyone with a sophisticated designation πŸ˜‰ And my new job respects this attitude.

Another idea is that 4 to 7 PM is the most beautiful time in the evening, best spent roaming around in a park or on the terrace watching the sunset with my son, instead of sitting in front of a computer. Since I have an option to work from home (depending on the project team situation), I often leave for home around 4 PM and really have a nice outdoor evening either on the terrace. continue working from home when it gets dark. This balances working with the rest of the team in the office, and has an added advantage that it also gives me some extra overlap time with my American colleagues.

The above ideas worked well for me. There are some other things I tried which didn’t work out. But I’m glad I did give them a try, and experimented with life.

Maybe you may not have the same opportunity (to work from home, for example) but you may have other even better possibilities, if only you would examine with a fresh perspective. I would love to hear your experience if you’ve want to try/have tried out anything new.

One thing that this speaker he himself is a world traveller travelling all over the place meeting so many people all over the world… had said “I pity you, you meet the same people – same family members – same colleagues – day after day” But I disagree (and also possibly disagreement was a reaction the speaker hoped to provoke). As long as one manages to avoid getting caught in a mechanical daily routine, one can see the newness in every day and in every person around them! 😎

It made a lot more sense to begin with whatever I have, instead of wishing for something else. I started becoming more sincere about whatever I was doing, including my job. So rather than begin by changing external circumstances, I looked at how I could change the way I was handling them. The external changes happened as a natural consequence, without too much effort.

Jewelry Store Management Portal

April 2008 to May 2008

This project was a Jewelry management portal application in Microsoft .NET based on customizing Microsoft Sharepoint. It had workflow right from importing images, to organizing them and selling the jewelry. Responsible for analysis, interacting and developing along with the customer, extreme programming style. Developed several re-usable components that were useful to other members of the team.

Development Environment: Windows Vista,

Development: C#, Visual Studio 2008, Sharepoint Services.

Technologies: Microsoft SQL Server, Sharepoint

Team Size: 10

Duration: 1 month

Designation: Senior Software Developer

Register – Insurance Claim Registration

March 2008 to May 2008

Summit Register was a project that involved a new technology for Grails that is based on Java. Was the single person who took up complete responsibility for this project, interacted with the US customer and did the analysis and design. At the same time, learnt the new technology, and implemented some proof of concept prototypes. Resilient to ambiguous and fluctuating requirements, worked along with the customer to completed the project successfully. Also provided post-project support and bug fixes.

Along with experimenting, learning and implementing, also took up knowledge transfer sessions with several colleagues. continue reading…

[TODO: open a new site for technical posts or revamp this one so that they don’t get mixed up…!!]

After a long time, thanks to the lovely spirit, opportunity and encouragement I received from my fellow spiders @ spiderlogic, I actually managed to contribute something however insignificant to the GRAILS open-source community.

For a has-many relationship where we need to select one of the existing
options – here is a new checkBoxList tag that can be used.

Check Box List

Label List
tag can be used as well to show the selected items (though
eventually I just added a helper method in the domain object to get the
list as a string).

This is a technical post, I should probably create another site for such things.

Just want to document some problems I came across while trying out some examples from The Definitive Guide To Grails…

class Bookmark {

    static hasMany = [tags:Tag]
   
    URL url
    String title
    String notes
    Date dateCreated = new Date()
}

class Tag {

        static belongsTo = Bookmark
       
        Bookmark bookmark
        String name
}

b = new Bookmark(
        url: new URL(‘http://grails.org’),
        title:’Grails’,
        notes:’Groovy-based web framework’)

b.addTag( new Tag(name: ‘grails’) )

b.save()

These simply did not work, giving the error MissingMethodException, and basically the dynamic methods just weren’t being generated.

To cut a long story short, here are some things that solved the problem:

– In the Groovy plugin for eclipse – Eclipse->Project->Properties->Groovy Project Properties->Turn of the Groovy compiler.

– Disable automatic build in Eclipse, which generates unnecessary classes, that overwrite the groovy dynamically generated classes.

A cryptic error while running from Eclipse :

Cannot execute native2ascii failed.
This can be resolved by running grails runapp once, which does the conversion of native to ascii initially.

Most of the above solutions were at nabble.com though it still involved quite a bit of searching!

If these issues are not sorted out in the development environment,
then one may consider using Eclipse only as an editor, using the command line for grails!

A key point is that the hasMany relationship has been revised as described in GORM – Defining relationships, making addTag deprecated, changed to addToTags

In case anyone has just typed in the code into a groovy console, it might not work as the classes should be defined as proper domain classes using create-domain-class target.

Having programmed for over 10 years in C, C++, COM, DCOM, STL, MFC and .NET right from its pre-beta stage of evolution, as well as Java right from 1.0 in college days, I find Groovy on Grails defining the future of technology. Its based on a very impressive solid foundation (of JVM, Hibernate, Spring) Want to write in more detail later sometime but anyway there’s already enough available out there already!

A hotel is not just a place where travellers sleep, but a United Nations in miniature.

~ Theodore Zeldin’s muse on The Future Of Work

I’ve found the same applies to a software company as well, and I’ve found it more in my own company nowadays – this happens to be one of the key reasons why I’ve enjoyed working here for over 5 years so far. I’ve been able to actually put the above into practice to a reasonable extent, as a lead for a global project where I interact with different people around the world every day. Of course there are some tough exchanges as well when things don’t go well. I’ve found that honesty and openness go a long way in establishing trust and relationships both in professional and home life.

Not sure if what I’m saying sounds over-idealistic, but to highlight that it actually can happen, here’s an example… (name obliterated for privacy reasons)

discussion

The above analogy for a waiter in a hotel could apply to an engineer as well, an engineer could be a peace missionary, promoting global happiness –
how cool is that!! 😎

The future of work has arrived, is now here! πŸ™‚

This is a very old writeup from a few years ago from my older website, which I came across recently again, and am reposting here… Now I have a lot more to say about this topic… but just putting in the old one for now…

Once in a way, I feel software might be a career just to make money while the opportunity is there and then retire and do something else. Especially when we consider the well known related problems such as RSI, eye strain, back injuries, etc. not to mention the vast environmental pollution (plastic CDs, DVDs… esp now with rewriteable use and throw ones).

After all, its sometimes hard to answer the question: how is this helping anybody or improving anybody’s quality of life? How does it make it matter to be involved in this application to keep track of a warranty of some printer that some customer had bought whom I personally dont even have a clue about. Surely there must be more worthwhile investments of time than this? Especially when you compare this with something like for example the medical profession, where doctors cure people’s diseases – or physicists who study about the our universe itself, or come up with something tangible that people actually do something with rather than sit glued to a computer monitor all day…

In “Black Holes and Baby Universes and Other Essays” by Prof. Stephen Hawkings (reknowned scientist and author of A Brief History of Time), he says after a disease and a surgery he was paralyzed, speechless and completely immobile. He still wanted to continue his research.

His communication was reduced to a person flipping through alphabets, and he would raise his eyebrows for the required one. He would write sentences this way – very very slowly.

Then a software programmer sent him a device which would act similarly, and he could use his finger to indicate when the letter was reached.

This was such a breakthrough that its evolution was inevitable… a laptop was replaced by a PC embedded into his wheelchair making him mobile. A screen was eventually replaced by a voice synthesiser – allowing him to speak again!

This man written off by medical science, has been able to go on giving countless speeches all over the world!

Ultimately it does come down to people who actually using whatever we are working on, who could be adversely affected at some other point in time and space in a manner in which we simply cannot imagine now, if we treat what we are doing right now even with the slightest negligience or indifference. But we get so bogged down with the technical details or stress or distractions or so on, that this very key aspect often gets totally forgotten.

Incidents like the one related by Hawkings was a kind of a reminder to me on why I joined this industry in the first place… a belief that software, like everything else, does have its own place in the great scheme of things! πŸ™‚

——————————————————————————–

Some links… (with thanks to those who sent these)

The Software Pyramid

Its interesting what it says about Architects : “A few thousand visionaries sketch out entire systems to handle complex jobs.”

Anyway on a different note… this is a beautiful relevant article … a MUST read for anyone with technical aspirations πŸ™‚

.NET Brings the Architect to the Fore
As .NET helps advance Microsoft technologies in the enterprise, the role of the software architect becomes increasingly important.
by Eric Lynn

Other links…

This article from Deccan Herald I particularly liked :

Upgrade yourself from the world of coding
How does one build a successful technical career? SUBROTO BAGCHI gives nine key factors.

Passion at work by Prof. Arindam Chaudari

The following I’ve meant to read but havent actually really read till now πŸ˜‰ But have gone through them, they look quite promising, maybe worth bookmarking…

Thoughts and experiences from an enterprise software architect – Jorgen Thelin

Microsoft Architects Journal

Independent analysis of Microsoft

It all comes down to 1s and 0s

Having worked mostly in the waterfall software development cycle and just venturing into the agile world – these were quite interesting links…

Refactoring database

Agile Model Driven Development (AMDD): The Key to Scaling Agile Software Development

This was one of the really cool tips from Steven’s presentation. I used to play this game in my childhood when my cousin sister had gifted us this from the US. Now I am sometimes apalled when I see developer’s struggling to find simple problems in any code, and was wondering how I could help them improve this skill.

As Steven (SQL training program) highlighted, this game really develops one’s debugging skills, and he strongly advocated this for every developer to play even at company time πŸ˜‰

You can give it a try – itÒ€ℒs simple, and I could find a nice one online.

Below are the rules from google…

—–

Object of the Game
The computer picks a sequence of 4 pegs, each one being one of any of six colors.
The object of the game is to guess the exact positions of the colors in the computer’s sequence in as few guesses as possible. After each guess, the computer gives you a score of exact and partial matches.

Rules
1. The sequence can contain pegs of colors: red, yellow, green, blue, white, black
2. A color can be used any number of times in the sequence.
3. All four pegs of the secret sequence will contain a color – no blanks/empties are allowed.
4. Each guess must consist of 4 peg colors – no blanks.
5. You have 8 guesses to find the secret sequence.

Scoring

For each of the pegs in your guess that is the correct color and in the correct position, the computer will give you one small black peg to the right of that move. If you score 4 small black pegs on a guess, you have guessed the secret sequence.

For each of the pegs in your guess that is a correct color in an incorrect position, the computer will give you one small white peg to the right of that move. Together, there will be no more than four small black and white pegs for each move.

If none of the pegs in your guess is of a correct color, you will see no small pegs to the right of that move.

Sample scoring:

If the secret
sequence is…
And
your guess is…
Your score
would be…
 
 
   

Some detailed instructions if you like:

http://www.pressmantoy.com/instructions/instruct_mastermind.html