Comments 174
Самое главное чтобы по итогам этого «рефакторинга» изначальная «Hello World» программа не превратилась в симулятор большого адронного коллайдера.
Всё к лучшему, Hello World уже как-то поднадоел ;) Но да, риск превратить пару строчек в монстра есть всегда.
Я думаю, есть смысл писать сразу в личку, т.к. всё равно придётся для передачи контактов и прочей инфы.
Не ведитесь. «Ведущий» устроился на новую работу и скинет вам код который «осталось от предыдущего разработчика»
И после игры его тихо «уйдут» за слив кода. Начальство тоже хабр читает иногда :)
думаю, что умное начальство понимает, что ничего страшного не произойдет даже если 30-50 процентов кода компании сольётся вовне
Почему? Объясните?

И как же договор о неразглашении? Любое умное начальство заставляет его подписывать.
Да успокойтесь вы, этот код не имеет никакого отношения к моей работе.
я говорил с изрядной долей иронии, но я действительно так думаю. Попробую обосновать.
1) Согласитесь, что полезный и работающий код сам по себе — вещь ненамного более понятная, чем его скомпилированная версия. Обучение нового сотрудника архитектуре проекта и костылям, оную поддерживающим, занимает около месяца — это если решения были как-то документированы, а все сотрудники, их реализовавшие, все еще работают в компании.
2) в большинстве программных продуктов лишь пара процентов кода делает что-либо шибко умное, например реализует какой-нибудь сложный и хитрый алгоритм. Сам по себе этот алгоритм — это, как выразился Хоар, «маленькая программа, старающаяся пробиться наружу большой» и вы многое бы отдали не за быстрый работающий костыльный код, а за медленный и ясный псевдокод и блок-схему на бумажке, плюс объяснения дяди, который это придумал.
3) я просто пытаюсь придумать, что великое я или моя компания могла бы сделать, если бы нам был доступен некоторый чужой замечательный код. Код исходников гуглопоисковика (без статистики поисковых запросов), код EMC'шного Clarion'а, код IBM Watson, код Siri, код Windows, World of Warcraft. И не вижу способов не только причинения вреда гигантам-владельцам кода, но и даже принесения себе пользы. Разве что для code-review семинаров использовать и опыт получать.
Ну это зависит от области. Я так думаю, если бы код Watson попал не к вам, а к разработчикам Siri (например), они бы пользу извлечь в принципе могли.
Я не согласен с этим комментарием дважды. Во первых не понимает. Во вторых — вплоть до 99%.
я согласен с вашим несогласием, это должно быть чертовски умное начальство :)
Шикарная идея. Пару месяцев назад на работе планировали создать «брусок», который соискатели должны были рефакторить в качестве тестового задания.
… тебе показывают то, что осталось от предыдущего разработчика.

Я один представил себе кучку пепла, или изнеможённое трясущееся бледное тело предыдущего разработчика в лохмотьях, который уже даже стакан воды поднять не может?
Я представил себе почти чистый С-код в Qt C++ проекте, а потом что-то внутри одумалось, сказало: «БРРР! Не может этого быть! Программеры же хорошие!!!» и перед глазами всплыл образ вмеру понятного, почти не откомментированного кода без документации, методы и классы которого на 70% соответствуют своим именам. Пара торчащих с боля брани костылей, флагов и трэша.

Может, это я так свой код представляю? :)

