what are the characteristics of a good error correcting code? A posteriori  information of a bit = intrinsic info. from that particular bit + extrinsic information from the code excluding that bit.

Let's say we are operating at a decent SNR per bit and expecting a decent Bit-error-rate (BER) of $10^{-5} $.

What are things that matter here?
Like for example minimum distance...
However it is clear that other things too matter. 
Could someone throw some light on them.
Don't over think this. 

The gist is simple. You have M bits of message and add N bits for checksums and error corrections in the data of D bits overall (D = M + N). Ideally you'd like to have N be zero. The gist is that the message efficiency is M/(M+N). 

The rub here is do you design the checksums and error correction for just one error, or two errors, or three errors and so on. The more errors that you're checking for then the bigger N will get for some fixed message of size M bits. 

Also it will take more bits to correct the error than it will take to just detect the error. 

I guess the last consideration would be can you request that the message be resent if it is too garbled?  

So for a message of size M you decide that you'll design the code to detect and correct 4 bits. But you decide that if more than 2 bits are corrupted that you'll ask for the message to be resent rather than risk that there are actually 5 or more errors in the data such that the detection/correction scheme is invalid. 

If the message can't be resent then you'd have to design for more detection/correction capability.
Don't over think this. 

The gist is simple. You have M bits of message and add N bits for checksums and error corrections in the data of D bits overall (D = M + N). Ideally you'd like to have N be zero. The gist is that the message efficiency is M/(M+N). 

The rub here is do you design the checksums and error correction for just one error, or two errors, or three errors and so on. The more errors that you're checking for then the bigger N will get for some fixed message of size M bits. 

Also it will take more bits to correct the error than it will take to just detect the error. 

I guess the last consideration would be can you request that the message be resent if it is too garbled?  

So for a message of size M you decide that you'll design the code to detect and correct 4 bits. But you decide that if more than 2 bits are corrupted that you'll ask for the message to be resent rather than risk that there are actually 5 or more errors in the data such that the detection/correction scheme is invalid. 

If the message can't be resent then you'd have to design for more detection/correction capability.