Re: факапы на работе
От: denisko http://sdeniskos.blogspot.com/
Дата: 05.04.17 13:07
Оценка:
Здравствуйте, HoseCo, Вы писали:

HC>Здрасте.


HC>Тут у нас программист один случайно похерил результаты своей недели работы. И его заставляют выходить на работу в выходные и за свой счет это все восстанавливать. Меня что-то от этого прям корежит. Как считаете это норм?

Не, не норм. Просто за эту неделю надо не заплатить и все.
<Подпись удалена модератором>
Re[17]: факапы на работе
От: John1979  
Дата: 05.04.17 13:19
Оценка:
Здравствуйте, landerhigh, Вы писали:

L>>>Воот. И пока ты "подготавливаешь почву" проект либо просто не собирается, либо собриается, но не работает, либо просто нет смысла делать его собираемым.

J>>собирается, работает и смысл есть.

L>

L>Ну внеси инкрементальное изменение, которое позволяет избавиться от зависимости от глобального объекта, отрастающего из легаси кода и используемого почти везде

это требование ты сам придумал.
не вижу проблем сделать это в несколько итераций с поддержанием работоспособности проекта.
Re[18]: факапы на работе
От: landerhigh Пират  
Дата: 05.04.17 13:20
Оценка:
Здравствуйте, John1979, Вы писали:

L>>

L>>Ну внеси инкрементальное изменение, которое позволяет избавиться от зависимости от глобального объекта, отрастающего из легаси кода и используемого почти везде

J>это требование ты сам придумал.

Это не я придумал. Это наследие говнокодов 25-летней давности.

J>не вижу проблем сделать это в несколько итераций с поддержанием работоспособности проекта.


Ты хотел сказать, что не знаешь, с каким проблемами это может быть сопряжено?
www.blinnov.com
Re[9]: факапы на работе
От: · Великобритания  
Дата: 05.04.17 13:47
Оценка:
Здравствуйте, Sharov, Вы писали:

Pzz>>>>>Если у меня кусок работы на три дня, и в течении этих трех дней код в промежуточном состоянии не только не работает, но даже и не собирается, что по мнению коллективного фаулера, я должен делать в конце рабочего дня?

S>·>Коммитить и пушить в приватную ветку, а с утра сбрасывать коммит.
S>А это зачем? Или это сленг такой?
git reset HEAD^
ну или --amend, ну или rebase и т.п.

S>·>Уйти домой вечером не оставив бэкапа работы за день — это для меня как уйти из дома, не закрыв входную дверь.

S>Бекап разработчик должен оставлять/делать или администратор?
Разработчик, конечно. Ибо только он знает, что он такое сегодня наделал и что имеет хоть какую-то ценность. А тупо бэкапить весь диск без разбору — ЛохматыйСов уже хорошо объяснил выше чем это грозит.
А ещё приватную ветку легко можно будет передать другому/на другой компьютер/етс. С бэкапами почти ничего нельзя интересного сделать.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[13]: факапы на работе
От: · Великобритания  
Дата: 05.04.17 14:28
Оценка:
Здравствуйте, landerhigh, Вы писали:

Pzz>>>Твой кусок собирается. Проект в целом с твоим куском не собирается.

L>·>Неужели это обнаруживается только на третий день?!
L>Что значит "обнаруживается"? Это было известно с самого начала.
ну тем более. Сразу видно, что делаешь что-то не то.

L>·>Хотя в общем понимаю, сам таким был. Но чем опытнее, тем случается такое реже и реже: легче находишь окольный путь инкрементального внесения изменений без всё-ломающих шагов.

