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?