Monday, August 30, 2010

Understanding FetchMode

Few days ago I've faced with duplication of data in XML we send to vendors and it leaded my to basic understanding how fetching works within NHibernate.

Database

So to make things clear we will start with ever simplest database layout and few datarows as on picture below:


I'm using following code to test our activities.


        private void FetchCustomerUseOrders(ISession session, FetchMode fetchMode)
        {
            var criteria = session.CreateCriteria(typeof(Customer))
                .SetFetchMode("Orders", fetchMode)
                .Add(Restrictions.Eq("CustomerId", 10));

            var customers = criteria.List<Customer>();
            Console.WriteLine(customers[0].Orders.Count);
        }

It fetches Customer with passed in FetchMode and then uses Orders to examine how lazy loading works.

Then I'm calling method for each of the FetchMode in separate sessions like below:


            using (var session = sessionFactory.OpenSession())
            {
                FetchCustomerUseOrders(session, FetchMode.Default);
            }
            using (var session = sessionFactory.OpenSession())
            {
                FetchCustomerUseOrders(session, FetchMode.Eager);
            }
            using (var session = sessionFactory.OpenSession())
            {
                FetchCustomerUseOrders(session, FetchMode.Join);
            }
            using (var session = sessionFactory.OpenSession())
            {
                FetchCustomerUseOrders(session, FetchMode.Lazy);
            }
            using (var session = sessionFactory.OpenSession())
            {
                FetchCustomerUseOrders(session, FetchMode.Select);
            }

Mapping of the Customer

            HasMany(x => x.Orders)
                .Access.AsCamelCaseField(Prefix.Underscore)
                .WithKeyColumn("Customer")
                .FetchType.Join()
                .LazyLoad();

Generated SQL-s

NHibernate can generate two types of fetching: either join or either separate select statements. So our code generated three join statements for Default, Eager, Join. Also two calls to database with two selects for the Lazy and Select. So all FetchMode except of Default are overriding our Customer mapping.


Join SQL

There is one thing you should remember about such kind of fetching - you will get duplication of the entities in your collections. You should apply joining when you are going to have some specific restrictions in your query.

Duplication of entities:

On the picture above you see two customers, which are the same references and represent same customer with same id = 10. To eliminate this issue you should apply one of the fixes: use distinct, use subquery or filter entities in client code. This article should make this more clear.

My recommendation is never use ".FetchType.Join()" in your One-To-Many relations as I did that. Better let NHibernate do it by default. Nhibernate applies Join to Many-To-One relations and Select to One-To-Many.

In my case better use following:

            HasMany(x => x.Orders)
                .Access.AsCamelCaseField(Prefix.Underscore)
                .WithKeyColumn("Customer");

The less you write code - the less mistakes you do. :)

Two SELECT-s

This type of query is generated if you have Select() fetch type. If you have LazyLoad in your mapping second select will be executed only on accesing of the Orders property of Customer. In other case (Not.LazyLoad) it will be executed immediately on fetching Customer.


Hope this brings some light. At least for me it does.

Wednesday, August 25, 2010

Pair Programming - First Try

Few days ago I've worked few hours on Sunday, so there were only me and one of the co-workers in the room. He is Delphi guy, but likes to learn .NET. He had to implement some custom resizing logic for the report and he asked me if I can help to think on the logic. We spent maybe couple of minutes before had some preliminary ideas.

Let's do Pair Programming

We decided to implement some prototype/logic within .net. I said, let we do some pair programming with TDD. "I will be writing tests - you will be implementing logic to make them work". Do you know how do we call this particular TDD variation? - It is called "Ping-Pong Pair Programming".

So after I created basic test project and wrote a test that simply has something like "var report = new Report();" and then "report.Draw();", which of course is failing UT, he proceeded with creating class for Report and putting in place stub method Draw. Then I added functionality that allows adding report columns, then sizing of them, desiredMinimalWidth and delimiting width. Then UT that verifies if we correctly resize columns if the fit or do not fit into report. Misha was performing extremely well in implementing logic, we had been thinking on. At some point of time he got stuck, so we continued together on making latest UT work.

I enjoyed this try of doing TDD both with Pair Programming.

What are benefits of doing PP as per me?

  • Knowledge sharing
  • Less bugs
  • Quicker problem resolving when working on complex tasks
  • More control on what other in pair is doing (in other words you will be sure that he is not using his time to watch YouTube)
  • Building great team spirit

Are there disadvantages?

It might happen that PP will not be feasible, especially in situations when problem they are trying to solve is trivial or when one of them is not interested in going great job. You can read lot of discussion over the internet about the time PP consumes and the quality of the work. Most commonly you will hear that when doing PP it takes +15% of time if two developers work independently and produces 15% fever bugs.

What are preconditions on doing Pair Programming as per me?
  • Problem you going to solve are complex and require writing new code
  • Good to have two competent developers, but one of developers is a must
  • One of the developers is really dedicated to work
  • Your system allows you to write Unit Tests is a great plus
  • You bet on quality, not on quantity (sometimes better decision for the business might be to deliver quick and lot)

In my further professional growth I will try to involve more people in this practice!

Career Plan for Software Engineer

I'm confident that every smart human being on Earth should have own plan for life. Also, as many of us, work hard we spend almost half of the life or even more working. Did you ever think about that? We spend hours working on some projects, solving some problems, interacting with people, creating and modifying things. Are we dedicated to what you do? If no, then I have a question for you: Why do you work on that? Really! You may say that you could possibly work with more pleasure on another job. If that is truth why don't you plan to change your job?
But if you are dedicated to your work, I assume that you want to grow. Right? Do you have an idea how you should proceed to reach your goals? Do you know exact steps to take and your knowledge gaps you should overcome? No? How then can you be sure that you will grow to some position, where you will be recognizable?
I always ask people, what motivates them and what they would recommend me to do to motivate others. Answers I get differ in formulation, but they all have the same ideas behind: possibility of career growth, recognizing, achievements, possibility to chief.