L>Ну внеси инкрементальное изменение, которое позволяет избавиться от зависимости от глобального объекта, отрастающего из легаси кода и используемого почти везде. Только чтобы проект сразу и собирался и работал.
Да это же просто, типичный рефакторинг синглтона в Constructor Injection:
1. В каждом классе вначале выносишь ссылку на глобальный объект в методах как поле, инициализируя его в конструкторе. (каждый класс ≈ один коммит).
1а. Иногда ссылку на объект можно протащить через параметр метода. Это ещё часто простое решение при наличии циклических зависимостей, которые трудно распутать. (каждый метод ≈ один коммит)
2. Протаскиваешь его в конструктор как параметр. (каждый класс ≈ один коммит).
3. Переходишь к шагу 1 если ещё остались ссылки на глобальный объект не из Composition Root.
4. Заменяешь в Composition Root глобальное поле на локальную переменную, выкидываешь более неиспользуемое никем глобальное поле.
Т.е. начинать рефакторинг надо делать наизнанку. Начинать не с удаления самого глобального объекта, а с явного внедрения зависимостей от него во всех классах, его использущих.

Наверно коряво объяснил... Если приведёшь пример кода — могу по шагам расписать.

Так мы недавно исправляли что-то вроде System.currentMillis() на clock.millis() в ~1500 классах.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[2]: факапы на работе
От: playnext  
Дата: 05.04.17 14:36
Оценка:
Здравствуйте, denisko, Вы писали:

D>Здравствуйте, HoseCo, Вы писали:


HC>>Здрасте.


HC>>Тут у нас программист один случайно похерил результаты своей недели работы. И его заставляют выходить на работу в выходные и за свой счет это все восстанавливать. Меня что-то от этого прям корежит. Как считаете это норм?

D>Не, не норм. Просто за эту неделю надо не заплатить и все.

Не, это тоже полумеры. Я в одной конторе работал там пытались штрафовать за то что подвигов не совершаешь.
Т. е. если работаешь в нормальном режиме а не перенапрягаешся или не выдаешь креативных решений улучшений оптимизаций и т д (причем это должно явно выразиться финасово для компании) — то это уже плохо. Так и гороили — нужны подвиги.
Штрафовали у вольняли за мелкие проступки. Не было тестирования, разработчик тестил сам, но время было ограничено. Мало того что разработчик не может эффективно протестить свой код так и еще время дается менеджером и впритык. Было также принято публично обсуждать косяки перед всем коллективом и позорить сотрудника. Приход на работу в 8 утра строго, уход в 17 (не строго). Никто правда не приходил к 8 (за редким исключением) обычно в 9, 10, но за это были выговоры. причем контора не банк.
Я до того как туда попал не знал что такое бывает.
Re[14]: факапы на работе
От: landerhigh Пират  
Дата: 05.04.17 14:42
Оценка:
Здравствуйте, ·, Вы писали:

L>>Что значит "обнаруживается"? Это было известно с самого начала.

·>ну тем более. Сразу видно, что делаешь что-то не то.



L>>·>Хотя в общем понимаю, сам таким был. Но чем опытнее, тем случается такое реже и реже: легче находишь окольный путь инкрементального внесения изменений без всё-ломающих шагов.

L>>Ну внеси инкрементальное изменение, которое позволяет избавиться от зависимости от глобального объекта, отрастающего из легаси кода и используемого почти везде. Только чтобы проект сразу и собирался и работал.
·>Да это же просто, типичный рефакторинг синглтона в Constructor Injection:
·>1. В каждом классе вначале выносишь ссылку на глобальный объект в методах как поле,

А ссылочка-то неявная. Через третью библиотечку протаскиваемая и этой третьей библиотечкой используемая. И избавиться от этой третьей библиотечки инкрементально не получится. Упс.

·>1.инициализируя его в конструкторе. (каждый класс ≈ один коммит).


Только проект либо не собирается, либо не работает. О чем и говорим.
www.blinnov.com
Re[4]: факапы на работе
От: Андрей Бабошин Германия http://andreybaboshin.livejournal.com/
Дата: 05.04.17 14:44
Оценка:
Здравствуйте, Kernan, Вы писали:

K>Здравствуйте, HoseCo, Вы писали:



HC>>похоже не комитил

K>Коммитил, но не пушил в origin.

Если это гит, то всё не так уж и плохо.
http://gitready.com/advanced/2009/01/17/restoring-lost-commits.html

коллега сегодня умудрился точно такой же трюк провернуть. Упс, и бранча — нет.
Re: факапы на работе
От: Pavel Dvorkin Россия  
Дата: 05.04.17 14:55
Оценка:
Здравствуйте, HoseCo, Вы писали:

