Monday, September 29, 2014

Wasted Time

Today I have defined a gated check-in build in TFS.

In other words, when a developer check-ins his code, the code is built and if it passes correctly the code is checked into repository. We thought about doing something like that in my previous gig, but it was estimated as a couple of months work and was dropped. 

We did not have time to sharpen the saw. We were busy fixing broken builds.

Today I did it in TFS. I had TFS server running with source control. I had a sample code in C#. I had a build agent installed on another machine and file share server running. Nothing was installed on file server, it was plain Windows 2012 server.
  • Hmm, lets define a build for the path in version control. 
  • Pick "gated check-in" build option.
  • Few more options, like retention policy.
  • There is an option of where to put build artifacts. I need a new share on the file server.
  • Go to the file server. Define a new share. 
  • Back to the build configuration and put the new share. 
  • Save. 
  • Change a code and commit. 
  • Open a panel and see the build progress. 
  • Hmm, progress is printed...
  • Looking good...
  • There are 3 warnings...
  • Need to fix them later...
  • Done.
Look at the clock. 10 minutes passed.

I will say that again: the entire process took 10 minutes.

God Damn!!!!

Tuesday, August 26, 2014

Why your VP is just like a Godfather

Anything."

Tempting. Very tempting. It is like having a school bully to owe you a favor. Who would say "no" to you now? You have the biggest stick now! "You don't cooperate with me? I will talk to my VP!"

What people do not understand is that asking VP to solve your problems is like asking Godfather for a help. There are strings attached. More often in the end, you will wish to rewind the time to stay with your original problem.
You have found an unbelievable deal on iPad in your local store! You run there and buy one. You run home, unpack it and it does not work! The iPad does not work. Naturally, you want your money back. Do you go to the local "Godfather"?

I know what you are thinking: "But, my VP is such a nice guy".Well...
  1. When you present your case to the VP, do you know what he will say? The response might surprise you and not necessary for the good. What if he listens to you and to the other side, and decides that you are the one who is wrong? What if the Godfather decides that you don't get your money back? Are you prepared for this? What if the shop owner is his brother-in-law and you will have to pay him even more for the trouble?
    This leads to the second point:
  2. What do you do if you do not like the answer: "You don't get your money back!"
    What now? Do you go to police or a bigger boss (Senior VP)? Do you want to go to SVP with this problem? CAN you go to police with this problem?
  3. If you ask for decision, you comply with the decision. Today you went to VP and it worked. You have got what you've asked for. Next week, somebody else will ask VP to get something from you, instead of talking to you. Do you want this to happen? 
  4. You have asked him for a favor and now you owe him a favor. So, you have got your money back. All is good, until he asks you for a little favor: "You work in downtown, right? Please take this package to my friend there". Do you say no now? 
  5. Every ask for VP's help, it drains your power both in VP eyes and in eyes of others. Going "up" for a help, means that you cannot solve this issue alone.
    You draw a limit of your abilities by yourself!
    Next time, you will get less responsibilities, as everyone knows that you cannot solve such problems alone.
  6. You grow when you overcome obstacles. It has to be hard. If there is no pain, there is no gain. Bringing help reduces the pain, but it also takes away the gain.
  7. This is no fun.
    I loved playing Doom. It was so much fun. Up to a point where I've got to a level that I could not complete. I've wiped the level clean, but the boss. For some reason, I just could not kill them. Time after time, I've tried and failed. Tried and failed, tried and failed.
    Then, I've found a cheat for immortality. I have passed the level. The fun has passed as well. I don't think that I have ever completed Doom. It is no fun playing with cheats.
Not everything is bad about upper management thought. There are also good things about consulting with your VP:
  • get your problems solved quick
  • see higher-level view of the product
  • get to know more VPs, as usually they come in packs :) 
  • more exposure
  • feel more important
It is up for you to decide what to chose. Me? I always ask myself: "What would Keyser Soze do?"
If you look for me, I am busy solving my problems by myself...



Friday, May 30, 2014

Why Should Customers Buy Your Product?