Main question is:

What do you do to reach your professional and life goals? Do you have a plan?

If you are not sure about what you do or about what you should do it is exact time to build your career plan.


Career Plan

Career plan is list of positions and actions you should perform in time to reach your short- and long-term career goals.

Why do you need your career plan?

First of all building plan is process of establishing steps you should perform. After you have some preliminary plan you can refine it by removing not important items and by adding some additional steps. Also you can rethink some things and then rethink and rethink once again. In the end you have some kind of more or less good plan. But do not expect it to be you final plan. I would say that you should always take a look on it and consider if you still can improve something.

Benefits of having Career Plan as per me are:
  1. Clear vision of the path you should take
  2. Possibility to track your progress
  3. Thing that you can use when you are trying to establish priorities
  4. Helps you to recover after bad mood because of problems at work
  5. Way to communicate with bosses ideas on your career and get feedback
  6. Extra confidence in your life

You are now different!

After you have Career Plan you will be different from your co-workers whom continue to work blindly. Some of them might think that simple hard work will lead them to success. Hey, guys don't think so. - Yes, you are right that hard work is needed, but there are definitely some other things you have to add to bake a cake!
(I'm not talking here about those guys, who work just to get money enough for living, that is not my case, and hope not your case, since you are reading this blog.)

How to build your career plan?

You should know where you are right now, where you want to be and what are your  abilities/skills.  Answers for those questions are prerequisites for building a good career plan. If you have no clear vision on where you want to be, don't be upset. Work on that: try to write few nouns that describe you after you've reached your goals. They might change in future, but at least for now you should have some kick-off list. For me it is something like "MVP, Consultant, Architect, Author, Community developer" own company? another country? manager? etc?
Once you have established where you want to be it is time to build the path.

The Path

Usual positions path for Software Engineer is:
  • Junior Developer
  • Intermediate Developer
  • Senior Developer

...so that was the most general path I see in all companies. What do we have after that? It really deviates in different companies, but generally speaking this depends on the factor of your interaction with other people, with technology and with the company.

- The more you interact with people the more you become leader of team, say Team/Tech Leader. The term might differ, but I like this one "Technical Team Leader". Even more if you would like to take more responsibilities you can switch to managing positions and become Project Manager right after TechLead or after Senior Developer, depends on the level of project.

- The less you interact with people the more you become Expert (it is even possible to have such position) in tech. The person with whom people consult and get information on approaches.

- The more you interact with company the more you become CEO, but depending on your company's size you might have few more steps here and of course position's title can differ.

Summarizing further steps are:
  • Tech Leader - way to project manager
  • Expert - way to consulting and architect positions
  • Company's leading person

Why did I say "positions path"? Because this is not whole representation of the path, a good path should also go through you own personal ambitions related to your job to lead you to the established goals. What do I mean by this? Since I want to be recognizable community developer and known over the world, I should commit lot of efforts in maintaining this blog, in taking part in some events, etc. This has no explicit impact on my career growth, but believe me it has huge and tremendous indirect impact. Also I would love to have my own book that is why I also planned to work on writing book. I still do not have clear idea on what about that book will be, except of maybe that it will be either on tech or on success. But I planned it and I'm proud of it. Some remark here: I talked with my friend on this and he was laughing at me that I want to write a book and planned it but I do not know what about. I can express my arguments against it here, but would love to hear from you if he is right and why.

Big piece of My Developer's RoadMap

My company as one of the leading outsourcing companies in Ukraine is trying to make employees happier with helping them in their careers. They build more positions and they establish processes that allow us see where we can move. (I hear you complains here...) It is well known that one of the biggest motivation engines is visibility of the career growth.

Since I'm looking as perspective employee (at least they think so), me with my company almost built my Career Plan, which is the path with steps I should take to move from one position to another. Of course company doesn't care about other of my needs even if they are dedicated to my personal improvement. That is the reason why company has only official positions and latest position they've prepared for me is being one of the tech chiefs of one of the divisions. Of course that is great positions which includes lot of interactions with clients and huge responsibilities in developing and reviewing solutions to the problems, that my company solve. But it doesn't include any of my desires to become community developer and stuff I would like to do to achieve my goals.

So here I will represent my own Personal-Career Plan that also includes lot of other things.  I would recommend you to build something similar. On the left you can see path I built combined with some positions, certificates (officially needed for those positions) and also other things. On the right side you can see my table of "Where do I want to be in a year". That list of  "where I want to be" is really cool toy I discovered for myself. (here is list for 2010 & here is list for 2011)

Personal-Career Plan

Click the image for being able to read from it

You might be thinking now: "Boy, hold-on, hold-on! It is way too optimistic path. Are you kidding?". I would answer "Shut-up! I know my path and will do the best to be stick to it. Btw, do you have your path?"

Even if there is some overestimation of my possibilities/abilities/efforts I still would love to think this way, because thinking this way is movement to Success!



[Edited on Jan 10, 2011 with correcting grammar and adding links to year plans]

Monday, August 23, 2010

Book Review: The Brand You

 I read this book on the fly. Couple of hours and done. Book is written in very specific way, that allows to read it quickly. It spreads very interesting ideas.

One of the main concepts is that you are General Director of your life and your name's company and that is real place where you must do the best. You should have something like a new title of your current position in Company-You, like "Catalyzer of progress".

Book just throws into you lot of gripping mottos that make you double think if you do the right things and if in right way.

Book's author is "COOL" and he wants you to be "COOL" as well. You should make yourself a "dude with power" and then sell yourself with high price.

For some reason book is also concerned about building professional network. Intent is to be aware of the best people around you, so this could help you move forward. Few weeks ago I started looking around for cool people to have lunch with them. During lunch I'm trying to familiarize with that person and understand what does he thinks about the job. Mainly I talk with Software Developers. To some extent this helps me be known and get interesting information from them. Probably it worth to consider meeting with people of other professions.

Regarding what it talks about your job, ideas are great and are very applicable to my current position and current team work. I would love if we use following motto: "Work with what you have, and make it awesome'. There is no room for complains, there is only room for getting it done.

Be the best!

Saturday, August 21, 2010

Code Review - Way too interesting exception handling


Today, I've been reviewing some piece of source code,  and found way too interesting exception handling approach.

In following code snippet we are trying to wrap existing exception with new one having more descriptive message and saving the stack trace of the original exeption. The way how it is done is just amazing:

        private void OnProcessingException(Exception exception)
        {
            if (ExceptionOccured != null)
            {
                try
                {
                    throw new Exception(string.Format("Very descriptive message here." + "{1}StackTrace of InnerException: {0} {1}", exception.StackTrace, Environment.NewLine), exception);
                }
                catch (Exception outerException)
                {
                    ExceptionOccured(this, new ProcessorExceptionEventArgs(outerException));
                }
            }
        }


I'm not trying to blame someone. But sometimes people see so much more complicated and sophisticated solutions to problems that could be solved with one-two lines, that it makes me think, what we also do such things but on another - higher level.

Developer who wrote this code is trainee, so doesn't mean low quality of our code, simple he needs more experience. My point is that we are also trainee, but on another level, and we might not see simple solutions as well.

So who will write me one-or-few lines of code that can do the same? Please do not hesitate :)

