I tried to explain to a coworker the gravity of having duplicate code in a project, on this piece of code: + (void)createIapInParse:(SKPaymentTransaction *)transaction { Reachability *reach = [Reachability reachabilityWithHostname:@"www.facebook.com"]; if ([Social getFBUser]) { NSString *iapId = [Util getBundleNameFromIdentifier:transaction.payment.productIdentifier]; PFObject *iap = [PFObject objectWithClassName:@"Iap"]; iap[@"iapId"] = iapId == nil ? [NSNull null] : iapId; iap[@"userId"] = [Social getFBUser].objectID == nil ? [NSNull null] : [Social getFBUser].objectID; iap[@"email"] = [Social getFBUser][@"email"] == nil ? [NSNull null] : [Social getFBUser][@"email"]; iap[@"country"] = [Util getDeviceCountry]; iap[@"installationId"] = [Util getInstallationId]; iap[@"score"] = [NSNumber numberWithLong:[GameScore getTotalScore]]; NSTimeInterval interval = [[NSUserDefaults standardUserDefaults] doubleForKey:@"timeSpentInApp"]; iap[@"timeSpentInApp"] = [NSNumber numberWithDouble:interval]; iap[@"retries"] = @0; iap[@"transactionIdentifier"] = transaction.transactionIdentifier; iap[@"transactionDate"] = transaction.transactionDate; iap[@"transactionSource3G"] = [NSNumber numberWithBool:[reach isReachableViaWWAN]]; [iap saveInBackgroundWithBlock:^(BOOL succeded, NSError *error) { NSString *query =[NSString stringWithFormat: @"...", iap.objectId, transaction.payment.productIdentifier]; [ZeeSQLiteHelper executeQuery:query]; }]; NSLog(@"Save in parse: %@", iap); } else { NSString *iapId = [Util getBundleNameFromIdentifier:transaction.payment.productIdentifier]; PFObject *iap = [PFObject objectWithClassName:@"Iap"]; iap[@"iapId"] = iapId == nil ? [NSNull null] : iapId; iap[@"userId"] = @"-"; iap[@"email"] = @"-"; iap[@"country"] = [Util getDeviceCountry]; iap[@"installationId"] = [Util getInstallationId]; iap[@"score"] = [NSNumber numberWithLong:[GameScore getTotalScore]]; NSTimeInterval interval = [[NSUserDefaults standardUserDefaults] doubleForKey:@"timeSpentInApp"]; iap[@"timeSpentInApp"] = [NSNumber numberWithDouble:interval]; iap[@"retries"] = @0; iap[@"transactionIdentifier"] = transaction.transactionIdentifier; iap[@"transactionDate"] = transaction.transactionDate; iap[@"transactionSource3G"] = [NSNumber numberWithBool:[reach isReachableViaWWAN]]; [iap saveInBackgroundWithBlock:^(BOOL succeded, NSError *error) { NSString *query =[NSString stringWithFormat: @"...", iap.objectId, transaction.payment.productIdentifier]; [ZeeSQLiteHelper executeQuery:query]; }]; NSLog(@"Save in parse: %@", iap); } } I refactored it to: + (void)createIapInParse:(SKPaymentTransaction *)transaction { Reachability *reach = [Reachability reachabilityWithHostname:@"www.facebook.com"]; NSString *iapId = [Util getBundleNameFromIdentifier:transaction.payment.productIdentifier]; PFObject *iap = [PFObject objectWithClassName:@"Iap"]; NSTimeInterval interval = [[NSUserDefaults standardUserDefaults] doubleForKey:@"timeSpentInApp"]; iap[@"iapId"] = iapId == nil ? [NSNull null] : iapId; iap[@"country"] = [Util getDeviceCountry]; iap[@"installationId"] = [Util getInstallationId]; iap[@"score"] = [NSNumber numberWithLong:[GameScore getTotalScore]]; iap[@"timeSpentInApp"] = [NSNumber numberWithDouble:interval]; iap[@"retries"] = @0; iap[@"transactionIdentifier"] = transaction.transactionIdentifier; iap[@"transactionDate"] = transaction.transactionDate; iap[@"transactionSource3G"] = [NSNumber numberWithBool:[reach isReachableViaWWAN]]; if ([Social getFBUser]) { iap[@"userId"] = [Social getFBUser].objectID == nil ? [NSNull null] : [Social getFBUser].objectID; iap[@"email"] = [Social getFBUser][@"email"] == nil ? [NSNull null] : [Social getFBUser][@"email"]; } else { iap[@"userId"] = @"-"; iap[@"email"] = @"-"; } [iap saveInBackgroundWithBlock:^(BOOL succeded, NSError *error) { NSString *query =[NSString stringWithFormat: @"...", iap.objectId, transaction.payment.productIdentifier]; [ZeeSQLiteHelper executeQuery:query]; }]; NSLog(@"Saved in parse: %@", iap); } and he kept arguing with me that it's the same thing. His primary argument was that "he's a good programmer and he can understand and read even the first version fast enough" so he doesn't care if it's written like that or not. The question is, am I really wrong? Is this not so important for everyone? It's a subjective matter or he doesn't understand that's not the same thing?