HC>Тут у нас программист один случайно похерил результаты своей недели работы. И его заставляют выходить на работу в выходные и за свой счет это все восстанавливать. Меня что-то от этого прям корежит. Как считаете это норм?


Насчет работы говорить не буду, но своим студентам на первом занятии я говорю примерно следующее.

Если за неделю до зачета Вы ко мне придете и скажете, что написали все как следует, но вот, увы, все пропало, я Вам искренне посочувствую, но предложу начать сначала.

А потом рассказываю про git.

Никто ни разу ко мне с таким заявлением не приходил.
With best regards
Pavel Dvorkin
Re[13]: факапы на работе
От: · Великобритания  
Дата: 05.04.17 15:00
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>>>Твой кусок собирается. Проект в целом с твоим куском не собирается.

Pzz>·>Неужели это обнаруживается только на третий день?!
Pzz>Нет, немного другая ситуация.
Pzz>Ты изолируешь проблему, и пытаешься ее починить для начала локально. Сознательно наплевав на то, что какие-то части проекта будут сломаны. Потом, если локальный ремонт достиг успеха, ты уже либо приведешь остальные части проекта в соответсвие, либо придумаешь, как сделать то же самое, сохранив совместимость (что может быть достаточно сложно). Но для начала тебе надо разобраться с тем, зачем ты вообще туда полез.
Да, поиск бага/лучшего решения — может стать долгим и извилистым. Но когда достиг цели — лучше выбросить решение и всю "отладочную инфу", которую понапихал где ни попадя, и начать сначала небольшими рефакторингами, инкрементальными изменениями идти уже по проторенной дорожке.

Pzz>·>Хотя в общем понимаю, сам таким был. Но чем опытнее, тем случается такое реже и реже: легче находишь окольный путь инкрементального внесения изменений без всё-ломающих шагов.

Pzz>Я сам люблю все делать инкрементально. Но иногда "резать к чертовой матери" оказывается очень существенно делевле, чем инкрементально.
Но если это занимает сильно больше одного дня — это плохой знак.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[10]: факапы на работе
От: Sharov Россия  
Дата: 05.04.17 15:05
Оценка:
Здравствуйте, ·, Вы писали:

S>>·>Коммитить и пушить в приватную ветку, а с утра сбрасывать коммит.

S>>А это зачем? Или это сленг такой?
·>git reset HEAD^
·>ну или --amend, ну или rebase и т.п.

Зачем это делать?


S>>·>Уйти домой вечером не оставив бэкапа работы за день — это для меня как уйти из дома, не закрыв входную дверь.

S>>Бекап разработчик должен оставлять/делать или администратор?
·>Разработчик, конечно. Ибо только он знает, что он такое сегодня наделал и что имеет хоть какую-то ценность. А тупо бэкапить весь диск без разбору — ЛохматыйСов уже хорошо объяснил выше чем это грозит.
·>А ещё приватную ветку легко можно будет передать другому/на другой компьютер/етс. С бэкапами почти ничего нельзя интересного сделать.

Если я все закоммитил и запушил, что бэкапить тогда?
Кодом людям нужно помогать!
Re[15]: факапы на работе
От: · Великобритания  
Дата: 05.04.17 15:09
Оценка:
Здравствуйте, landerhigh, Вы писали:

L>·>Да это же просто, типичный рефакторинг синглтона в Constructor Injection:

L>·>1. В каждом классе вначале выносишь ссылку на глобальный объект в методах как поле,
L>А ссылочка-то неявная. Через третью библиотечку протаскиваемая и этой третьей библиотечкой используемая. И избавиться от этой третьей библиотечки инкрементально не получится. Упс.
В смысле библиотечку править нельзя что-ли? Ну тогда ты не сможешь избавиться от глобальной переменной. Хотя всё ещё можно хотя бы свой код очистить.

L>·>1.инициализируя его в конструкторе. (каждый класс ≈ один коммит).