In my new product, we are still trying to define the killer feature of the product. We are getting closer with a lot of sweat, shouting, cookies and coffee.

The question is "why should customers buy our product and not competitors?"

The answer, is not surprisingly: it depends.
Our product manager wants the product to do stuff that competition do not do. The reason they didn't implement those features is because they are physically impossible. Let's just say that one of them is a time machine.
I don't like being just a negative guy and saying people, even product managers, that this is impossible. I want to do constructive, so I've compiled a list of things that we can do which will be our IP. Or in other words, those are the reasons customers will buy from us instead of the competition.

  1. Algorithm, a.k.a. Idea. This is the most common thing people are looking for. Every geek I've talked about doing startup invariably talks about "having an idea". If there is no idea, there is no product. Google's page rank is a great example. Another great example is ...
    It talks to our engineering hearts, but even for Google it take time to come up with their second great idea. This would be, ehhh, news or maybe, glass? Why this IP type is rare? Few reasons:
    • There is only one "the best idea in the world" idea in the world. It is hard to find one. It is like winning a world championship.
    • In many cases, there is no such thing as "best idea". Is there a best software developer? Nope. Because they cannot be compared. How do you compare web developers and assembly nerd? How do you compare architect of operating system with a coder that writes optimized code (John Carmack)? You can't. There is no such things as best developer! Even though, TopCoder might disagree...
    • Most of the problems are not solved by one idea or an algorithm. Usually things are much more complex than that. Google could fail even with page rank. They had to build a huge datacenter, invent Map-Reduce, spread things around the world, build indexing engine, best crawler, hire enough good people, resist pressure from investors and etc.
    • Nobody is a world champion forever. Everyone will bite a dust in the end. The same is with (many) algorithms. There always will be a better one. If all you count on is the best algorithm, you will fail when the next "best algorithm" appears.
  2. Expensive Hardware or Software. Not every company can build a satellite, a tank or a ship. Neither every company can build a cloud or operating system. This is not only an engineering undertaking, but also a huge investment that only a few companies can afford. As a big company, we can afford to target big and expensive market, this could be our salient feature.
  3. Trust. Little trust is required to sell 1$ application to users, but how about 1M$ system? Will "Bank of America" even let some small company to present their product? Not very likely. I have been in storage startups before. It is damn hard to make a customer not only to trust your product with their data, but also to pay you for this. Microsoft, on the other hand, have bank's trust already. They do not have to deal with this sort of stuff.
  4. Get dirty. Do a stuff that others are not willing to do or simply offload the stuff others don't want to do. There is plenty of stuff that is not sexy, but it needs to be done and people are willing to pay for it. This is why data conversion companies are huge business, why there are some many project outsourcing companies and why IT is moving to the cloud. This is "buying free time with money" for IT guys.
    • Convert data from one format to another.
    • Connect to some old database.
    • Upgrade existing software to the new technology.
    • Support many different types of printers or custom made hardware.
    • Run Exchange servers or a version control. 
    • Buy licenses for Word and run file servers.
  5. Just works. This is nothing magical about this type of software. It just works. It has been around, probably version 7 or 11. It has all the right functionality and nice UI. It works fast, good and users love it. It is a result of years of development, feedback of many users, many versions, bug fixes and incremental development. Those years and efforts are the IP of "just works".
What is the right sort of IP for us? How will we succeed?

I don't know yet, but I do know what is success...


Sunday, May 11, 2014

5 most annoying things about changing expertise field

I've moved from storage to cyber security. Quite a move. Completely different field. I've been working in storage industry for about 12 years. Eyal has come to me saying "I'm doing this startup, join me". So, I've asked what it was about and he said Storage. This was 2000 and the startup was SANRAD. iSCSI was only beginning to happen and we were to ride its wave. Well, few years later iSCSI wave did not flip over FC boat, but I was working in storage ever since with a single exception.