Thursday, August 19, 2010

Windows Communication Foundation - Getting Started - Developer's Meeting

Hello, today I performed presentation on Windows Communication Foundation and it went extremely well. People were interested in topic and it smelled in the air.

Why am I happy with this meeting?

People were listening very-very attentively! It is the best gift to the speaker. Many thanks to today's attendees! You made this presentation awesome!

What was the agenda?

For today I planned to have "Getting Started" session, where I decided to talk in general what is WCF and then proceed to basic concepts of it, like ABC.

In DEMO 1 (Damn it! Let's write some code!) I created ever simplest WCF library and simple Contract that exposed todo list functionality. Then I brifly showed configuration and we started wcftestclient.

In DEMO 2 (Damn it! Let's configure it!) I talked a lot about endpoints and how we can configure them. After I created a lot of them it was highlighted that changing the way how our service works by configuring and not changing the code is the key feature of WCF. WCF is indeed unified framework that allows us has one logic, but different exposing to the real world.

In DEMO 3 (Damn it! Let's use & host it!) I created very simple console application that was able to send todo item to the service. It went with some exceptions thrown into console, but people liked it and besides after that I created SuperTodoServiceClient and it worked well. Also we voted were do we want to host our service for the long time. Most decided to host it under IIS. Till the actual hosting all went well, but then suddenly it didn't work under IIS. Reason was very simple - since my machine has brand new OS, IIS was not configured properly.

What's next?

Also I'm planning to have another meeting on the WCF. This time it will be "Advanced". In that session I would like to show some real-world examples. Also I'm going to prepare to the 70-503 exam (on WCF), so I might get some interesting topics from the training kit to show on the meeting.

Presentation

More and more I start disliking ppt files. But anyway to have some visual appearance of presentation I created ppt file (maybe finished with it at 5:30 am so don't kill me if it is "poor"). Btw, having ppt has some plus - I can put my blog's logo and URL :)


View more presentations from Andriy Buday.

Guys, looking forward to hear from you! Will appreciate any of your comments.

Sunday, August 15, 2010

Book Review: It's Not Luck

So far I read another book on business and management. Now it is called "It's Not Luck", and is written by the author of "The Goal".

Honestly, I liked this book, less than "The Goal", because now I knew what to expect. I knew that all of the problems will be solved and that the hero will be promoted to the general director of Uni-Co.

The main and huge difference is that in this book author represent to us new way of thinking to resolve issues.

I will try to summarize it here from my perspective and my understanding.
So, first of all you have some conflict. You write it down with good formulation - that is the main thing you need to resolve. After, you should build some tree of dependent reasons-effects. To do that you need to write them all down and dive into intensive thinking to find out all of the dependencies. Book, states that in most cases reason of the main problem is just one of the reasons, you listed. If you commit lot of effort in building your dependencies tree, your reason will be obvious, so after that, you can proceed with building your plan to resolve that. Plan is path from root reason to the main problem, you should solve.

Book is very gripping and is written in way that gives us touches of both personal and business examples. I liked it, and maybe will try to use some of the technics to solve problems in my life.

Saturday, August 14, 2010

Friday the 13th - Knowledge Evaluation

As I promised, here is post on Knowledge Evaluation for the Senior level.

Definition of a Senior Level Developer

In most of the sources, Senior level is defined as level on which person is responsible for building complex components with minimal guidance and being unsupervised. Also person is an expert in language and has experience in business areas. I personally like definitions, where they additionally indicate person's interest in software and bringing business value to the client.

So, who is Senior Developer?

Senior Developer is guy, who can and likes to code on any level of complexity, therefor he is able to build certain project parts, taking responsibility for the work being done. He can and likes to mentor and teach other members of the team; keeping his skills up to date and bringing this knowledge to the team he is leading by example.

For me being Senior Developer isn't just label, that is indicated somewhere in the company by HR. It isn't only list of responsibilities/duties I will be stick to. It is significant breakthrough in my career, that blesses me to move on. Moreover it is another step to self-actualize myself by accomplishing my life goals. Again, it is part of my RoadMap (I feel, that I need some post on it, but cannot till map is rolled in one or few places.)

Knowledge Evaluation

Except of taking into account my performance, company should always evaluate my knowledge to proceed with promotion.

My theoretical knowledge of programing and language isn't under question
For some reason, my evaluators were not concerned about my theoretical knowledge of the core programming and language. That is why I got only few questions about database access, code quality and few other. Btw, for Med evaluation, most of the questions were exactly on core .net and surrounding things.

Non-coding aspects played more evident role in evaluation
Our meeting was about to find out if I'm able successfully communicate and work with team/client, if I'm competent in mentoring/coaching more junior staff, also how would I proceed with project management, like evaluating requirements, managing risks, doing proposals, and providing estimates on difficult matters. Of course there were some questions on configuration management and product deployment and brief go through surrounding project developing stuff.

Personal outcome
For me it was good time and my personal outcome for myself is that complete understanding of engineering management and requirements will come only with facing more real world situations, since simple theoretical knowledge isn't enough.


Feedback

They did not give me official feedback yet, but I feel confident about positive one.



How will I proceed with new position?

First of all I will do all possible to not disappoint my management. Also I will work hard on keeping my brand up to people expectations and higher. Of course I will continue doing more than it is expected from me. 


Any congratulations and comments are welcome!

Friday, August 13, 2010

KE - Day Fifth - What is left?

For the Thursday I had nothing planned for learning, since I spent my night watching Perseids out of the city.

Knowledge Evaluations is very close, so I just reviewed all of the items I should know for it.

To lot leave this post empty, I decided to write at least about something. I feel, that I still have some weak areas like Networking. But it turns our that for .NET Desktop Profile, I need only basic knowledge of it, like understanding networking itself, application layer protocols, IP, TCP, UDP, SMTP, and so on and so forth. So for my luck I have basic ideas how all of that works and glues the world together.

Networking

We often use these abbreviations, but do we always know what they mean?

local area network (LAN)
wide area network (WAN)
metropolitan area network (MAN)
personal area network (PAN)
virtual private network (VPN)
campus area network (CAN)
storage area network (SAN)
Simple Mail Transfer Protocol (SMTP)
Multipurpose Internet Mail Extensions (MIME) 
User Datagram Protocol (UDP)
... what more??


In the evening there will be post about how KE went and what are outcomes.

P.S. I feel myself very nervously at the moment...

Thursday, August 12, 2010

KE - Day Forth - Continues Integration

For today it was planned to learn SQL and Continues Integration. In this blog post I'm going to express few thoughts on Continuous Integration. Only thoughts, because you can read comprehensive articles on it over the internet, like this one written by Martin Fowler.

My definition of CI:

Continues Integration is the way to keep an eye on the system your are building collaboratively with other guys, when everyone injects their work frequently.

I took picture somewhere from web, since I like how it illustrates CI


Few main suggestions on introducing CI:
  • Make sure that all sources needed for build are withing one Repository accessed by developers
  • Any developer should be able check-out sources on virgin machine and be ready to go
  • Everyone does commits regularly (once a day as a must), if someone complains about this you should mentor and convince him
  • Build is automatically started on commit event
  • Build should be as fast as it can
  • If build couldn't be fast you should consider sub-project builds and primary-secondary builds
  • Developer is responsible for his commit so he should verify feedback from build system to see if build was ok and if tests passed
  • Create continuous deployment process to the environments close to production, say once a day
  • Execute automated tests on deployed system
  • Consider using some CI engine, like Hudson

And some thoughts about blind architectors

When, I came to the project and I faced lot of difficulties that project had, like having sources under different repositories, having not automated procedure of builds, also when someone failed build, everyone knew about that next day and all QA work was stopped; lot of complains about merging sources; dry applying sources to diff versions procedures. None knew what is going with project till next day! I was junior at that moment I did not know about CI, but, hey where our architects have been? Thanks to efforts of new fresh architects we've got CI and it applies to our project very smoothly. What is left is to convince devs do committs more often and cover everything with Unit Tests. (But that has also something to do with our project specifics.)

Why didn't they consider introducing CI earlier? This is mysterious question, I do not understand. There should be definitely something significant (like CI) that we can improve!

.NET Remoting Quickly

As you may know recently I got junior to mentor him. In order to understand his capabilities and knowledge I asked him to do couple of things, like explain me one Design Pattern he knows, explain SCRUM and write the simplest .NET Remoting. So that was yesterday and today I verified that he failed with .NET Remoting, but it doesn't mean that he is bad. He just need learn googling art more. I asked that for next day, and gave him stored procedure to write. Hope he will be smart enough to finish it till I come tomorrow from my English classes.

.NET Remoting


To ensure that I'm not asshole that asks people to do what I cannot do, I decided to write it by my own and see how long will it take for me. It took me 23 minutes. Hm... too much, but I should complain at VS about "Add Reference" dialog.

So here we have three projects in Visual Studio: one for Server, one for Client and of course Proxy class shared between client and server.


Shared proxy class ChatSender in ChatProxy assembly:


    public class ChatSender : MarshalByRefObject
    {
        public void SendMessage(string sender, string message)
        {
            Console.WriteLine(string.Format("{0}: {1}", sender, message));
        }
    }

Server (ChatServer):


    class Program
    {
        static void Main(string[] args)
        {
            var channel = new TcpServerChannel(7777);
            ChannelServices.RegisterChannel(channel, true);
            RemotingConfiguration.RegisterWellKnownServiceType(typeof(ChatSender),
                "ChatSender", WellKnownObjectMode.Singleton );

            Console.WriteLine("Server is started... Press ENTER to exit");
            Console.ReadLine();
        }
    }

Client (ChatClient assembly):


    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Client is started...");

            ChannelServices.RegisterChannel(new TcpClientChannel(), true);
            var chatSender =
                (ChatSender)Activator.GetObject(typeof(ChatSender), "tcp://localhost:7777/ChatSender");

            string message;
            while ((message = Console.ReadLine()) != string.Empty)
            {
                chatSender.SendMessage("Andriy", message);   
            }
        }
    }

My results

Wednesday, August 11, 2010

KE - Day Third - Modelling: UML

Today is my third day preparing to the Knowledge Evaluation. For today I had DB Design and Modeling. Modeling is about UML diagrams as it is mentioned in sheet I'm using for preparing. In this post I explained each of the diagrams with one simple sentence. Also I drew few of them, have no enough power at this point of time at night to continue and draw all of them. Hope you will like my drawing tries :)


UML: Structure Diagrams

Class Diagram - show classes and their interaction in details.



Component Diagram - represent components of the system, their relationships and contracts they use to interact.




Composite Structures Diagram - show collaboration of instances in run-time and communication links used.

Package Diagram - organizes other model elements into groups for easy understanding of the system.

Deployment Diagram - represent static state of the working system, including hardware and software located on it.

Object Diagram - shows snapshot of the instances of the system to represent how system can look at run-time.

UML: Behavior Diagrams 

Activitiy Diagram - represent workflow of the activities in the system, basing on decisions made.

Use Case Diagram - show usage patterns of the system, so they can ideally describe requirements.
 

State Diagram - shows all of the possible states of the object in the system and conditions when it can change its state.

UML: Interaction Diagrams

Sequence Diagram - show the lifetime of the components/classes and their interaction in time.

Communication Diagram - shows flow of the messages in the system and illustrates basic relationships between classes.

Tuesday, August 10, 2010

KE - Day Second - Engineering Management & Requirements

Today is the second day when I spend some evident time on preparing to my knowledge evaluation. For today I had Engineering Management, Requirements and OOD.
Engineering Management is something that I read few articles on wikipedia and OOD is something that is not possible to learn per one night. So regarding Requirements I noted only few things.

Requirements

Requirements is very important part of the process of building software. The better and cleaner requirements you get - the better understanding of the system and its design you create; the better you communicate requirements to development team - the better product will be built. And what is the most important as per me - you can evaluate requirements before you started developing something and find out if it is feasible.

So how can requirements look like?
  • Business Requirement - defines needs from software that can help reach goal of the business.
  • User Requirement - defines how people (users) will interact with system and what should it do from their perspective.
  • Functional Requirements - define functional specification to the system, developers must build to satisfy the other requirements.
  • Quality of Service Requirement - performance, scalability 

Evaluating the Requirements for the Application
  • Requirement perspectives
  • Unambiguous
  • Complete
  • Necessary
  • Feasible

Monday, August 9, 2010

KE - Day First - Communication


I'm preparing to the Knowledge Evaluation, which should let me get next step in my career. Today I spent about 5 hours on learning the Communication area of requirements for me. I read dozen different articles and reviewed many presentations. Very important part of communication is Team communication and Coaching, but I'm off for sleep. Indeed want to write something about it. You just need kick me to do that next week. Here in this post you will see some random lists on different communication items created or mixed from other resources by me.

All of us know how that is critical to be competent in written communications, specially with client, so while preparing I created some lists of things to be remembered.

Be clear in your e-mails:
  • Keep in mind your reader
  • More verbs instead of nouns 
  • Concrete, not abstract 
  • More active instead of passive 
  • Making sense - managing stress (Put old or known information at the beginning of the sentence and new or complex information at the end)
  • Be simple (Foggy phrasing often reflects foggy thinking)

Requirements

Software Requirements documents consist with:
  • Introduction (Purpose, Scope, Definitions, References, Technologies, Overview)
  • Overall Description (Use-Case Model, Architecture Diagrams, Assumptions and Dependencies)
  • Specific Requirements (Use-Case Reports, Supplementary Requirements)
  • Supporting Information,
  • Concerns if any

Questionnaire
  • Short
  • Target carefully
  • Start with interesting questions
  • Limit, or avoid, the use of open-ended questions
  • Put your questions in logical order


Meeting Minutes

Meeting minutes document what occurred at the meeting. They are not an opportunity to present a position or to add new materials and comments.

Format of Meetings Minutes should follow the agenda closely:
  • Date & Time, Place of meeting, Attendees
  • Purpose of Meeting
  • Each issue addressed and highlights of the discussion
  • A notation of any materials handed out at the time
  • Outcome or decisions made

Always attach copies of materials distributed at the meeting or note where to find
them.

Proposals

Should have Executive Summary and answer for the following questions:
  • Why are you doing this project?
  • What will you be doing?
  • How will you be doing it?
  • Who will be doing it?
  • Where will it be done?
  • How long will it take?
  • How much will it cost?

Conference calls

I'm sure that you can anourmous amount of information on how you can effectively provide your conference calls.

Here is my own list:
  • Be always prepared for the call. Have pen & paper handy.
  • If you do a call or if you receive a call, always know what is the purpose of it and if right persons are selected.
  • Be honest and oriented to help, never say that it is not your job or policy.
  • Track if meeting goes by agenda, direct and drive when needed.
  • Try to exceed expectations, ask something like "While you’re on the line would you like me to..."
  • Always have summary of the call outcomes in the end.

 If this is bad post, let me know.

Saturday, August 7, 2010

English classes in outsourcing company

Since each software company wants to develop into huge one and be evident player in the IT industry, managers work on improving skills of the personal. For not English speaking country, as Ukraine, it is quite critical for the employees to know English well. That is why many companies are investing money on creating English courses.

Half of the English courses, I'm attending are left and I would like to provide some feedback that can be useful for my teacher, for people who are attending courses, and for anyone else who is working in outsourcing software company in non-English speaking country.

I've been attending regular Upper-Intermediate course for about 4 months and I see many advantages of it, but classes do not bring as much value for my work, as I'm expecting to get.

Difficulties

Why don't classes bring enough value for my everyday work?

First and the major reason is that subject of our studies is completely unrelated to matters we are encountering during daily work. For example one of the latest chapters of our student’s book was "Literature". For me it was the worst chapter in that book. I'm not keen on literature, so maybe that is the reason why I was so much bored with that chapter. Maybe, but if we take a look at this from other side asking ourselves question "Which value does chapter about literature can bring to software guys?" my statement about that being worst chapter doesn't look ridiculous. Except of some out of the common situations, like dinner with client or library software solution, literature topics bring small value. I do not say that it is bad to have such topics; I say that to some extent it is waste of time which could be consumed by learning other more interesting stuff.

Gap between engineers and English teachers

More over I think that I understand why this gap exists - because people who created study books are from another life area than software guys are. They are academic guys, they write articles and some fiction stories. On another hand we have software engineers who develop programs and discuss them, who look bit prosy for others, but we know what we know.

For example, I often watch different programming video. Guru speak about new frameworks coming soon, about mature approaches to building software, they show best practices and design patterns. Surprisingly I understand absolutely everything from their speech (maybe 1-2 words per minute missed). Why? Because they operate with words and terms I'm using in everyday work and because I'm interested to hear things they say. On one of the lessons we had listening practice, where guy talked about the train in Asia, and how some lady brought insects on plate for eating and about wooden sticks and bla-bla... Question is: why on earth I need this?

Advantages, Improvements, Thoughts...

Is everything so much bad?

No, of course, no! Main point of my previous paragraph is that classes are not 100% concentrated on needs of software engineers.

These classes bring lot for my general understanding of English Language. I now feel more confident in using perfect tenses and different grammar. Classes are great revision of the grammar, that you learnt at some time and then have forgotten.

On my previous Performance Appraisal I got remark from client, that my English has improved. I should thank my company for giving me opportunity to learn English.

Improvements to regular courses that I see are:

Have brief review of the upcoming topics and find out if people are interested in them. If not maybe it worth to provide one-two lessons that do not belong to regular course, like one lesson of "listening & speaking" one lesson for grammar one for video, after that proceed with further chapters. Get feedback from people. Btw: I really appreciate, that my teacher asked for feedback. You rock! I know that feedback is the most reinforcing way of improvements.

Course I'm attending is comprehensive (learnt this word at classes :)) set of activities, but I would really like to see more speaking. Make people speak more, and provide feedback on that only after person finished. I would like to see it more regulated. Make everyone speak.

Make some friendly-competitive environment. I'm kind of person who would like to win some rewards, like "Best presentations deliverer". For now I would win only "Most Thursday lessons missed" - 9AM is too early for owl.

Have some home activities that differs from usual, like ask for watching some film and provide review for the students. Or simply let people introduce and explain their duties in company. That should be interesting.


Additional learning is needed

As per me it is required to work on English by your own and simultaneously attend classes. How does it work?
English teachers are the best in their understanding of grammar. Particularly my teacher can explain tenses just terrifically. Your everyday work doesn't require complex grammar to be used, but nothing restricts you from doing that. Simply start listening to your clients more attentively and catch the smallest matters they say. Write more clean and sophisticated letters. Now you have theoretical knowledge, go and use.

My list of activities I do for learning English:
  • Attending English classes and catching grammar at daily work
  • Using theoretical knowledge in your daily work. Why not write two-three words to build more complex and correct sentences that can emphasize your e-mail.
  • Reading huge dozen of articles. I read technical only, and tech books in original.
  • Watching tech video. I just love watching it.
  • Watch with beer and friend movies you have already seen translated.
  • Watch without beer movies for the first time. Even if you understand little; low of average works - the more films you watch the more words you intuitively understand.
  • Find someone who will likely be talking with you in English during the day. I'm happy that I have colleague, who talks to me in English. We have fun. 
  • Write something. I write blog posts, that is also asset to my learning.

Conclusion

English classes are definitely needed for the software company. And I really enjoy attending them, but hate that they suck time that I need for my sleep and dislike that they are not software-related, but I try to understand this. I see some improvements, biggest part of them are applicable to our courses, but not necessary near to wishes of other students. As always everything depends on your desire to work, so I have my own list of activities I do for learning English.


Please let me know your thoughts about said above.

Abiliton PRO Certified

Yesterday my company officially started new certification model, called Abiliton PRO. It was announced much earlier, but rewarding first portion of best company's people happened only yesterday.

What is Abiliton?

Abiliton™ is a strategic methodology for software development lifecycle management, invented by SoftServe. Abiliton is a fully optimized approach to software development that incorporates a superior framework of services and solutions to deliver maximum value with each and every project. It is focused on selecting and employing the most talented and bright professionals, this way company can ensure clients that projects will be done in time and with best quality that can be provided.

Who are Abiliton PRO People?

It is clear that success of any software company depends on its employees and their growth. By rewarding the best of them company emphasizes knowledge and working capabilities of the employees in any area.

What does Abiliton PRO certificate require?

It is some set of requirements, which include your performance and knowledge. Performance is measured by regular Performance Appraisals, which include different areas to be evaluated, starting from your communication with client or within team, your result orientation, etc.  finishing with applying your knowledge to daily work, like how are you in applying OOD or do you write high quality code. Knowledge, except of internal knowledge evaluations and performance appraisal, is ensured by external certificate. For example, Microsoft's or Sun's, or any else that are applicable to your position. This means that even Project Managers have there external certifications.

The rewarding event

President of company started his speech emphasizing why we gathered and what is the intent of rewarding. Also other guys congratulated us, after that we had some drink.

Here is me holding my certificate:


And close look at certificate itself:


Currently this certificate is requirement to get promotion. They say that they create more clear path for growing. Yes, and no. Many co-workers are complaining about that, and I understand them. Now it is required to commit extra effort in getting external certificates, but hey, guys, that is not so much difficult.

Honestly, I love to be recognized, and that is also part of my year goal and another mile stone on Developer's RoadMap To Success. Why shouldn't I love this? Everyone wants to be recognized and I would like to see people around who show desire to grow.

Friday, August 6, 2010

Developers Meetings Survery - RESULTS

Few days ago I started survey about improvements to Developers Meetings inside of my team, but I also announced it to anyone who can be interested in this via twitter and blog.



Top areas of interest are:
  1. *Foundations like WCF, WPF, WWF and huge parts of .NET development like WinPhone
  2. Design Patterns either Gof, Enterprise or not commonly known
  3. Core .NET (concurrency, memory, security)
  4. New features coming in .NET
 More details:



Top voted topics are:
  1. Enterprise Design Patterns
  2. WCF
  3. Gof Design Patterns with live code
  4. Estimation
  5. Refactoring
  6. TDD
My thoughts on top topics:

Because I'm not expert in Enterprise Design Pattern, it would take time for me to have some presentation on it. Either I will ask one of my colleges, who already read  "Patterns of Enterprise Application Architecture".

I just scheduled Developers Meeting on WCF for my team, and I see this to be "getting started" meeting where I'm going to talk about main concepts and basic usages. I'm going to implement some funny example.

Regarding GoF Design Patters with live code, that should be very easy for me. I already have a whole bunch of different examples on my blog, so I can use them and talk on them. I expect to have junior stuff on those meetings. I would like to train my capabilities in coaching.

Estimation should be meeting where I would like to talk around Fowler's estimation deadly sins.

Refactoring could be divided in many meetings, like core refactorings but with live code and also "refactoring to patterns"

TDD - no slides. I remember when we had presentation on TDD for devs and it was with slides. I think that is the worst way to explain TDD. Yeah, might be that it is good to show flow diagram, but I vote for code.

Details:


Improvements section:

What is the most interesting about improvements is that people would like to see more real code. Hm, this should mean that either people are tired because of my simple "hello world" examples, or either they are very interesting in how we can use those things withing complex project, and maybe they are right, because "hello world" examples could be found easily over internet.

Details on improvements:


Also as you can see we've got 3 comments on improvements. First one says to view presentations before meeting. I would agree with this, but maybe I will work on more detailed agendas, which will be sent exactly before meeting. Please let me know if this is ok.


I'm really looking forward to provide lot of interesting information to my co-workers and work along with them to build solid and very knowledgeable base for our growth.

Will appreciate if you would share your thoughts on this results and thank you very much for participating in survey!

Wednesday, August 4, 2010

Wow - Always check the Inner Exception

Today, I worked with services logic that sends me light objects mapped from NHibernate entities with AutoMapper, and I got an exception stating that something is wrong with mappings. I wrote UT that reproduces my issue and surrounded code with try{}catch(){} to see exception closer, and it said me the same I saw. I took a look on Inner exception message and at first glance it was absolutely identical to parent message.

Then I spent about 10-20 minutes verifying all my entities, trying to find some stupid mistake and I would spend more if I would not take a look on Inner exception of the Inner exception and it was a bit different, saying that another entity mapping is wrong, so I took a look into Inner exception of it and so on...

So do you have an idea where did I stop? See:


So I went through 11 Inner Exceptions to get to the null Inner Exception :) Highlighted message provided me information I needed to resolve my issue.