L>Только проект либо не собирается, либо не работает. О чем и говорим.
Ну сделай чтобы собирался и работал, кто запрещает-то?!
Хинт: можно временно делать два конструктора|метода — один новый с явной зависимотью в параметре, второй старый "по умолчанию" из глобальной переменной. Потом правишь все места вызова старого на новый. Когда таких мест не осталось — грохаешь старый.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[19]: факапы на работе
От: John1979  
Дата: 05.04.17 15:17
Оценка:
Здравствуйте, landerhigh, Вы писали:

L>>>

L>>>Ну внеси инкрементальное изменение, которое позволяет избавиться от зависимости от глобального объекта, отрастающего из легаси кода и используемого почти везде

J>>это требование ты сам придумал.

L>Это не я придумал. Это наследие говнокодов 25-летней давности.

говнокод 25 летней давности заставляет тебя выдвигать требование сделать рефакторинг в одну итерацию ?

J>>не вижу проблем сделать это в несколько итераций с поддержанием работоспособности проекта.

L>Ты хотел сказать, что не знаешь, с каким проблемами это может быть сопряжено?
я определенно знаю, что такой рефакторинг сопряжен с массой проблем. но я не вижу проблемы в том, чтоб сделать его итеративно.
более того, именно итеративный подход снижает вероятность ошибки и облегчает верификацию.
Re[16]: факапы на работе
От: landerhigh Пират  
Дата: 05.04.17 15:18
Оценка:
Здравствуйте, ·, Вы писали:

L>>А ссылочка-то неявная. Через третью библиотечку протаскиваемая и этой третьей библиотечкой используемая. И избавиться от этой третьей библиотечки инкрементально не получится. Упс.

·>В смысле библиотечку править нельзя что-ли? Ну тогда ты не сможешь избавиться от глобальной переменной. Хотя всё ещё можно хотя бы свой код очистить.

Нельзя. Она сторонняя. Исходников нет, но есть ее новая версия или полная ее замена, на которую нужно перейти сразу.

L>>·>1.инициализируя его в конструкторе. (каждый класс ≈ один коммит).

L>>Только проект либо не собирается, либо не работает. О чем и говорим.
·>Ну сделай чтобы собирался и работал, кто запрещает-то?!

Давай, половина кода зависит от глобальной переменной, а другая — уже нет. При этом первая половина рассчитывает на то, что все пользуются этой глобальной переменной, иначе ничего не работает.
Время пошло

·>Хинт: можно временно делать два конструктора|метода — один новый с явной зависимотью в параметре, второй старый "по умолчанию" из глобальной переменной. Потом правишь все места вызова старого на новый. Когда таких мест не осталось — грохаешь старый.


Можно, только это решение какой-то другой проблемы.


P.S. Я не понял, тут вообще никто с легаси кодом не работал, что ли?
www.blinnov.com
Re[20]: факапы на работе
От: landerhigh Пират  
Дата: 05.04.17 15:20
Оценка:
Здравствуйте, John1979, Вы писали:

L>>Это не я придумал. Это наследие говнокодов 25-летней давности.

J>говнокод 25 летней давности заставляет тебя выдвигать требование сделать рефакторинг в одну итерацию ?

Представь себе.
Нет, итераций ты можешь делать сколько угодно, но рабочей системы у тебя не получится до окончания рефакторинга.

J>>>не вижу проблем сделать это в несколько итераций с поддержанием работоспособности проекта.

L>>Ты хотел сказать, что не знаешь, с каким проблемами это может быть сопряжено?
J>я определенно знаю, что такой рефакторинг сопряжен с массой проблем. но я не вижу проблемы в том, чтоб сделать его итеративно.
J>более того, именно итеративный подход снижает вероятность ошибки и облегчает верификацию.

Читай в соседней ветке о глобальных переменных.
www.blinnov.com
Re[14]: факапы на работе
От: John1979  
Дата: 05.04.17 15:20
Оценка: +1
Здравствуйте, ·, Вы писали:

·>Да это же просто, типичный рефакторинг синглтона в Constructor Injection:

ты описал один из самых простых рефакторингов.
на деле все бывает гораздо геморройнее, но, тем не менее, решаемо.
Re[17]: факапы на работе
От: John1979  
Дата: 05.04.17 15:26
Оценка:
Здравствуйте, landerhigh, Вы писали:

L>P.S. Я не понял, тут вообще никто с легаси кодом не работал, что ли?

я рефакторил ядро фаервола написанного в C стиле в 9х годах, изначально работавшего в один поток, с кучей глобальных таблиц и переменных, к которому потом сбоку были прикручены потоки для проксирования, DPI и еще кучи мелких фиговин, с кучей мутексов и одним убер глобальным супермутексом.

после этого слушать про то, что что-то там нельзя рефакторить итеративно, потому что где-то там какая-то там глобальная фигня завелась... просто смешно.
Re[18]: факапы на работе
От: landerhigh Пират  
Дата: 05.04.17 15:28
Оценка:
Здравствуйте, John1979, Вы писали:

L>>P.S. Я не понял, тут вообще никто с легаси кодом не работал, что ли?

J>я рефакторил ядро фаервола написанного в C стиле в 9х годах, изначально работавшего в один поток, с кучей глобальных таблиц и переменных, к которому потом сбоку были прикручены потоки для проксирования, DPI и еще кучи мелких фиговин, с кучей мутексов и одним убер глобальным супермутексом.

А слабо прочитать мое сообщение еще раз? А потом еще раз. До понимания, так сказать

J>после этого слушать про то, что что-то там нельзя рефакторить итеративно, потому что где-то там какая-то там глобальная фигня завелась... просто смешно.


Ага, абхахочешься.
www.blinnov.com
Re[17]: факапы на работе
От: · Великобритания  
Дата: 05.04.17 15:45
Оценка:
Здравствуйте, landerhigh, Вы писали:

L>>>А ссылочка-то неявная. Через третью библиотечку протаскиваемая и этой третьей библиотечкой используемая. И избавиться от этой третьей библиотечки инкрементально не получится. Упс.

L>·>В смысле библиотечку править нельзя что-ли? Ну тогда ты не сможешь избавиться от глобальной переменной. Хотя всё ещё можно хотя бы свой код очистить.
L>Нельзя. Она сторонняя. Исходников нет, но есть ее новая версия или полная ее замена, на которую нужно перейти сразу.
Надо смотреть по обстоятельствам. Но даже в самом тяжелом случае — всегда можно отделить библиотеку заменяемым фасадом.

L>Давай, половина кода зависит от глобальной переменной, а другая — уже нет. При этом первая половина рассчитывает на то, что все пользуются этой глобальной переменной, иначе ничего не работает.

L>Время пошло
Так говорю же. Код может использовать ту же глобальную переменную, но ссылаться на неё не напрямую из кода методов, а через параметры конструкторов/методов.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[18]: факапы на работе
От: landerhigh Пират  
Дата: 05.04.17 15:50
Оценка:
Здравствуйте, ·, Вы писали:

L>>Нельзя. Она сторонняя. Исходников нет, но есть ее новая версия или полная ее замена, на которую нужно перейти сразу.

·>Надо смотреть по обстоятельствам. Но даже в самом тяжелом случае — всегда можно отделить библиотеку заменяемым фасадом.

Иногда так можно сделать. Но не всегда имеет смысл, например, низкоуровневая библиотека меняется на нечто, имеющее более человеческий интерфейс. И при этом код приводится в несобираемое состояние на довольно длительное время... особенно если происходит переход от pollig модели к асинхронным вызовам или еще чего похлеще.

L>>Давай, половина кода зависит от глобальной переменной, а другая — уже нет. При этом первая половина рассчитывает на то, что все пользуются этой глобальной переменной, иначе ничего не работает.

L>>Время пошло
·>Так говорю же. Код может использовать ту же глобальную переменную, но ссылаться на неё не напрямую из кода методов, а через параметры конструкторов/методов.

Твой код про глобальную переменную ничего не знает. Ее использует библиотека, написанная при царе горохе и никаких способов избавиться от этого глобального объекта не предоставляющая.
www.blinnov.com
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.