Неее… программеры же хорошие :)
Да и на чистом C я не пишу )
Ой, а можно я тоже подкину немного кода? Я вот недавно устроился в новое место, и тут работы по рефакторингу по горло, не справляюсь) можете порефакторить и мне вернуть.
«Привет, %habrausername%. Я хочу сыграть с тобой в игру.» — кто то насмотрелся фильма «Пила»?)))
Помню, на форумах по игре Цивилизация была такая фишка, что одну игру играли по очереди по одному ходу, сосиски это называлось, вроде как, или сосисочные игры :-)
Вероятно это преобразованное название от Succession Games =))
В Dwarf Fortress тоже есть подобные игры, с веселыми описаниями событий, и руганью в адрес предыдущего правителя.
Что-то мне подсказывает что термин «сосисочный» уходит корнями горадо дальше, чем вам кажется. В до-компьютерную эпоху. Многие знакомые лет так 50и рассказывали что еще в их время была версия пинг-понга для большой компании. И называлось это Колбаса, или Сосиска (где как). Игра проста: все встают вокруг тенисного стола, один игрок подает, тот кто напротив — отбивает, потом вся «колбаса» из любей смещается по часовой стрелке, так что мяч принимает не тот кто подавал, а человек по правую руку от него. Кто пропустил мяч — выбывает, кто остался последним — выигрывает.
Всё так, только называется это не «колбаса», а «солнышко» и выбывающий игрок кладёт свою ракетку на стол, добавляя излишней сложности оставшимся.
Java знаю плохо. Использовал мало. Зато программирую больше 15 лет и знаю кучу языков. Хочу играть O_O.
А почему бы не взять несколько языков? Так сказать, вести параллельно несколько игр. Java, C++, Objective-C, Ruby, JS, Go…
Мне кажется, желающих поучаствовать было бы больше.
Да собссно и один кусок можно на разные языки переписывать, еще веселее будет
Да. Плюс появилась мысль,
1) а не сделать ли трекинг хода рефакторинга с общей инфо: «изменено XX байт, всего YYY байт».
2) И сам код должен тестироваться на исправность
3) и, желательно, иметь смысл. Какой-нибудь плагин к jQuery и несколько демо-тестов к нему.
4) и лучше, чтобы проверялся jslint-ом, иначе превратится в переливание из одного стиля в другой.
5) размером строчек на 150. Меньше — делать будет нечего.
Может лучше не плагин для jquery, а что-нибудь, связанное с приложениями? Но без крутых библиотек, типа KO и Angular.
Можно. vooD внизу предлагает порефакторить игру примерно на 500 строк кода. Возьмёмся?
Трекинг сделаем на Гитхабе, чтобы в readme.md был виден прогресс каждого шага. Только если режим работы закрытый с 1 ведущим, то сам код не выкладывается, а ведущий только отчёты пишет на 2-3 сроки по каждому шагу в 1-2 дня.
Итак,
kabzon
medved13
termi
spmbt
ariser
ahmpro
Имеется игра на JS + HTML5 + Box2d. 483 строки на JS (исключая библиотеки). Говнокод 100%. Кроме рефакторинга, можно поправить производительность.
Присуммировал и разослал всем 11 js-никам письма одинакового содержания.
Ничего, и ваш час придёт когда-то ;)

А если серьёзно, то внимательно прочитайте пост…
UFO landed and left these words here
UFO landed and left these words here
Главное чтобы начальник не увидел чем вы занимаетесь, а то еще подкинет действительно «веселый» рефакторинг.
Так может это и есть «хитрый план» начальника, придумавшего способ сэкономить на рефакторинге?
Есть кусок качественного говнокода на JS. Кому? Налетай!
Полагаю, что первая итерация внесет существенный вклад, а последующие — малозначительный.
UFO landed and left these words here
И «Первой итерацией» будет: Написать Хэлло Ворлд на %фашЛюбимыйПХПфреймворк%. Всё. Победа. :)
Но, если что — я в деле.
Ну… если тебе придет спагетти-пхп… то создать пустой проект на текущих фреймворках — дело пары минут. Потом копипаста.
Можно взять какой нибудь относительно сложный парсер. Этакую махину в одном PHP файле спагетти вида. И Разобрать его нормально привести к корректному виду. Разделить на классы. И оптимизировать. Есть у кого в закромах такое «добро»?
На пхп было бы хорошо. Осталось отыскать вменяемый код для него.
Рефакторинг ради рефакторинга это плохо. Ведь если участнику прийдет код, который в рефакторинге не нуждается, он все равно будет его рефакторить (не зря же он соглашался на участие), чего в реальной ситуации он бы не сделал. Поэтому анализ будет не объективным
Полагаю он может сказать, что его все устраивает и оставить как есть
Ну конечно же. Хотя я не встречал программистов, которым не хотелось бы изменить чужой код.
Думаю, в этом и есть основной поучительный момент игры.
После публикации результатов всем будет очевидно, что в какой-то момент этот код нужно было оставить в покое. Но нет же!
Учавствую. Уже выслал контакты. Будет интересно посмотреть потом итоги и итерации рефакторинга.
Два дня, отпущенные участнику «на все про все» — это слишком мало, чтобы что-то серьезное сделать в сложном коде.
А в простом типа «ХеллоВорлд» даже непонятно что делать — скобочки и табы расставлять и доксижен-каменты вписывать?
И еще надо учитывать, что у участника как правило нет возможности начать сразу по получении задания и закончить жестко за двое суток- семья, работа, сон…
Вот мне лично было бы интересно поучаствовать… Но…
Не менее интересно будет потом почитать чужие результаты, запасясь поп-корном.
Ну два дня — это срок пропадания. Если вы за это время откликнитесь и скажете, что вам не хватает ещё столько-то времени, то я вас конечно же подожду
Имхо, было бы лучше всем участникам выслать одновременно оригинальный вариант, собрать их результаты и разослать всем все решения, кроме их собственных.
Тогда не будет такого, что первые 1-3 человека сделают основной объем + все будут видеть все подходы других участников.
Предлагаю еще одно правило: каждый участник может изменить не более 25% строк кода (величина с потолка, можно другую).
Ну, бывает такой код, что при рефакторинге приходится менять 100% строк ) И не потому, что код написан не так, как мне нравится, а потому, что там код реально ужасен.
Только чур придерживаться какой то единой code conventions! А то сейчас начнутся разные скобочки, переносы и именование переменных. Коль пишем на Java то предлагаю Oracle'скую.
Ну тогда каждый перед рефакторингом будет делать что-то типа: Ctrl+Shift+F. И отследить собственно что поменял товарищь по diff'чику будет совсем сложно :) Никогда никто у вас не пушил класс на 6к+ строк применив свое форматирование кода? Ух и матерились же мы :)
При сравнении в diff пробелы и прочее форматирование можно не учитывать. Есть специальная настройка.
Просто отформатируйте код под свои соглашения перед началом работы. Делов-то.
У SVN, например, в настройках просмотрщика изменений есть опции игнорировать форматирование. Если всё включить, на разницу в пробелах, tab-ах и перехода строк он внимания не обращает.
… которая, что самое смешное, ни разу не отвечает даже на извечный вопрос «табы vs пробелы».
Ну, эта эпохальная битва мнений. Тут филосовский вопрос «как удобнее и как лучше?» сколько разработчиков, столько и мнений :) В этом и была идея привести к единому стандарту. А какому не суть важно :)
И я, и я!