Moral: Always take a look into Inner Exception!

Developers Meetings Survey

As you might know, I'm keen on delivering technical meetings for my co-workers within one business unit in company.

It is very important to keep developers working on their knowledge and that is what my company is trying to do. It organizes special seminars on different topics for all of the offices, it also creates its own certification model to evaluate knowledge of employees, etc. , but before that all started my team had our own technical meetings called "developers meetings". Those were providing by one smart guy, who has moved to another country, but since team felt sad about that we continued having developers meetings, so we proceeded with scheduling topics and assigning people to them.

Fun, but while it was like official, conference room was full of people and everyone was listening to junior talking on some design pattern. As I think everyone got disappointed by such meetings, but I do not say that this was bad idea to have junior talking on patterns. Turns out it has something good inside, because that person learns something for himself and trains to present. Sad but true, he is not able to deliver something properly to the big audience.

I know this, because I also was in role of such presenter, talking on Prototype without clear understanding of it and using sophisticated example from book of GoF - I simply did not understand it and I'm sure that none get something valuable for him/herself out of that talk.

My conclusion is that presentation should be delivered by person, who has really solid understanding of things he talks about. If it is small team and it contains juniors, he should start with ever simplest code. But since anyone should start with something, junior also should have presentation sometime. In this case I would recommend to make presentation for limited number of people, like other starting developers and few experts who are really interested in people growth.

