эффект второго порядка в программировании
May. 10th, 2010 02:24 pm(эта запись будет интересна в основном программистам)
В предыдущей записи я мельком упомянул историю о том, как в одной компании программистам стали давать премии за количество строчек кода, и они в результате стали это число раздувать посредством всяких ухищрений.
Несмотря на то, что история звучит апокрифичненько, на самом деле я о ней прочитал всего пару дней назад во внутренней рассылке на работе, и в ней были указаны конкретная компания, конкретный отдел, продукт и итд. Я попросил у автора разрешение пересказать ее у себя в журнале, и мы договорились, что названия я уберу, а все остальное перескажу. Строго говоря, история приходит к вам из третьих рук: ее непосредственным действующим лицом была жена моего коллеги.
Итак, много лет назад ЖМК (жена моего коллеги) работала в очень большой компании, имя которой вам знакомо. Она получила неожиданное задание: разработать способ аккуратного подсчета строк кода, чтобы менеджеры первого и второго звена могли с помощью этих чисел измерять продуктивность разработчиков. Все это происходило в огромном отделе данной компании, включавшем в себя более 2000 (!) разработчиков.
ЖМК должна была использовать машинный анализ исходного кода, а не просто количество "физических" строк в файлах. Иными словами, это скорее был подсчет отдельных инструкций (statements) в языке, хотя назывался он "количество строк кода". Одним из ключевых вопросов, которые понадобилось прояснить с менеджерами, оказался вопрос if-statements, которые на данном языке часто писали в одну строку: считать их за одну строку или каждый branch считать отдельно? Менеджеры решили, что каждый branch следует считать отдельно.
Внимание, эффект второго порядка!
Вскоре после введения нового режима измерения продуктивности ВСЕ if-then statements в исходном коде данного проекта стали выглядеть так:
if CONDITION then ACTION else ;
Т.е. программисты обнаружили, что если добавить "else" перед точкой с запятой, то их продуктивность удваивается.
ЖМК также обнаружила большое количество блоков следующего вида:
if (v > 0) then x = 3 else ;
if (v > 0) then y = sqrt(v) else ;
if (v > 0) then print(y) else ;
там где обычно программист написал бы
if (v > 0) then begin x = 3; y = sqrt(v); print(y) end ;
Дело в том, что "обычный" способ считался за 3 строчки кода (или 4, если добавить пустой else в конце), а "новый" за 6.
и так далее.
Кому-то может показаться странным, что программисты могли так извратить светлый дух науки Тьюринга и Кнута, и породить такое уродство. Но для многих из них разница в оценке продуктивности означала разницу между "Фиатом" и "Феррари", и - что поделать - людям это было важно.
В предыдущей записи я мельком упомянул историю о том, как в одной компании программистам стали давать премии за количество строчек кода, и они в результате стали это число раздувать посредством всяких ухищрений.
Несмотря на то, что история звучит апокрифичненько, на самом деле я о ней прочитал всего пару дней назад во внутренней рассылке на работе, и в ней были указаны конкретная компания, конкретный отдел, продукт и итд. Я попросил у автора разрешение пересказать ее у себя в журнале, и мы договорились, что названия я уберу, а все остальное перескажу. Строго говоря, история приходит к вам из третьих рук: ее непосредственным действующим лицом была жена моего коллеги.
Итак, много лет назад ЖМК (жена моего коллеги) работала в очень большой компании, имя которой вам знакомо. Она получила неожиданное задание: разработать способ аккуратного подсчета строк кода, чтобы менеджеры первого и второго звена могли с помощью этих чисел измерять продуктивность разработчиков. Все это происходило в огромном отделе данной компании, включавшем в себя более 2000 (!) разработчиков.
ЖМК должна была использовать машинный анализ исходного кода, а не просто количество "физических" строк в файлах. Иными словами, это скорее был подсчет отдельных инструкций (statements) в языке, хотя назывался он "количество строк кода". Одним из ключевых вопросов, которые понадобилось прояснить с менеджерами, оказался вопрос if-statements, которые на данном языке часто писали в одну строку: считать их за одну строку или каждый branch считать отдельно? Менеджеры решили, что каждый branch следует считать отдельно.
Внимание, эффект второго порядка!
Вскоре после введения нового режима измерения продуктивности ВСЕ if-then statements в исходном коде данного проекта стали выглядеть так:
if CONDITION then ACTION else ;
Т.е. программисты обнаружили, что если добавить "else" перед точкой с запятой, то их продуктивность удваивается.
ЖМК также обнаружила большое количество блоков следующего вида:
if (v > 0) then x = 3 else ;
if (v > 0) then y = sqrt(v) else ;
if (v > 0) then print(y) else ;
там где обычно программист написал бы
if (v > 0) then begin x = 3; y = sqrt(v); print(y) end ;
Дело в том, что "обычный" способ считался за 3 строчки кода (или 4, если добавить пустой else в конце), а "новый" за 6.
и так далее.
Кому-то может показаться странным, что программисты могли так извратить светлый дух науки Тьюринга и Кнута, и породить такое уродство. Но для многих из них разница в оценке продуктивности означала разницу между "Фиатом" и "Феррари", и - что поделать - людям это было важно.
no subject
Date: 2010-05-10 11:32 am (UTC)Но - почему???
Казалось бы всем ясно насколько это эээээ странный метод измерения эффективности работы.
Или все менеджеры у них пришли из текстильной промышленности?
no subject
Date: 2010-05-10 11:33 am (UTC)no subject
Date: 2010-05-10 11:34 am (UTC)no subject
Date: 2010-05-10 11:34 am (UTC)no subject
Date: 2010-05-10 11:36 am (UTC)no subject
Date: 2010-05-10 11:36 am (UTC)http://www.econlib.org/library/Enc/UnintendedConsequences.html
no subject
Date: 2010-05-10 11:39 am (UTC)no subject
Date: 2010-05-10 11:40 am (UTC)Никогда с таким не сталкивался, даже не знаю, насколько он сейчас распространен.
no subject
Date: 2010-05-10 11:41 am (UTC)no subject
Date: 2010-05-10 11:43 am (UTC)no subject
Date: 2010-05-10 11:45 am (UTC)no subject
Date: 2010-05-10 11:48 am (UTC)no subject
Date: 2010-05-10 11:49 am (UTC)no subject
Date: 2010-05-10 11:51 am (UTC)no subject
Date: 2010-05-10 11:52 am (UTC)Поскольку я не столько пишу свой код, сколько правлю чужой - и почти всегда путём отсечения лишнего.
+1
Date: 2010-05-10 11:53 am (UTC)no subject
Date: 2010-05-10 11:57 am (UTC)И тогда бы Вы могли скооперироваться с кем-нибудь, кого считают по кол-ву добавленных строк, дав другу подзаработать.
no subject
Date: 2010-05-10 11:58 am (UTC)no subject
Date: 2010-05-10 12:06 pm (UTC)что стали делать программисты? дублировать код, заключая его в комментарии.
no subject
Date: 2010-05-10 12:07 pm (UTC)no subject
Date: 2010-05-10 12:09 pm (UTC)if TRUE then ...
Будет совсем круто.
no subject
Date: 2010-05-10 12:20 pm (UTC)А я б на месте ЖМК извратился и подсчитывал количество реальных машинных инструкций в объектном коде после комиляции с максимальной оптимизацией.
no subject
Date: 2010-05-10 12:25 pm (UTC)no subject
Date: 2010-05-10 12:26 pm (UTC)Если, например, было бы про работников суппорта, которые получали премии за количество и сложность закрытых тикетов, которые плодят ненужные тикеты и раздувают их сложность, наверное было бы по другому.
А, скажем, если сказать про таксистов, ездящих самым длинным из возможных путей, то их точно назвали бы жуликами, а не говорили про эффект второго порядка от введения счетчика.
no subject
Date: 2010-05-10 12:27 pm (UTC)Тогда бы писали:
if (v > 0) then x = 0 else ;
if (v > 0) then x++ else ;
if (v > 0) then x++ else ;
if (v > 0) then x++ else ;