icqkill at gmail

Предпочел бы C++, но на худой конец и джавка сойдёт.
200 строк кода это… как-то сферично и вакуумно. Такой код можно рефакторить бесконечно, так как задание, как правило, слишком расплывчато, и каждый будет делать свои собственные допущения.
Главное, чтобы не получилось как в этом гк: govnokod.ru/12678
200 строк, имхо, оптимальный размер… такие объемы рекомендуются и для группового код-ревью и т.п.
В групповом ревью понятен контекст, там как эти 200 строк являются честью целого. А рефакторить независимых 200 строк кода — не практике бессмысленно. Либо этот код и так понятен, тогда, возможно, и трогать его не стоит, либо проще написать заново, возможно с копипастом алгоритмов, если там была какая-то алгоритмическая задача.
В топике идет перепись людей, которых нельзя брать на работу, если речь идет о сопровождении крупного старого проекта.
Если у вас есть какой-то неизвестный код, то в первую очередь надо узнать, что он делает. Например пользователей спросить, или сейлзов, или админов. А ломать — уже совсем потом, когда все станет ясно и очевидно
не согласен. можно начать с чисто механических действий, не требующих глубокого понимания назначения кода. например, просто убрать дублирование -> улучшится структура кода -> улучшится понимание, необходимое для более углубленного рефакторинга.
которых нельзя брать на работу, если речь идет о сопровождении крупного старого проекта.
если речь идет о сопровождении крупного старого проекта, то на такую работу лучше не устраиваться
Заявка: nsinreal@gmail.com.
Практики вообще не имею, просто прямо-таки интересно поучаствовать.
UFO landed and left these words here
Мы на работы проводили рефакторинг документооборота. После этого программа в 3.5 млн строк кода уменьшилась на 850 тыс. строк. Справедливости ради отмечу, что скорость загрузки документов заметно увеличилась.
Тебе хочется кричать, хочется бежать из этого проклятого места, но трудовой договор сковывает тебя по рукам и ногам