Back to Developers Meetings we are having now, I really would love to see them thriving, but it requires investment of time from interested people. These months I'm trying to deliver presentations more often, and since we've got lot of new staff we can repeat old topics with new breath. How to know if developers want those meetings again?

To get some feedback I created survey, which I sent to my co-workers, but I would be really happy if you, my readers, will fill-in it also. (It shouldn't take longer than 1 min.)

http://www.surveymonkey.com/s/PYNDS3B

Monday, August 2, 2010

Andriy Buday List of Podcasts for .NET Programmers

I listen to few tech podcasts, which talk on programming. I fill with them my time, when getting to the work or traveling somewhere. So no time lost :) Also except of getting good valuable information I sharpen my English. For folk who it trying to reach success in software development it is very important.

So here is my list of podcasts I listen to. Please note, it will not be comprehensive list of podcasts, since I do not listen to all. If you want to see more comprehensive list proceed with this link where Scott Hanselman mentioned his list along with links to lists of other folks.



.NET ROCKS
This is amazing podcast. Besides it brings great content it is also very fun stuff. Carl and Richard talk easily, they interview lot of interesting people. These guys might be surprised that someone wrote ".NET ROCKS" on his body being in mountains far from in Ukraine...

Continuation of the list (I might add more comments in future):

Hearding code
Deep Fried Bytes
Software engineering radio
Elegant Code
Chanel 9
Hanselminutes