I've been thinking bad things about security for a longer time. I basically, find it weird that people try to break other systems and other people defend those systems, when there are so many things yet to be done. We don't even have a good AI! No augmented reality! Damn, to play a video from your iPhone on SmartTV is not a simple task! So, the time being spend on fighting one another is seems like a such a huge waste. 

Apparently, it is a big business now. I've got an offer to start a product and a group from ground up. This is not an offer I can turn down. So, here I am, working on cyber security project. In the meanwhile, I've compiled a list of 5 most annoying thing when you change an expertise:
  1. It feels weird not knowing stuff. Its like you are a fresh graduate all over again. I look around me and everybody looks much more experienced and knowledgeable than me (well, I have it all the time). It is weird instead of answering questions, ask them all the time about everything. Ask and translate even the simplest things: what is APT? Everybody talks about it, I have no idea what it it. It is exciting! This feeling was already worth the change!
  2. Not knowing the field. I actually not talking about the "things" of the trade, like what is maleware, how it penetrates, what are the stages of attack, what is APT and etc. Those are easy to pick up. The problem is the Industry. What is the history and what are the hot trends. What are promising products and what products are doomed because the idea is dumb. I have a good feeling and strong opinions in storage industry, but I have no idea in cyber security. This is critical and a major obstacle actually, as we are trying to decide on the killer feature of the product and all I can add to discussion is more question marks.
  3. Second thoughts. What if I've made a mistake of changing a field? Why didn't I stick to what I know the best? Why not make stay in the "expert mode"? There are pros and cons of course, and the main mean to relax is the thought that I can always get back. There are still doubts.
  4. Phony experts. The real problem is not the phony experts, but rather that I can't tell the phony from real ones. Both sounds the same with the same acronyms, both talk with confidence, both have years of experience. However, one is talking nonsense while other is talking wisdom. Who is who? 
  5. Crawling instead of flying. Learning is hard. I am actually waxed out after 5-6 hours of learning new stuff. I look at what I have achieved last week and it seems like nothing. I've learned a couple of things. Then I've found out that I've misunderstood one thing, so I had to re-learn it. In the same time, I am working very short hours, because I can't get any more new stuff in my brain. It is annoying! 
 Overall, it is really exciting :)  And I promise to write about it! 

What's in a title?

Senior, Principle, SDE II, Consultant and etc.
Many big companies have a technical career ladder usually with something like:
  1. Junior Developer
  2. Developer
  3. Semi-Senior Developer
  4. Senior Developer
  5. Principle Developer
  6. Senior Principle Developer
  7. Partner Developer
  8. ...
  9. Distinguished Engineer 
  10. Technical Fellow
Some companies, like Microsoft, get obsessed with those titles. In every major project you have to have a Principle Developer. Otherwise, how those simple Senior Developers could do anything?
You want to move to the next level? You have to prove that you are worthy. This gets into a many waste days hours discussing how this guys is a Senior and that guy is Principle, while this one is better.

EMC, my current employer, has a better attitude towards levels. It basically boils down to: "its not your business!"
In other words, nobody knows and pays much attention to the title/level. Why it is better? Because titles are basically like belts in martial arts.
The belt signifies that its owner trained for at least a certain amount of time and that he knows a specific moves. It does not mean that brown belt will always kick ass of green belt!
On average, this is probably true. In other words, if you take 100 green belts and 100 brown belts, pair them one with another, then most of the matches will be won by brown belts. It is still possible that the overall winner will be a green belt! Especially if this is previous boxing champ.

The point is that having a title does not make the person into a kick-ass developer. There might be lower-titled developers who are much more capable, but simply younger and didn't advance enough yet.

Friday, September 02, 2011

Mark All As Read

I am a fan of “Zero Inbox” system. It means that my Outlook, Gmail and Hotmail (each one is used for different purposes) all stand on zero emails in Inbox.

Well, apart from Gmail which is based on search so the emails are just left there to rot.

Zero inbox means less worries for me, less things to remember, better response time for other people and less black pixels on my screen. I am a happy user.

There was something that bothered and nagged me though. Google Reader. I was struggling to get it under 100 unread messages and lost the battle most of the time. I always wondered:

What am I missing there? Maybe the next unread item is the most interesting one? Reader always dragged my attention to it, as there are always more stuff to read and (probably to learn).

Well, not anymore! I’ve seen the future and it is called” Mark All As Read” button

Google Reader - MarkAllAsRead

There is always interesting stuff to read out there. However, the good part is that really interesting pieces will be linked, commented, re-linked and flamed all over the Internet. It is REALLY hard to miss them. Should I worry then that one of the “marked as read” items is a ground-breaking, world-changing, socks-blowing one?

NOPE.

I have a zero unread items in Google Reader now and I am happy.

Monday, August 22, 2011

Taste Matters!

I was listening to the latest “This Developers Life” podcast called Taste and it stroke a chord with me.

I remember arguing whether appearance matters at work with some guy from my previous gigs. His point was that it should not matter, as the most important thing is one’s brain and ideas. Needless to say he looked like a bum.

Ultimately, he is right. Looks probably should not matter. It does not matter in two cases:image

  • email communication. The other guy might be flesh eating alien or even a girl. I don’t care.
  • when your pal says: “This guy is genius! He sleeps in a garbage can, but he is brilliant!”

These two cases, you don’t care how the other person look like, in all other cases, however, you do care. 

While it is correct that well dressed person conveys a message, I think it is more important that sloppily dressed person not only does not transmits the same message, but he conveys a negative message. Being a bum is to tell your colleagues: “I don’t care about you. I can come with my pajamas, uncut fingernails and unwashed, but you STILL will listen to me!”

It is a very negative thing to say to your co-workers…

Monday, August 15, 2011

Civilized Programming Language

Code worked and stopped working after minor changes. All of the sudden a loop is not working anymore.

1 while(cursor != NULL)
2 {
3 printk("mock_config_cache: checking %x\n", cursor);
4 if (mock_compare_cache_devices((mock_cache_device_t*)cursor, new_cdev))
5 {
6 printk("mock_config_cache: Device already exists: %x\n", cursor);
7 status = IOCMD_ERR_DEV_EXISTS;
8 mock_free(new_cdev);
9 break;
10 }
11
12 cursor = cursor->next;
13
14 if (cursor == cache_devices);
15 {
16 break;
17 }
18 }
19





It should be easy, but this is a kernel code, so I’ve spent 1.5 hours to debug this code. Even if it weren’t a kernel code, it is not always easy to attach a debugger and step through the code. I’ve added a loop to print the linked list, which is basically the same code:



1 /* DEB */
2 cursor = cache_devices;
3 while(cursor != NULL)
4 {
5 printk("Cursor: (%x), next: (%x), prev: (%x)\n", cursor, cursor->next, cursor->prev);
6 cursor = cursor->next;
7 if (cursor == cache_devices)
8 break;
9 }
10





The same code, but this one is working!


Another coffee and I see the bug. Line #13 in the first code:


1 if (cursor == cache_devices);


Notice the “;” at the end of the line! DAMN! This is frustrating!



Now, the compiler should have told me something, as the IF statement does not even have a side-effects!



These days I have read an article by Andrei Alexandrescu (C++ template guru) called: “The case for D”, where he praised D language as a better C/C++. Naturally, I wondered if D would do better in the above bug:



1 import std.stdio;
2
3 void main()
4 {
5 writeln("hello world");
6
7 int i=3;
8 if (i == 3);
9 {
10 writeln("another hello");
11 }
12 }





OK. Let’s see:




C:\Users\derbep\Documents\Code\DTest>dmd if_test.d




if_test.d(8): use '{ }' for an empty statement, not a ';'







Much much better! Advance to D! It is better!

Friday, July 22, 2011

Training went bad. Or good.

IMG-20110714-00002

This is a picture of punch-a-sand-bag training session.

It actually felt good during the training and even after, despite discomfort, it feels good to commit to training.

Tuesday, May 24, 2011

Problem on the horizon

Phone rings. It is my friend Mor.