Насколько я помню, на испытательном сроке можно уволиться за три дня.
3 месяца назад оказался в такой же ситуации, код запутан, тестов нет, именование объектов непривычное(по-моему так пишут стандартно на С#, когда объект — oObject, строка sString). Первое что сделал — написал тесты, после чего стал понимать предыдущего разработчика, переделал именование объектов под привычную мне верблюжью нотацию и понял что вообще-то все не так плохо, да есть ошибки, непонятки и недоделки, но в целом стала ясна основная идея.
Мне просто почему-то кажется, что любой программист относится к чужому коду(предшественника или кого-то другого) с недоверием, вроде не я писал, и непонятно как оно там внутри работает. После того как разгадал, планы и идеи другого программиста, все становится гораздо проще. Не знаю как у других — у меня так.
Может быть автор и хочет показать, что надо сначала разобраться в коде и понять его суть, а не придираться к красивости решения? Ведь по сути, каждый к кому будет приходить код из 200 строк, будет считать, что он «обязан» его отрефакторить и будет это делать.
Идея интересная, я бы хотел поиграть на C++, если кто-то организует. А еще неплохо бы сделать сайт, на котором можно такие мероприятия устраивать автоматически.
UFO landed and left these words here
Ну насчет предприятий не знаю, но могу сказать, что на своих проектах, которые для души пишутся, я пишу юнит-тесты.
UFO landed and left these words here
Ну в документации я смысла не вижу, потому как в совем коде почти всегда могу разобраться. Просто я адепт подхода «Test First» и для меня проще сначала написать тест, а потом класс.
>хочется бежать из этого проклятого места, но трудовой договор сковывает тебя по рукам и ногам.
Не совсем понял. Если не нравится работа-пишеш заявление и через две недели уходишь. Если у тебя испытательный срок-так это три дня
Не согласен с основным тезисом статьи, когда смотришь в некоторые опенсорсные библиотеки, то слеза наворачивается от того, что ты не работаешь вместе с этим человеком! Имена, структура, все прекрасно! Тут все зависит от упоротости.
Я тут еще подумал на досуге (есть у меня, знаете ли такая привычка)
И вот что хотел бы тезисно сказать:

Не бывает «рефакторинга в вакууме»
Рефакторинг всегда делается для достижения определенной цели.
Целью может быть
— устранение багов (реальных и теоретически возможных),
— оптимизация по скорости, памяти и другим ресурсам
— подготовка кода к расширению функциональности
— выкидывание части функциональности, которая оказалась дублирующейся/ненужной
и так далее — могут быть *разные* цели для рефакторинга.

Без знания цели «сосисочный рефакторинг» не сойдется. (По-моему, это предположение хочет на практике подтвердить топикстартер)

Одни программисты будут запиливать в код расширение функциональности (пример: чтоб программа считала бы не только синус и косинус, но и могла быть доточена до расчета тангенса с котангенсом), другие будут старательно выпиливать ненужные на их взгляд методы, которые «только занимают память и тормозят выполнение, а по ТЗ не нужны»

Пример из жизни — заходит сосед по даче ко мне, просит топор. Я ему даю топор, он внимательно смотрит и говорит: «ну как этим можно пользоваться? его нужно отрефакторить, тьфу! заточить! я не смогу рубить им дрова!»
А мне не нужен острый топор — я его использую для своих нужд — колю им кокосовые орехи или подкладываю под ножку качающегося стола, так как дровяной печки у меня нет. И острый топор мне наоборот не нужен — мало ли что? Так что попеременное пользование одним топором без четкой цели будет попеременное затачивание и затупление топора.
UFO landed and left these words here
Я поначалу хотел ревьюить каждое изменение, но внезапно участников так много, что индивидуально к каждому подойти не получится — физически столько времени нет. Автоматизации никакой у меня пока нет. Я только пробегаюсь глазами по коду, чтобы откровенную лажу исключить, но такого пока не было. Перед составлением отчёта я сделаю автоматизированное тестирование, благо выходные данные строго детерминированы входными.
А может, нужно было в несколько параллельных потоков рефакторинг запустить, раз участников так много?
Ну что, пора тем, кому уже удалось поучаствовать, обмениваться впечатлениями :)

Мне письмо пришло вчера вечером, сегодня днем отправил назад. Кстати! Письмо имеет очень не дружественный человеку вид (тема вида [X-CY] и аттачмент). Так что будьте внимательны и проверяйте спам.

По поводу задачи. Во-первых, задача очень простая, нетривиальной логики нет. В той ветки, что досталась мне, была работа с файлами, пропертями, internationalization, logging и немного работы с коллекциями.

Единственный вопрос, который висел в воздухе все время — в какую сторону двигаться. Смотря на каждый кусок кода, думаешь «является ли это частью исходной задачи или инициатива кого-то, кто рефакторил до меня?». Поскольку правилами этого не описано, думаю, каждому вначале придется выбрать, упрощать программу выкидывая что-то «лишнее», или, наоборот, довешивать еще больше enterprise подходов и технологий. Будет очень смешно, если программа из 20 строчной (без мусора) превратится в монстра со спрингом, мавеном, хибернейтом и 20+ классами.

В общем, спасибо большое автору, мне понравилось, очень жду результатов и статистики. Очень хочется посмотреть, что было до меня и что будет после меня =)
Спасибо за отзыв. Ждать ещё прилично, даже треть участников не прошла ещё.
Кстати да, письмо, содержащее единственный файл с именем [X-CY] и без каких-либо комментариев — верный кандидат на отправку в спам. Я вообще не сразу понял, что это и откуда.
Эх! Пропустил такую веселуху.
Кстати, если бы код был на JS, было бы куда веселее.
UFO landed and left these words here
Мимо меня проплывало 3 апреля. Причем показалось, что до меня это никто не трогал и код портили намеренно.
Подозреваю подвох из разряда «как сделать так, чтобы человек выполнил тестовое, да еще и сам этого захотел».
Автор, отпишитесь, пожалуйста, о статусе тут или сделайте где-нибудь и регулярно обновляйте страничку. То, что вас уже месяц не слышно, выглядит некрасиво.
Каррент статус: мне внезапно пришло письмо счастья. Регистрировался я 15 Mar 2013 13:09:57
Only those users with full accounts are able to leave comments. Log in, please.