[Edited]
This Developers Life


Let me know which of the listed you also listen and which would you recommend for me.

Why do I use twitter

Follow me on Twitter!

I saw guys, who bought T-shirts with inscription like "Follow me on twitter @andriybuday". These weekend I've been on Rock Fest in Slavske and I did something more original. Take a look:






Not so long ago I created my twitter account. Indeed it brings me some value and I get fun with it. But many people get interested how that rubbish could bring any value for me or either someone else. Couple of my friends are really concerned about it and even laugh.

Which kind of value does it bring?

I decide whom to follow, this way I consequently decide which kind of information I will get. So if I'm following some programming guys, I obviously get bombarded with information on programming. The more information I get - the more information I process - the more value it brings. The only one important restriction is that information have to be useful.


So whom do I follow?

I follow lot of MVPs on .NET(C#) and other geeks, this way I get information about new technologies and opinion on them provided directly from best professionals around the world.

Also I follow twitter accounts of different interesting sites/organizations on programming. This way I instantly get information when new podcast is ready and I can immediately start downloading it for my listening. Also I'm informed if some new versions of some products are available. For example I get information that NHibernate 3.0 Preview is available. Please notice that since I'm following those, whom I chose, I do not get information about new version of Photoshop or something like that.

I follow friends and local programmers. Actually most of my friends are developers, but anyway following them keeps me informed about their interests and allows me know what do they do.

Also I follow just few News accounts to be informed about events from real non-virtual world.

Whom do I not follow?

Different bullshit first of all, then accounts that post advertisements, those who posts on not interested for me themes. I do not follow or start unfollowing accounts, from which I get twits too often or who mix good stuff and advertisements.

How do I decide whom to follow?

Decision if I should follow someone I make taking into consideration his/her/its top 10-20 posts, if there is no more than 50-60% information on tech or something I'm interested to get from that account I do not follow that account.

What do I tweet?

Of course information that is similar to information that I would like to hear from others. It is different links on programming, my opinions on some technologies or my thoughts on stuff I use right in the moment of tweeting. I also share my personal success notes like passing some MS exam or like fixing ugly bug related to some technology.

Reasons why I do use twitter

  1. I get valuable information from known professional around the world
  2. I get technology news and instantly can respond to them
  3. I share my opinions, thoughts and could get response
  4. I get introduced to famous developers
  5. I make my blog known using twitter
  6. My tweets are across other social networking (like LinkedIn), so people who do not have twitter also know what do I do
  7. Simply getting more closer to my goal of being known community developer
Concern about the time it takes

Yes, indeed twitter takes some time on responses and tweeting and it could even take away your concentration on work. So where from do I take this time? I would say: I do not IM others uselessly and I do not spent my time on youtube or other entertainments during the work, so I think that having few tweets per day is ok, taking into account the value it brings to me.

You decide your own if twitter is something for you or not.

Exam 70-505: TS: Windows Forms Application Development - PASSED

I already wrote some posts on certification, where I mentioned why do I need certification and which value does it bring to me. After those posts I almost have nothing to add.

But maybe few things...

How 70-505 differs from 70-536? Questions in 505 are not so wide and after passing 536 + reading training kit it is much easier to pass this one.

How did I prepare? As I mentioned in one of my blog posts, I read training kit on 505 exam. Reading was boring. Taking into account that I already have strength experience working with WinForms it was ridiculous to read about some things like adding controls or something like that. But anyway I found some stuff interested for me. Also I did some research over internet on how other passed this exam. Not enough information exist about this one. Maybe because it is not very popular.
Also I worked on training tests, including demo test on MeasureUp.

Passing Exam

As you see preparation looks very similar to what I had for my 536 exam but I was still worrying about passing exam, since I already failed it. That time I even did not read training kit and was sure in passing exam.

As I was afraid to fail it once again, while testing I was really concentrated on questions and. I PASSED EXAM with score 1000, this means that I answered correctly on all 40 questions. It was really surprising and is pleasure for me.

You can see my transcript using this information:
https://mcp.microsoft.com/authenticate/validatemcp.aspx
Transcript ID: 904316
Access Code: andriybuday


Effect on Career

In post It is time to get Microsoft Certification, I wrote that certification is important for my career growth. Actually in few words my company has schema that defines conditions to be eligible for promoting to the next level.

Here is my current status:

As you can see, I satisfy all conditions for being Senior.
I have just perfect Performance and it was noticed by my managers, also I worked in my company near 2.5 years (looks like this condition is bonus for me, since now it should be 3+ years), also my English is now evaluated as Upper-Intermediate, I did dozen of presentations, and finally I got that certification.

So what is left? - Knowledge Evaluation.

Knowledge Evaluation is meeting when guru guys bombard me with questions to ensure that I'm competent in areas, which are already defined somewhere in requirements. So my next step is to find out my weak areas and get better with them, so I will have more balanced knowledge. I now feel that in some areas I'm competent but some are still very weak, because I do not have experience working with them. You can expect that soon you will see posts on themes I do not know well, but I try hard to figure out them for myself and for you. Hope they will be interested for you!

Please let me know your thoughts on this post.