- Hi. We have a new startup thing going on. You have to join!

- What are you doing?

- Can’t tell yet. It is in a stealth mode.

- I have to sign NDA to know?

- Nope. We don’t tell anyone before they start working.

- (pause)… I see. Well, anyway, I’ve got the best job now. We are changing the world.

I forgot it a minute later. Few months later, an email:

“Hi,

We went to University together and I remember you as a good guy. I am founding a storage related startup and you have tons of experience. Why don’t you join us? “

It is flattering and all, but I can’t. I am busy improving the world with DirectAccess.

Alon: “We have a chair with your name on, when are you coming to use it?”

Me: “Thanks man! Not in a near future for sure.”

Then, it is Mor again:

- Hi, we still looking for people and your skills are required. Come talk to our VP of R&D.

- I am not looking, but I can hear the guy out. Chances that I will come are zero.

Then it is a previous company:

- We are growing and you should still remember the stuff. Come, you have a potential.

- I am not looking and I am good at my current place.

Then Mor’s company bites the dust. Then one of my previous bosses leaves the company:

- (Me): where are you going now?

- (Her): I am going to start a new project from scratch.

- (Me): what people are you looking for?

BAM!

Once I said it, I understood that something is wrong. It was me asking for position in another company. The thought actually crossed my mind. It never did before despite long hours, frustrations, disappointments and job offers. Now it did.

The good thing is that I know there is a problem and problems I can fix…

Saturday, December 25, 2010

Learning by example

It is time for me to learn ASP.NET and AJAX.

Why ASP.NET? Because it is C# and it works well. Because there is a huge MS behind the technology. Because it works well and it is easy to get started with it (there is a Visual Studio Express). Because it is simple.

So to start I went to http://asp.net and started looking at the tutorials. It definitely helps, but you cannot learn programming by reading a book (or a web site). So I fired up VS and created an ASP.NET project.

The first question is whether to use MVC or WebForms:

image

Since I do believe Scott Hanselman and I am a freak of lower-level and finer control it is MVC for me.

The first steps feel fine, the integration with VS is great: there are actually “Create a view/model/controller” there! However, the problem began when I try to play with AJAX a little bit.

I have started with this tutorial and immediately ran into a problem: what should my partial page to inherit from? No matter what I have tried to do: either “compilation error” or the page “does not implement method” error.
In better cases, I get “unhandled exception”.

In the end, it turned out that when you want to use

Html.RenderPartial("ListContentView", Model);



Your “ListContentView” should be a partial view and not a regular view:



image



Otherwise, life is not good Sad smile

Sunday, November 07, 2010

Rewrite is pending

Recent new form PDC had nearly caused me a heart attack: MS drops Silverlight for web and bets on HTML5.

Few months ago when I was choosing a platform to write my app, Silverlight looked good:

  • C# and .Net
  • Easy to develop and debug.
  • MS is backing it up, meaning that it will be widely used.
  • Can be detached from the browser and made into a standalone application.

Even worse, detachable feature pushed me to develop a thick client to save the round trips to the server and improve performance.

 

Few months later, it does not look like a great idea anymore. Not only I have to re-write the app in HTML5/JavaScript, but I also have to re-architecture it to make it more decoupled. On the bright side, I plan to make it a learning experience and also to document the process in my blog to practice a discipline of posting and writing.

Wednesday, September 15, 2010

Getting back

