Comments 84
Просто плагин к jira генерирует нулевой codecount репорт для незамерженных веток.
Разработчики страдают. А так могли бы спокойно докладывать что вот, я добавил 1000 новых строк, которые потом удалил за ненадобностью. Итого работы на 2000 строк, плати.
А ведь кто-нибудь через пару месяцев наткнется на эту статью и попробует замкнуть
Надеюсь, что в таком случае естественный отбор уничтожит этого закольцованного уродца в зародыше, он же будет нежизнеспособен.
Гит это и так граф, а не дерево. В дереве были бы невозможны мержи. Правда граф ациклический.
А затем их поработят иллитиды, а затем они разобъются на гитзераев и гитиянки, а затем придет Зертимон и Git, затем Дак'кон, Безымянный, Неразрывный Круг Зертимона, опять Безымянный, Трансцендентный, Война Крови, священная война, холивар, холивар, холивар...
1 апреля, кто-то читает теги
Вот с какой целью вы добавляете это в теги? (и ещё несколько публикаций грешат тем же)
Розыгрыш не должен быть подписан «это розыгрыш».
аа, первое апреля же)
И вместо трёх программистов теперь 350 вынужденных инвалидов, решающих больше проблему состоятельности методов решения проблемы, нежели саму проблему.
Я знал, что доживу до времен, когда как программист стану более не нужен на рынке, не знал только, что времена эти наступят при моей еще жизни.
Да-да, archive_prod3_release_copy (5)_fix27.rar
это верх совершенства, а гит ненужная помойка.
Вот есть у меня PR, у меня за 2 дня 1500 строк добавлено, 1000 строк удалено. У 4 разработчиков схожие цифры. Где-то треть изменений пересекаются. Как их все объединить, не потеряв работы?
Или, например, нужно за неделю сделать несколько фич, и один человек никак не успевает. На тех местах где я работал задачи было принято параллелить, даже если они частично пересекаются. Что предлагаете делать в вашем случае?
Если разбиение достаточно грамотное, то один модуль содержит вполне линейный код, который проанализировать новому человеку не займёт много времени.
А вот рвать время в клочья — это же гарантированный ахтунг с косяками, и гит или любой другой механизм контроля версий — тут просто выполняет роль подтирки на почти гарантированный случай при попытке надрать время — случай, когда все обо… ались и виноватыми будут назначены исполнители, которые, да, начнут уходить…
Ну, к слову, линейность кода — показатель хорошо продуманной системы данных и модулей с субмодулями. А вот многоэтажные логические конструкции — показатель строго противоположного. Я запрещал раньше своим студентам и коллегам использовать табуляцию меньше 8 символов, логика простая: если твой код не влазит на экран по ширине — ты лошара.
В крайнем случае, вы рискуете переписанием ОДНОГО модуля.
Если разбиение достаточно грамотное, то один модуль содержит вполне линейный код, который проанализировать новому человеку не займёт много времени.
Я правильно понимаю, что предлагается переписывать модуль каждый раз, как уходит человек его разработавший?
С другой стороны, строго по Генри Форду — какой смысл в проекте, из которого непрерывно бегут люди? Для кого этот проект тогда? Кому он греет карман и душу, кроме владельца проекта? — Раз работникам он неинтересен, то и клиенты получают значит УГ очередное. Это так, бизнес на розах 7го марта, пустышка ценою в маркетинг пустышки.
С другой стороны, строго по Генри Форду — какой смысл в проекте, из которого непрерывно бегут люди?
Из проекта не бегут люди, у людей бывают разные мотивы. Например, полгода назад у нас ушел девопс, только потому, что ему хотелось больше командировок в страны ближнего и дальнего востока. К продукту не было никаких претензий, просто хотелось путешествовать.
Раз работникам он неинтересен, то и клиенты получают значит УГ очередное.
Мне интересен проект, это не значит, что я не могу уйти на еще более интересный проект. А еще на меня может тупо кирпичь упасть. Я могу поскользнуться и разбить голову. Меня могут ограбить, я могу попасть в ДТП. Куча способов выпасть из разработки.
— Ладно, возьмем менее радикальные варианты. Заболеть человек может? Ну вот просто заболел, и не может свой модуль писать. А модуль очень нужно сделать в течение недели. Ну, например, представьте, что от этого зависит новогоднее выступление президента. Второго января никому не интересно будет, что вы сделали, 31 декабря несъезжаемый дедлайн. Как быть, если никто в команде не понимает, что в этом модуле происходит. Да даже не модуле, а подсистеме. Ведь «20-25 лет назад проект писался максимум тремя программистами», то есть выпавший программист не один модуль за собой тянет, а треть всех модулей в проекте. Предлагаете за неделю во всем разобраться или переписать треть проекта?
if()
if()
else if()
else
else
if()
if()
else if()
if()
else
else
else
/// Ну, вы поняли ))
Нет никакого оправдания вариантам вроде
A(){
}
B(){
…
A()
…
}
…
…
…
Z(){
…
Y();
…
}
Как нет и никакого оправдания называть итератор сложнее чем i.
Нет никакого оправдания разбивать проект на 200 файлов, если он вполне логично вписывается в 20, включая файлы визуальной настройки среды разработки.
Нет никакого повода подключать какой-бы-то ни было движок СУБД, если все ваши данные можно свести в 5 несчастных таблиц, в каждой несчастные 200 миллионов записей.
Есть тупо культура, и культурно написанный код всегда читается другим/новым/забывшим специалистом.
Мы ведь все забывшие специалисты — участок, который отлажен и пашет годами — он тупо забывается.
Более того, культурно написанный код более открыт для поиска ошибок, а потому реже их содержит — они видны уже самому разработчику еще до этапа тестирования.
Отлично, согласен со всем написанным.
Непонятно только, как он отвечает на заданные вопросы.
Это к тому, что может и заболеть, и забеременеть, и уехать в Канаду.
Верно
В нормальном случае не нужен другой человек, который в курсе заведомо, что делал ушедший
Вывод диаметрально противоположенный правильному.
если у ушедшего было достаточно времени, что бы без нервотрёпки писать и доводить до ума красивый, аккуратный и компактный код, где вся сложная математика задокументирована, а всё остальное написано прозрачно и понятно даже человеку с невысокой квалификацией.
1. аккуратная документация может быть только у продукта, который настоялся хотя бы несколько лет. Документировать когда апи кардинально меняется каждый год не очень получится
2. задокументировать так, что не придется понимать код затруднительно. Возьмите исходный код rustc, там все задокументировано выше некуда, и попробуйте что-нибудь понять.
3. Достаточно времени это сколько? Человек который болеет не будет ничего объяснять, он в очереди в поликлинике сидит или постельный режим соблюдает, человек который увольняется будет в компании 2 недели, за которые трудно объяснить все, человек который помер вообще вряд ли что-то объяснит.
После этого даже желание как-то реагировать отпадает. )))
Вот ответьте на простой вопрос:
50 лет назад были узкоплатформные ассемблеры.
35 лет назад был кроссплатформный С, потом плюсы.
20 лет назад была совсем платформо-независимая ява и такой же SQL.
Какого дьявола понадобилась вся вот эта остальная языко-платформо-помойка из всяких решеток, питонов, и прочей холеры с дотнетами, которую мы развели себе на голову и теперь георически с ней боремся?..
Сколько проблем вся эта мусорка создала по сравнению с тем, сколько решила?
Ну вот правда, куда теперь без Git? ))))))
Вместо стандартизации и унификации мы теперь идем на поводу у маргинальных диктатур экспресс-решенчества.
Логшика какая была в свое время?
Мало спецов, они дорогие, давайте сделаем средства разработки для лохов.
Сегодня спецов много, но решают они лоховские задачи лоховскими средствами за лоховские деньги.
Доигрались?
Вот медики молодцы, блюдут корпоративный ценз еще со времен Гиппократа :)
Честь имею, удачи и терпения вам по работе, они вам понадобятся.
Эволюция С, что мне в нем нравится, очень консервативна, в С не тянут слепо любую появляющуюся тенденцию. Есть правда и некоторые спорные вещи, например за появление template я бы поубивал, столько косяков напложено с применением шаблонных типов. Слава богу эта лихорадка остыла немного. А вот реализация объектного подхода в С(++) изумительная и синтаксически внятная.
Вы не знали, что времена, до которых вы доживете, наступят при вашей жизни?
Так это и происходит… Сперва утверждается что «переписывать неделю — дорого», а потом оказывается, что наложенная за 5 минут заплатка тянет за собой убытки ещё годами. При этом на времязатраты кодирования накладываются еще бОльшие времязатраты на менеджмент. О нервах вообще молчу.
Через какое-то время из проекта расползаются ключевые фигуры и спустя 10 лет проект становится громоздким возом заплаток, который лечить уже никто не собирается ни за какие деньги — проще начать новый проект.
Есть вещи, которые позволяют ослабить проектную составляющую. А проект это в первую очередь именно проект — цельная концепция, в которую любая рюшечка вписывается сама собой логично.
Когда настает момент, что новая рющечка не вписывается — необходимо перепроектирование, иначе и эта, и все последующие рюшечки автоматически становятся заплатками.
Или возьмем более интересный момент. У гита есть куча интересных инструментов, например git bisect. Вопрос — как его эмулировать? Или «нинужна»?
Только на этапе проектирования-допроектирования вы должны взять перфоратор и добавить на бетон протокол для нового черного ящика, что бы обе девочки понимали, что могут делать любые вещи, которые не противоречат тому, что на стене.
Погодите, вот у нас есть
void X() {
Foo(1, 2)
}
Вот девочка добавляет логгирование
void X() {
log!("Before Foo");
Foo(1, 2)
log!("After Foo");
}
Вот мальчик в это время у себя реализует бизнес-требование передавать айди текущего пользователя в функцию:
void X() {
Foo(1, 2, CurrentUserId)
}
Какого рода черные ящики тут должны существовать? Как эти изменения дружить друг с другом?
class SomeLogTypeClass {
private:
baseClassForXYZ *context;
public:
void __cdecl SomeLogTypeClass L(baseClassForXYZ *c){
context=c;
…
}
…
void __cdecl Log(int m){
… context.UserId…
}
};
…
void __cdecl XClass::X(){
SomeLogTypeClass Log(this);
…
Log.Log(a);
…
Log.Log(b);
…
}
Как вариант, без претензий на вашу конкретику, мне она неизвестна.
И прошу пощения за инлайн, тут неудобно набирать код.
Суть в том, что бы сделать любой субмодуль проекта максимально автономным, насколько это позволяет требование многопоточности, если таковая используется.
В данном случае, перфоратором долбится только то, что в базовом классе есть UserId.
Можно даже сразу прописать в конструкторе базового класса UserId=0, что бы принимать это как знак нештатной ситуации, когда величина останется непрописанной.
У вас очень много деталей, за которыми леса не видно. Можно без плюсов и вот этого всего? Мы не выдумываем иерархию, в которой эта задача решалась бы без изменений (мы ведь не пророки, да?), Мы смотрим ситуацию, когда один и тот же метод должны поправить два человека, причем их задачи никак не связаны — один человек реализует бизнес-логику, другой — инфраструктурную задачу.
Желательно использовать псевдокод как я привел выше, а не писать на плюсах.
завтра маша вносит свои правки по логике, послезавтра Федя спокойно переводит всё на новый код.
В таком варианте вы можете спокойно подвергнуть каждый этап качественному тестированию и оценить все риски.
- Во-первых не всегда заранее очевидно, что нужно менять для задачи. Например, оценили, что нужно поменять модуль Х, а во время реализации оказалось, что там были неочевидные завязки на Y и Z, которые в это время правил другой разработчик.
- Во-вторых это просто издевательство над пользователями. "Да, мы знаем, что вы все хотите фичу Х, но у нас Ксюша делает логгирование, поэтому мы не можем её сделать. Зато смотрите, теперь мы поддерживаем новую файловую систему! (разработчику нефиг было делать и он сварганил что-то из низа беклога, что не пересекается по текущим задачам).
- В-третьих при количестве разработчиков за десяток количество комбинаций растет настолько, что в голове удержать что сейчас делать можно, а что нельзя нереально.
- В-четвертых косячить люди все равно будут, потому что они люди собственно.
Подытожим, метод с архивами работает на командах, где люди 20-30 лет сидят на одном проекте, никогда с него не уходят, четко делят границы ответственности по всем модулям, никогда не болеют и не ошибаются.
И до сих пор непонятно, что с гитом не так, ведь с гитом будет все ровно точно так же :) Гит ведь строго мощнее варианта с архивами. Еще и место экономит, потому что дельта-кодирует все.
1. Ситуация абсолютно идиотская. Обычно такая ситуация следствие полного отсутствия стадии проектирования, либо следствие безалаберного проектирования, либо отсутствие реализационного видения структуры проекта в виду избытка образования в знаменателе с недостатком опыта независимой разработки в числителе, либо ошибочного видения из-за приверженности некой однобокой парадигме от какого-нибудь забулдыжного коучера, или как их там…
2. Над пользователем не нужно издеваться, заказчик всегда прав, Надо работать вместе с заказчиком, вникать в причину его проблем, а не слепо реализовывать глупости, которые он придумывает, что бы компенсировать глупости разработчика.
Часто слеп и разработчик и заказчик, Только совместные усилия позволяют увидеть правильное продуктовое решение.
Да, бывает, что время не терпит, но потом оно появляется и его надо использовать что бы убирать наставленные впопыхах костыли.
3. Да, Форточки с фортокопродуктами были созданы с вовлечением иногда тысяч индусов. И никакой менеджмент и никакие инструменты не смогли сделать с этим что-либо. Из окон до сих пор торчат тысячи костылей, которые торчали еще в 1994м. Сейчас в той же стадии развития находятся линуксы во всём своём ассортименте. И, несмотря на то, что минули десятилетия, поменялись инструменты, создано еще 40 ненужных языков, ситуация не меняется — то же количество костылей, просто костыли своеобразные.
4. Тем не менее, количество косяков обратно пропорционально качеству и детальности проработки концепта. Как и качество косяков — самые надежные и нелечимые источники косяков заложены в самом концепте.
— Всё с гит-ом так. Только 20 лет назад ты садился и за неделю писал микросервер или CGI, которые волокли на паршивеньком мэйнфрейме столько запросов, сколько мог пропустить к тебе канал. И тебе не нужно было 20 косоруких инвалидов. Хватало одной девочки, которая умеет ровно резать сыр и наливать коньяк. И ничего практически не глючило. И, поэтому, не нужен был гит. :)
А теперь, блин, нужен!!! :)
- То есть по-вашему на этапе планирования всегда можно точно оценить список файлов, которые будут затронуты при реализации задачи?
а не слепо реализовывать глупости, которые он придумывает
Приходит такой юзер "вот у вас график по заявкам в разрезе периодов, а нам бы наоборот, по периодам в разрезе заявок", а вы ему такой "что за глупости ты тут мне несешь. Не нужно тебе оно".
Вот так вот махом все продукты созданные более чем парой людей стали нинужным индусософтом? Понятно-понятно.
Видел я софт написанный 20 лет назад, goto на goto и goto погоняет. Звали меня как-то в один бодишоп проект на делфи и .net 1.1 писать. нет, там не было тысяч индусов, всего пара разработчиков. Если аргумент "ну нормальные люди так не писали", попробуйте личным примером показать. Возьмем какую-нибудь несложную софтину, может даже тестовое задание какое-нибудь, и покажете как без этих новомодных плохих технологий все круто и быстро работает.
это чуваки явно пересели с бейсика на паскаль )).
Вообще ветвления — это моветон, много ветвлений говорит о непродуманности структур данных.
Ну давайте для примера софтину.
Могу дать код, который долбит по таблице (или паре таблиц, уж не точно помню) отчёт в формате HTML объемом 2-3Гб за пару-тройку секунд на паршивеньком нотбуке. Этот же код забирает данные в таблицу из диспетчерской в текстовом формате.
Там правда была всего неделя на разработку, из которой я 5 дней пил с заказчиком самогон.
Есть и замысловатая математика, но вам это будет скорее всего неинтересно.
А потом стало нужно много кода, поклонники всяких Free-BSD орали «где безопасность?», попёрли всякие NT, ну и там уж понеслось…
Ну и в итоге за всю историю родилось всего два годных продукта — Win7 и офис 2003. Остальное восполнили 3rd-party — Adobe, Oracle, 1C… Сам же микрософт в остальном оказался печален — наклепал многоверсий ублюдочных библиотек и довольно слабо проработанную среду разработки, кто писал драйвера под форточки — поймёт.
Я знал, что доживу до времен, когда как программист стану более не нужен на рынке, не знал только, что времена эти наступят при моей еще жизни.
Вы точно программист?
Я уже было начал писать инструкцию своей тиме о новвоведении в гит…
Киньте proposal кто-нибудь что-ли.
git checkout master
git merge --ff $(git commit-tree HEAD^{tree} -m "Empty commit. Artificial merge of branch 'alpha' into 'master'" -p HEAD -p alpha)
Мы получим пустой коммит, то есть коммит, который ничего не меняет, так как его единственная цель — это просто замкнуть ветку через мердж. После этого ветку можно спокойно удалить, зная, что вся ее история сохранена.
P.S. Читаю эту статью 5 апреля, и пока не дошел до комментов, думал «что это за бред» )
Новое в Git 3: замыкания