I have not worked on my project for months. :(

Now, I am back. At the high point of release frenzy, but still I have an itch to scratch.

It feels good to be back…

Thursday, June 17, 2010

Why have I got Kindle DX

Few days ago I have received a Kindle DX. For a long time i thought about buying one and finally I did it. Say Hello to Kindle DX with Global WirelessIt was clear to me that I’m getting DX because of the screen size. The regular Kindle narrow lines looks annoying.

AFTER I’ve got it, I started to think why did I buy it? Will I start to read all my books on Kindle? No. First of all, I like the feeling of a real book better. Second, some of the books are unavailable on Kindle, especially books in Russian and Hebrew that I read.

BTW, Kindle DX does not support Unicode. Read and weep. It is only 2010. Amazon still are not aware that there are other languages than English.

Anyway, if I’m not dropping books, then why to get Kindle? It was clear to me that I need one, but why?

First reason I thought of, is that I have a bunch of PDF’s and DOCS that I want to read. Currently the only options are:

  1. Print the document. Not good as it wastes lots of paper and it is not convenient to walk around with a bunch of pages. In addition, next page always gets lost.
  2. Read on computer. This means that I have to sit in front of computer and read the document. What do you mean I can’t read lying on a sofa at salon?
  3. Read on a laptop. It solves the mobility issue, but raises few more:
    1. It is not as easy to read from  laptop screen as from e-ink or book.
    2. It takes a long time (relatively) to get into a reading mode.
    3. Battery life is limited.
    4. The laptop gets hot and heavy.
    5. It has to be open to read from it and takes space.

I’ve checked and the results were as predicted: I did not read books in PDF and DOC format apart from a very rare exceptions. I hope that with Kindle DX it will change.

Another reason is very simple one. To get a book from Amazon takes about 6-8 weeks using sane delivery method and costs about 30$. This means that it is a huge waste of time and money to get a single book from Amazon. On the other hand, getting a bunch of books is a considerable amount of money.

Taken together, I rarely order books from Amazon and when I do, I do it in batches. Now I have Kindle. I can get a book within minutes, without additional payment and cheaper than the printed edition. I have a feeling that Amazon is about to get much larger part of my income.

“I think this is a beginning of a beautiful friendship …”

Wednesday, April 14, 2010

How good is 96% test coverage?

It is 10th annual ribosome convention. Best ribosomes from all over the world in the same place. Taken away from their duties and day-to-day business to focus on one and only thing:

Why THE HELL we do not get what was specified after gene translation???

It seems that the final quality of the product is pretty bad. The final thing apears to be a little "hairy". Instead of getting something like this:

 angelinajolie_face

We keep on getting stuff like this:

chimp-face-cu-16470022

Now the difference is striking, even though, a total average of hair lenght is the same.

On a previous, 9th, congress, one of the seniors ribosomes suggested translation coverage tests before RNA is translated into protein. If the RNA does not pass the test, the protein is not produced. Arbitrarely, the bar was set to 51%, which is the minimal majority. Other candidates: 7, 13, 21 (black jack) 69, did not make it.

This means that RNA tha arrives to ribosome have to be checked for at least 51% of its rate BEFORE the translation is done.

It is plausable to think that 51% coverage will enable us to tell between "desired" and "acquired". "We need more quality!", thought ribosomes.

However, one year later things look much less optimistic. Ribosomes has come to a sad realization - 51% is not enough. RNA coverage did not help!!! Shimps keep on being produced. Moreover, some crazy ribos reached as high as 85% covrage, but still received:

chimp-face-cu-16470022 

Ribosomes are stuck. Discussions continued until a talk given by some academic-somes. Apparently the above two spieces share 96% of DNA code!!!!

Now this must be wrong. The differences are too large!!!

How can it be????

The answer is simple: there is a huuuuuuuge difference between micro and macro. On a micro level the difference is almost not-recognizable: 4%. It cannot be caught and mapped out by 51% RNA coverage.

On a macro level the difference is huge. Not because the micro parts are different, but because they interact differently one with another.

This means that RNA-level testing and coverage have a very limited payoff. The path to a better final product goes thought a better understanding of the global scope and how things work, much more than in lower testing.

This knowledge is hard to measure and does not seem to bring benefits right away. However, until then we get it - same same, but different...

Tuesday, March 16, 2010

Mercurial on Windows

I’ve downloaded version 1.5 of Mercurial for windows. Install was seamless and now I’ve got a command line to play with.

Lucky me, the setup has added “hg” to the path. I hate it when it does not do that. Since I already have a project this is what I’ve done:

> hg help

Help screen with many options.

> cd TestProject
> hg init
> hg status | less
'less' is not recognized as an internal or external command,
operable program or batch file.
> hg status | more
<A list of files all marked with “
?” at the beginning>
> hg add *
> hg status | more

Now all files are marked as added.

> hg commit
<Write  a comment>
> hg status | more
Empty line.

I notice that there is some not related directory:

> hg remove BrowserTest
> hg commit
Write a comment.

Now there is some weird zap file in my working directory. I wonder what it is…

To Be Continued …

[Edited]
The best part is that your entire repository for a given project is located in “.hg” directory!!!!

Tuesday, January 26, 2010

Communication out

I wanted to write on this topic for a long time, but recent piece by Joel Spolsky has made me do this.

Joel talks about having less conversation in a project and communicate less during software project. The point is logical: the more people involved in decision making, the more time it takes to reach a decision and the less chances of success the project has. Proposed solution is logical as well: limit communication. Do not tell everyone what you are doing and ask their opinion. Decide in small numbers.

I am all for small numbers. Let me decide my own fate. There is one small correction though…

There is a difference between duplex and half-duplex communication. Computer networking distinguishes between those two, however, in a day to day life we tend to forget about half-duplex communication as full duplex is a default:

  • Face to face conversation is full duplex.
  • Phone is full duplex.
  • IM/email is full duplex. This one is not trivial, but the information flows both ways.
  • Even web blog/twitter/facebook, that once was half-duplex now is full duplex, as everyone can leave comments.

We are so used with full duplex communication that there is a tendency to think of it as the only type. How it is related to software projects?

I had virtually joined another team during last project. This team held daily sync as the deadline approached and it appears that I misunderstood the purpose of those meetings. I thought that the meetings are there to sync team members regarding their doings, plans, what they did and etc. However, the moment I said: “I am working on a problem A”, the immediate reaction was: "Why don’t you try this”, “You should do that”, “Try to turn this flag on” and etc.

I wasn’t asking for help or directions! I was telling my status so they would know.

This the major difference between full duplex and half-duplex communication. It is good and desired to communicate out your status, plans, what you did, why you are doing this and that. However, this communication is half-duplex. You are not interested in other’s opinions, unless of course you are going full speed into abyss. People have to understand that their opinions are not required, however, they do need to know what their peers have been up to. This knowledge is essential both to prevent duplicate work and to provide a bigger picture.

Communicate out. Do not ask permissions.

Saturday, January 16, 2010

System Thinking – 2

Recently I’ve got an email from one of my managers saying: “If the team will solve K bugs this week, I will make you a breakfast”. It can be food, it can be money or it can be sex. Does not matter. The idea is: you work hard and do something that is not possible otherwise and you will get a reward.

This is a good case to apply system thinking! 

Managers sometimes think, and my guess is that this manager in particular, that the dynamics looks like this:

systemthinking_motivation_simple

Meaning that raising reward/incentive will increase the amount of hard work that people are putting.

There is a number of problems with this approach, for example: it assumes that people aren’t working hard enough already. However, I will concentrate on the connection between reward and hard work.

On a basis of my observations, this method does not work. At least it didn’t in this particular case. It does sounds logic, so why it does not work?

More people-aware managers find out that the connection between award and hard-work is not direct, but rather looks more like this:

systemthinking_motivation_middle

Meaning that if the motivation is low, increasing reward will not really increase the amount of hard work. Reward will influence motivation, which in turn will influence hard work.

This view is much more realistic and sometimes appears to work. It does even shows a basic problem with this approach: there is a connection between reward and hard-work and it will go into both directions. Once reward is gone, the hard-work is gone as well.

Even though the above view works from time to time, it is still simplified. One sigh of the simplification is that:

  • There are people that do not work for reward/incentive. At least not for material.
  • It works temporary. At some point people will not work hard even if reward is substantial.

The above two observations together mean that there is another relation that is not covered by the above view.

Closer to reality view looks something like this:

systemthinking_motivation_full

Notice that there is a motivation->hard-work->pride force-feeding loop. Meaning that people with motivation will work harder, will take pride in their work, which will motivate them again.

The inner loop is the one targeted most of the time. This is also the one that is the easiest to target. However, notice that the larger the “greed” the lower the motivation. This means that increasing the reward will increase the “greed”, but decrease motivation. Sometimes it will work, but sometimes the reward will be increased, but this will decrease the motivation in such way that people will not work harder. This will happen when there is no trust between developers and management.

What happened to that manager? He got promoted.

Monday, December 14, 2009

System thinking – 1

One concept that always fascinated me is the whole-parts thing. How the parts become a whole and how you can dissemble the whole into parts.

System thinking is just a thing about it. Usually, when we try to analize some system, we break it into parts and try to understand each part. Once this is done, we hope to understand how the whole thing is working together. However, there are times where breaking into parts misleads.

This is where System Thinking is coming into play (bing for it). It says that sometimes you better off thinking hollistically instead of zooming in as much as possible.

This is an example from software development.

Sometimes it seems that every fixed bug causes 5 regression bugs. In this case the most common response is to make more checks on the code before check-in. this is how it looks graphically:

 

systemthinking_regressionBugs_small_small

What it means is that when "Regression bugs" raise, the process increases. Notice the "+" on the arrow from bugs to process circle. Now, this is something that we decide.

An arrow from process to bugs is something that we anticipate. The arrow is marked with "-" meaning that when process increases we anticipate that the number of regression bugs goes down. Notice that the number of "-" signs on this loop is odd, meaning that this is a balancing loop. Or in other words, it will stabilize itself.

This is "divide and conquer" approach.

However, from experience it is not always works out like this. Thus, if we turn to hollistic system thinking we get another picture:

systemthinking_regressionBugs_big_small

This picture introduces another feedback loop. The new loop has 2 (even) "-" arrows in it. This means that this is reinforcing loop and it can go wild.

Clearly, this is a simplified view of the process, but even in this simplified view there are two loops that battle one another.

If reinforcing loop wins, then introducing more process wil not make the situation better. In this situation, it is probably better to educate people to fight off this loop.

to be continued ...

Tuesday, March 31, 2009

API not changes

I have been to Configuration Management meeting this week. The topic was pre-checkin validations. I will write about them later, but now I want to talk about small sub-topic that was raised during this meeting: description of checkin.
For example, I check-in some file. Let's say README.txt. A little, 19-inch wide, window pops up where I have to fill in few fields. Some of them are completely sensible and some are over the top in my opinion. The entire practice of describing the checkin is totally common. Once I myself defined log format and implemented some system for enforcing long-enough comments. However, the devil is in the details.
In this constellation, there are quite a bit more fields than just a formatted description. For example:
  • code reviewer. What the hell?!?!? If you don't trust me enough to checkin the code, why pay me money at all?
  • Unit-test: passed, failed, not applicable. Once again. If I, as a professional developer, decide that this code is good enough to be checked-in, then let me decide whether unit tests should be executed or not. Do not make it a-must.
  • UI changes. I can understand the need for it, but does it mean that I checkin a code that should have UI, but does not have. Meaning that there is no way to use this code right now? In addition it means, that I have checked in partial code, as some of the code is missing (UI part), which is exactly this field is about.
There were other fields, but one of the managers wanted a new checkbox called: "API change". The reasoning was that: "I want to know that API has changed as it is important. It can break other modules".
First. If you checkin a code that breaks other modules, then you are doing it wrong. Checkbox or no checkbox.
Second, API changes are not dangerous. They are visible. They break build, things stop working. The dangerous changes are those that do not change API, but change the behavior of the code. Class signature remains the same, but its logic changes. These are the dangerous changes.
So maybe there should be a checkbox: "Dangerous change". If the developer feels that the code he just checked-in is dangerous, he should check it. Probably, there should also be a reason to explain why this code is dangerous. Maybe, another field with a name of the person who approved checkin of a dangerous code.
This idea can be taken even further. There might be a checkbox called: "There is a bug in this checkin".