Comments 1335
Даешь суровый олдскул!!!
не смог удержаться )
Где твои яйца?
Переходи на тёмную сторону. У нас есть печеньки!
У нас есть печеньки!
Но жрать их запрещено.
Пфф. Распространённое заблуждение. Зло не дремлет ибо хорошо высыпается. На тёмной стороне каждому положен полный соцпакет, печеньки, бесплатный спортзал, длинный отпуск с оплатой расходов и курсы по повышению квалификации. Монстрам, получившим увечья в борьбе с героями предоставляется компенсация и пожизненная пенсия. Гибкий график, возможность карьерного роста, уважение к личности и индивидуальный подход. На службе у Зла каждый найдёт занятие по душе и поддержку личных проектов.
В R&D отдел срочно требуются Middle Mad Scientist, имеющие опыт работы с магическими кристаллами и плазменным оружием, либо желающие его получить. Гибкий график, оформление по ТК. Молодой и дружный коллектив непризнанных гениев. Белоснежный халат и курсы по злобному смеху за счёт компании.
В ответ я доставал из рюкзачка бутерброд с колбасой и демонстративно поедал. Нашли чем приманивать! У Светлых со снабжением полный порядок. А тут какие-то печеньки… Cо временем я смеяться перестал. C нашей стороны всё было замечательно. Свой паёк я получал и мог на выпад Тёмных показать то рябчика, то ананас, другие деликатесы. Они предлагали печеньки. Cтранно. Нет, я сознавал, что у нас не каждый может себе позволить рябчиков с ананасами, но это только справедливо! Кто получает меньше, кто больше, но в целом все довольны, голодающих нет. И строй самый лучший, экономика процветает. А с Тёмной стороны мрак и беззаконие, и разруха, и коррупция, и военная диктатура… ужас творится! И всё-таки… у Тёмного всегда есть печеньки. Символический, но прожиточный минимум. Каждому, без исключения. Не хватает других вещей — лекарств, жилья, боеприпасов — но печеньки есть всегда. Для всех, без обмана. Это внушало уважение. И настал день, на обычный окрик «Эй, Светлый, не хочешь к нам? У нас есть печеньки!» я неожиданно для себя, но совершенно искренне ответил «хочу!» С той поры я на Тёмной стороне. Да, несладко. Да, у нас тут бывают проблемы. Зато у меня есть печеньки! Полные карманы! Светлая сволочь разбудит меня среди ночи и спросит: «Ну, и где..?» — я всегда готов их показать. Печеньки не кончатся никогда! Есть их категорически запрещено.
— Из комментариев к произведениям Давыдова Сергея
Есть и другой подвох во фразе «у нас есть печеньки»
bormor.livejournal.com/371852.html
Переходи на тёмную сторону. У нас есть печеньки!
Брауни?
…«Субкультура может отличаться от доминирующей культуры собственной системой ценностей, языком, манерой поведения, одеждой и другими аспектами[1][2]. Различают субкультуры, формирующиеся на национальной, демографической, профессиональной, географической и других основах»…
Вы путаете профессиональную деформацию и субкультуру.
Это тоже мимо. Профессиональная деформация — это изменение восприятия под воздействием специфики профессии, включая шуточки.
Ездить на хакатоны, активно общаться на сайтах вроде Хабра
И что? С каких под посещение хакатонов и активность на Хабре стали частью профессии? Это сугубо опциональные вещи, весьма слабо влияющие на уровень вашего профессионализма.
Безусловно, среди программистов есть уйма представителей самых различных субкультур, но сама профессия — это ни разу не субкультура, поскольку вы без труда найдёте 2 программистов, у которых не будет ничего общего в плане систем ценностей, языка, манеры поведения и одежды.
Это тоже мимо. Профессиональная деформация — это изменение восприятия под воздействием специфики профессии, включая шуточки.
Именно так. Я просто описал некоторые внешние проявления, которые являются следствием изменения восприятия. Обычный человек не будет писать скрипт, рассылающий поздравления. Не потому, что не умеет писать скрипты, а потому, что понимает, что автоматические поздравления получать на самом деле неприятно :) А вот программист наоборот, может подумать, что это же прикольно — сделать поздравляющего девушек бота. И сделает.
поскольку вы без труда найдёте 2 программистов
Вы даже двух панков без труда найдёте, которые слушают разную музыку, ведут себя и одеваются по-разному. Профессиональная субкультура — это не какой-то кодекс правил, который надо принимать, вступая в профсоюз, а всего лишь набор моделей поведения и ценностей, которые больше присущи людям, принадлежащим соответствующей профессии. При этом совершенно естественно, что кто-то её не разделяет, кто-то не понимает, или наоборот, к ней может примкнуть кто-то посторонний. Участие в хакатонах, например, это чётко выраженная субкультурная модель поведения для программистов, особенно молодых. Подобных сборищ, где сочетается совместное решение какой-то практической задачи и дружеской вечеринки, нет ни у какой другой профессии. Прожигать время на хабре — менее выраженная модель, но тоже куда больше распространена в кругах именно ИТшников, чем в каких-то других.
Подобных сборищ, где сочетается совместное решение какой-то практической задачи и дружеской вечеринки, нет ни у какой другой профессии.
Дааа лааадно…
Раза 3 присутствовал на «попойке» на которой чинили автомобиль, рестайлили автомобиль, восстанавливали почти с нуля.
Пару лет почти еженедельно наблюдал «решение проблем строительства» (даже «возведения») какого-либо сооружения на очередной попойке.
Да те же приёмы высоких гостей «в бане» или корпоративы (одна из разновидностей) — подобные задачи решают.
Раза 3 присутствовал на «попойке» на которой чинили автомобиль, рестайлили автомобиль, восстанавливали почти с нуля.
Это другая профессиональная субкультура, там свой колорит :)
Вы даже двух панков без труда найдёте, которые слушают разную музыку, ведут себя и одеваются по-разному.
Ну так панки давно уже на несколько субкультур разделились.
Есть на хабре несколько блогов разного рода инженерного спецназа, дык эти ребята могут с геологами по количеству экспедиций посоревноваться.
И потом айти уже во всех сферах науки.
В половине подводных научно-исследовательских экспедиций, участником которых мне довелось быть, нас сопровождали айтишники, которые писали софт к технике, с которой мы работали…
И многие из них по миру покатались достаточно и полевых у них за плечами то же хватает...
А вы думаете все геологи, биологи, и остальные географы, не вылезают из экспедиций?)
Есть те, кто поля никогда не видел, только на картинах и на даче разве, что.
Ваши стереотипы ошибочны.
Особенно в свете того, что этот пример, был приведён комментатором, касательно факта наличия и у тех и других своей субкультуры и не ставил их в один ряд по уровню "мачизма"
Офисный планктон (он же «офисное быдло», «канцелярская крыса»,«козявка приказная» и т. п.) — работники умственного труда с пониженной творческой составляющей, проводящие жизнь в офисах и прочих управлениях, но не относимые к инженерам: низшие менеджеры, бухгалтеры, секретутки, и т. д. Являют собой передаточные механизмы, винтики и смазку в механизмах управления, учета, планирования, финансов. Быстрорастущий пролетариат постиндустриального мира.
А планктон — это уже другое.
А кто научит ИИ оформлять отчёты?Переоцениваете сложность отчетов.
T+1 — программисты больше не нужны, бухгалтера обучают ИИЧасто вникали в работу бухгалтера?
Особенно продвинутого ИИ для кораблей на маршрутах не надо: достаточно уже имеющихся инструментов автоматического принятия решения и автоматизации.
Проблема с кораблями состоит принципиально в другом поле (собственно, как и для многих других областей, как бухгалтерия, что ниже обсуждают). В международном морском праве судно без человека на борту — покинутое судно, а значит его может захватить кто угодно. Этому праву уже черт знает сколько лет и нет особых перспектив, что это дело как-то урегулируют в ближайшее время (ту же бухгалтерию полностью автоматизируют куда раньше).
На любом судне крутят штурвал несколько человек посменно. Остальные там с другими задачами. Например, команда механиков всё ещё намного дешевле, чем двигатель который обслужит и починит себя сам.
У самолётов ведь нет такой проблемы — иначе падал бы каждый второй рейс.
2. А ещё их обслуживать надо. У самолётов рейсы короче и обычно в родной порт к своим механикам. А иногда они точно так же возят механиков с собой.
3. Устранение одной небольшой поломки на супертанкере на ходу оплатит зарплату механика на годы вперёд.
И как результат всего выше, авиационный двигатель намного дороже изначально и в эксплуатации.
А про лётчиков — почитайте в блоге Туту.ру, как пилотам живётся, посмотрите видео. Вполне себе комфортная работа в большинстве.
В полку офисного планктона прибыло, значит.
дык, в этом и есть суть прогресса — всё больше людей делают всё больше дел не отрывая задницы от дивана
поэтому человечество в пределе — сборище офисного планктона
А вы сами попробуйте каждые пару дней туда-сюда летать то ночью, то днём, то в 5 утра, да по гостиницам ночевать — специфическое удовольствие, даже если просто паксом.
бгг, и эти люди
Офисный планктон — современное жаргонное выражение, используемое для обозначения «белых воротничков» — мелких офисных служащих ( (с) Вики)
© Тот самый Мюнгхаузен.
Возникновение субкультуры — побочное явление любой сложной, требующей полной самоотдачи, занимающей всю жизнь человека профессии.
Ваш Капитан Очевидность.
Двуличная субкультура!!!
Любая субкультура производит культурные явления — обычаи, предметы, символы, идентифицирующие ее и при этом доступные для наиболее бедных из ее членов.
И такая вещь есть. Во-о-он тот пласт под понятиями OpenSource / Freeware. Явления, которое в равной степени существуют и затрагивают сферу каждого — и красноглазого линуксоида, и фронтендера со смузями.
С трудом можно представить условного булочника, приходящего с работы, встающего к печи и затем раздающего булки на улице. Однако же строки кода, как и строки стихов, сегодня доступны каждому.
Тут вспоминается цитата из "Ведьмака":
— Ну чего, ты хочешь меня на хер послать? Милости просим, сука, давай. Я тебя тогда тоже нахер пошлю. Ну и чего? Обнимемся, вместе пойдем, да?
Вот это — нормальная реакция здорового человека.
А жалоба на то, что кто-то с твоим мнением не согласен — ну тааакооооее...
Хабраюзеры в массе своей не хотят читать глупости.Не хотят, поэтому старательно читают, обдумывают, и после даже специально лезут на страницу профиля пользователя, чтобы сирануть в карму. Именно потому, что не хотят, ага :)
Понимаете ли, взрослый, сформировавшийся как личность человек, в отличие от инфантила, если не хочет читать глупости, он их просто… не читает (Внезапно!). А если читает — значит она ему интересна (пусть даже из энтомологического интереса), и здравая форма выражения этого интереса — изложение собственной аргументированной позиции. Конечно, если глупость совсем «за гранью добра и зла» — есть модераторы и почта для жалоб.
создать свой сайт с блекджеком
У меня идея одного блекджека давно уже носилась: если персонаж А поставил персонажу Б минус, то персонаж А комеентариев персонажа Б уже не видит, а все остальные — видят. И овцы сыты, и волки целы: персонажа А не раздражает персонаж Б, а персонажа Б не раздражает то, что у него отобрали права голоса.
почему вы считаете, что без минусования этого не случится?
Вот смотрите. Заходим в ветку любого *-срача и пишем комментарий, которые близок к нейтральному, но немного склоняется в одну из сторон (например: "по имеющимся у меня данным мне кажется, что в случае X имело место Y, потому что Z" — вполне рациональная позиция: человек описал имеющиеся у него данные и сделаные им выводы, при этом подчеркнул свою готовность изменить мнение, если будут предоставлены новые данные). При этом он тут же огребает минусов от противников этой точки зрения ("ату его, он против нас!") и… ничего от сторонников ("да ну его, он не за нас"). В результате имеем то, что имеем: карма неудержимо катится в минуса, независимо от того, чей Крым.
xkcd_про_свободу_слова.жпг
А сейчас ваш комментарий не получил плюсов, а плюс в карму прилетел. Как вам такой контраргумент?)
Я бы с удовольствием послушал оратора. Но ему накидали минусов в карму (-1), но у меня нету прав поставить ему (+1)
В итоге оратора «запинали».
Подозреваю, если человек выскажет свое «глупое, смешное и никому не интересное мнение» в ветке «не по профилю» (про БД выскажется спец по JS/C++), то в своем «профиле» — он уже тоже ничего не сможет сказать :)
Карму слили в «непрофильном» наказав за любопытсво, а в «профильном» это и так спецам понятно, зачем поошрять.
Насчет большинства и интереса: Аристотель как-то написал что у мухи 8 ног и ~2000 лет никто не удосужился это проверить до Карла Линея. Интересно, а скольким до него было сказано «У мухи 6 ног ?! Да ты, парень, идиот. Все знают что их 8!!! Слышишь, неполноценный умственно, 8! С Аристотеля!!!»
Не обижайтесь, но это очень забавно, когда про аристотелей, карлов линнеев и прочих джордано брунов пишут люди, которые ниасилили написать пост и нарастить кармическую подушку безопасности.
Я так понимаю, что по существу приведенного сценария и исторического факта сказать нечего. Разве что добавить язвительности, которая сформировала не плохой эмоциональный посыл, за который поставили +1.
Случайный социальный эксперимент :)
Я бы поддержал Ваше предложение с пояснениями по карме в чуть измененной форме: требование оставлять
Пример с мухой — он, мягко говоря, хрестоматийный. А говоря твёрдо — боян. Я его, помнится, приводил ещё на локальном общажном форуме, когда просил меня разбанить после того, как несколько раз высказал своё ценное мнение по различным вопросам. Но одмин был глух к мольбам. И, в общем-то, совершенно правильно. Хреновый из меня тогда был Карл Линней.
А это и было высказывание по существу.
Мой вопрос был прост: Как не имеющий права голоса может высказаться в поддержку того, с чьими высказываниями он согласен, но не согласно «голосующее большинство»? По вашим правилам, порог вхождения крайне высок(запретительный) :)
Если вы умный и без ваших мыслей Хабр много потеряет — накопите этих мыслей побольше и напишите пост.
У Вас не верная предпосылка. Репутация Хабра — любопытная штука, хороший механизм монетизации. Для владельцев ресурса :)
Не очень понятно, почему я должнен мои «гениальные мысли» выложить на Хабр, а не «замутить Свой Крутой Бизнес»? :)
Если не получается написать такой пост, то имеет место логическое отрицание условия из прошлого предложения.
В общем-то это и есть наглядный пример мехнизма «токсичности» :)
Не устроило большинство (или обладающего Правом), просто "-1" без пояснения и играй в угадайку :)
На мой взгляд, от того что «пример хрестоматийный» или «боян» разбрасываться его практической пользой — сомнительная практика.
Если форум созданы для обмена мнениями, это одно, если форумы созданы удовлетворить большинство — это другое :)
С точки зрения бизнеса — сценарий «большинства» предпочтителен:)
Вы почему-то считаете, будто каждое мнение априори кому-то интересно,
Априори ничего никому не интересно, ровно до того момента пока не станет касаться их лично и не начнет им угрожать.
а свобода самовыражения является основополагающей ценностью. Это невероятно далеко от правды.
Считайте это как «социальную эволюцию». Время от времени появляются новые виды (мысли). Каких-то «уродцев» выбрасывают, какие-то выживают и развиваются двигая общество вперед и защищая его.
Нету новых мыслей — застой.
Вы предлагаете убрать свободу самовыржения? Или оставить только управляемую «социальную эволюцию»?
P.S. Если что, я не хочу показаться высокомерным. Я в своё время по идеологическим соображениям гордо выпиливался с хабра, имея в активе статьи с рейтингом около 200. Я думал, это что-то будет значить. Неа, практически никто и не заметил. Система работает по принципу взаимозаменяемости винтиков. И это нормально.
Если регулярно выкашивать случайно выбранные 10% популяции, эволюция продолжит работать как ни в чём не бывало
…
Эволюция невозможна без отбора.
Все верно, за исключением проблемы масштабирования.
Если популяция ниже определеного порога, она вырождается и умирает.
Если будем выкашивать рандомно 10% в коллектие в сотни… тысячи… миллионы единиц- «эволюция» продолжится, но с меньшей скоростью.
А если такое будет в популяции в 5..20..100 единиц?
Не проявится ли «выученная беспомощность» со временем — зачем генерить повторно мысль, если ее выкосили включив в рандомные 10%? Остальным 90% тоже не сахар. Такие прецеденты тоже были в истории :)
Если популяция ниже определеного порога, она вырождается и умирает.Нет.
Есть такое понятие «бутылочное горлышко». Его прохождение часто весьма способствует эволюционным изменениям.
Если будем выкашивать рандомно 10% в коллектие в сотни… тысячи… миллионы единиц- «эволюция» продолжится, но с меньшей скоростью.Нет.
Высокая численность популяции является эффективным тормозом эволюции. Можете погуглить «кошмар Дженкина» и «дилемму Холдейна».
/оффтоп.
Есть такое понятие «бутылочное горлышко».
Вы имеете ввиду этот «Эффект бутылочного горлышка»
Цифры что я видел: Людей, если меньше 150..200 в племени, вымирает за порядка 5 поколений. Тоже падение устойчивости к внешним воздействиям.
По животным 100..1000 в течении 50..100 лет.
«кошмар Дженкина» ...«дилемму Холдейна»
Не могу ничего сказать, но материалы относятся к очень давним временам, а в свете данных последних 10 лет генетики открыты горизонтальный перенос генов, и теория о резких эволюционных скачках в следствии накопившихся небольших генетических изменений.
Но полагаю, что далее тут эту тему развивать не стоит :)
Там несколько не тот механизм. При падении численности популяции увеличивается вероятность вымирания. Бутылочное горлышко можно и не пройти. Но ни о каком детерминированном вымирании речи и близко не идет.
Про горизонтальный перенос генов я еще в детстве слышал, это очень сильно не десять лет. Теория о резких скачках… Не ловлю. Не прерывистого равновесия? Если она, то это 70-е, и несколько не о том.
Ну и да, если что, не развивать тему всегда готов :)
В конце концов, это был оффтоп.
Вы как в том анекдоте.
Грибник заблудилися в лесу и кричит "Ау! Ау!"
На шум из кустов вылезает сонный медведь.
— Мужик, чего орёшь?
— Заблудился я, надеюсь, услышит кто.
— Ну я услышал. Тебе сильно помогло?
Лично мне — нет.
Дискуссия вышла за дозволяемый хабром размер, при котором ещё можно отследить, кто на что отвечал. Перезадайте вопрос, пожалуйста, с контекстом?
Теоретически это могло быть уродство, сбой в онтогенезе. Если дать эмбриологу возможность, он вам Слейпнира вырастит, а не то что муху восьминогую. Ну может, вырастить не получится, но родит запросто.
А работодатель всегда хочет заплатить меньше. Отсюда и придумываются всякие набросы типа «корпоративная культура», «мы — семья», «мы — избранные», «айти-нация» и т.п.
вот как здесь, например
Выходит, я не программист.
Ибо под понятие «поработать меньше и получить больше» никак не попадает.
Таки да или нет?А поцчему Ви спрашиваете?
Проще если. Клиента встречает метросексуал, пишет код ему бородатый вечно пьяный хакер, а по пятницам они вместе обсуждают проекты в ближайшей рюмочной?
Или вы заставляете инженеров говорить с бизнесом? Тогда может в этом проблема?
Автор говорит о том что в рабочей обстановке в последнее время культивируется «безопасное и мягкое общение» и именно против этого тренда он и высказывается.
Разумеется, такой коллектив и его представителей следует максимально изолировать от тех, кто против их стиля общения.
Я достаточно ясно излагаю свои мысли, они не нуждаются в вашем толковании да ещё и с уничижительными эпитетами.
Вы достаточно ясно излагаете мысли для себя..:
Любые предложения люди понимают иначе, чем тот, кто их вносит.
Следствия:
Даже если ваше объяснение настолько ясно, что исключает всякое ложное толкование, всё равно найдется человек, который поймет вас неправильно.
Если вы уверены, что ваш поступок встретит всеобщее одобрение, кому-то он обязательно не понравится. — Третий закон Чизхолма
PS Я вот ваш текст не осилил — нытьё и плачь, с просьбой вернуть хамство… И откуда-то внезапно берутся розовые сопли и карамельные рельсы… Ау, вы про какой айти-то хоть? Мировое? Нет такого — есть европейское, есть американское и т.д. Нет, ситуация с линуксом, конечно не самая приятная, но на галерах, например, никаких изменений нет. В ынтырпрайзе — тоже не особо заметно (благо галеры наполовину с ним пересекаются).
Вы же сами ратуете за прямое, без обиняков выражение мнений. А как получили такое мнение о своей работе — так сразу просьба перестать?))))
Чувак, если я "ниасилил" текст, это не значит, что я его не читал. Я осилил (давясь) первые ~40% и последние два абзаца. Чтобы иметь представление о чём речь — достаточно. Если ты умудрился запихнуть в указанный мной кусок все свои "гиперболы" (на самом деле адовые перегибы в большинстве случаев) — сугубо твои, как автора, проблемы, т.к. существенно снижаются твои шансы быть понятым.
В общем я "ниасилил" твой текст, а ты "ниасилил" обычную, даже без мата, критику… за которую типа ратовал в текстовке. Никакого уважения такое поведение вызвать не может.
У вас, вероятно, серьёзные проблемы. Вы не прочитали даже половину текста, но так перевозбудились, что бросились гневно писать комментарий. Мне не особо интересно мнение такого формата.
В общем я «ниасилил» твой текст, а ты «ниасилил» обычную, даже без мата, критику… за которую типа ратовал в текстовке. Никакого уважения такое поведение вызвать не может.
А где там, извиняюсь, критика?
Практически переход на личности, выворачивание позиции человека наизнанку, явное пренебрежительное отношение к человеку, которое без проблем можно воспринять, как хамство.
Есть один кусок текста без пояснений, что тут не так и что вам не понятно.
Так же, извиняюсь, критика?
не надо его ограждать от критики. Надо говорить «Ваня, ты дибилоид, ну как так можно», в идеале еще показать ошибки и научить как правильно.
Это разные вещи, которые любители хамства не понимают. «Ты дебилоид» — это не критика, это прямое оскорбление. То, что и называется токсичностью.
«Ты накосячил, сделал так, а надо было вот так» — критика. Здесь нет оскорблений, но нет и никакого ограждения от критики.
Вообще мысль автора понятна.А мне нихрена не понятна: навалена куча каких-то предрассудков, ни грамма логики, никаких выводов. Так и хочется ответить на это:
Идите-ка вы в жопу с вашей «токсичностью»!чем-то вроде этого:
Иди-ка ты автор в жопу с своими «статьями»! Набросал две страницы ключевых слов и теперь рассказываешь в комментариях «я этого не писал», «вы мне это приписываете». Дай я открою тебе глаза: ты вообще не написал на одной умной мысли кроме того факта, что без критики и честных фидбеков мы никуда никуда не поедем. Вот тебе честный фидбек: засунь ты себе эту статью обратно вДело, на самом деле, в том, что вежливость, как заметили тут многие — это этикет или протокол взаимодействия между работниками. Быть невежливым и вызывать какие-либо втч отрицательные эмоции у других просто мешает работе. Пример с дальнобойщиком и продавщицей здесь неуместен, поскольку, во-первых любая женщина и любой мужчина предпочтёт вежливое обращение к ним вне зависимости от того, как они сами обращаются. Во-вторых, их взаимодействие длится несколько минут от силы, легче потерпеть.жопучерновики. И не связывай рабочие навыки, привычку материться и твердость гениталий. Слово "!@#" тебе, как видишь, никак не помогло.
Что касается стрессоустойчивости и «запрет на негатив» — то это просто манипуляция фактами. Админ стрессоустойчив не потому он матерится, и матерится он не потому что он стрессоустойчив. Он матерится потому что он — быдло, а на работе его держат потому что, наверное, достоинства превышают недостатки. И, наконец, если некомпетентный джун тебе пятый раз присылает говнокод на ревью, а ты не видишь никакого решения кроме как «вызвать негативные эмоции» чтобы решить проблему, то ты — некомпетентеный начальник. Когда встречаются два некомпетентных человека ни трэш-ток, ни размазывание розовых соплей не помогают, да.
И вот кроме «джун, ты !@#» тут и не скажешь ничего.Я так и написал: некомпетентный руководитель. Разве что мне здесь кто-то объяснит зачем вообще человека обзывать !@#ем и как это помогает рабочим отношениям.
Вы же говорите о ситуациях, когда джуна с первой итерацией кода посылают в !@#Где?
Лично мне проще работать в коллективах «твой отдел — твоя семья», где действительно доверительные отношения и никто ни с кем не сюсюкается.Вероятно, не у всех ваших сотрудников слово "!@#" — нормальное обращение в семье и вполне возможно, что они страдают из-за вас на работе и вполне возможно, что это отражается на их производительности. Кроме того, лично мне совершенно не нужны ваши семейные отношения на работе.
Но насаждение «этичной толерантности» чуть ли не силой это явный перебор на мой взгляд.Силой — это бьют, что ли? Заставляют отжиматься? Да, явный перебор, согласен.
Вы передергиваете.
Люди могут страдать не только от того, что кто-то материться, но и от того, что они ощущают давление в направлении рамок.
Самый банальный пример, это когда ЧР делает замечание о том как стоит и не стоит разговаривать людям, которые уже давным давно на ты.
Создать общий свод правил о том, как нужно себя вести, что-бы любой коллектив с любым составом уживался на 5 — невозможно. Вас раздражает семейность, кого-то формальность, кого-то другого что нибудь еще. И каждый может привести доводы, почему такой или иной стиль поведения продуктивней.
Единственный способ создать функционирующее общество, это не вмешиваться в дела, которые вас не касаются. Если кто-то любит материться, пусть матерится. Если вам это мешает — договоритесь. Это отлично работает в современных обществах (меритократический капитализм). Но вот люди зажили хорошо, и как много раз до этого, хотят сделать лучше. Ничем хорошим это не кончится.
Люди могут страдать не только от того, что кто-то материться, но и от того, что они ощущают давление в направлении рамок.Приватные бесседы — личное дело каждого. Если ЧР слышит приватную бесседу — то она больше не приватная. Если вы открыты к критике так, как бахвалится этим автор, то никакого давления от замечания испытывать не будете.
Самый банальный пример, это когда ЧР делает замечание о том как стоит и не стоит разговаривать людям, которые уже давным давно на ты.
Создать общий свод правил о том, как нужно себя вести, что-бы любой коллектив с любым составом уживался на 5 — невозможно. Вас раздражает семейность, кого-то формальность, кого-то другого что нибудь еще. И каждый может привести доводы, почему такой или иной стиль поведения продуктивней.Нет. Во-первых, продуктивность тут вторична. Во-вторых, пилоты используют специальный лексикон на англ языке в полете потому что о нем смогли договориться. Ваши интернеты пользуют доисторический HTTP потому что о нем смогли договориться. Названия живых организмов все на латинском потому что о нем смогли договориться. Люди по умолчанию вежливы друг с другом потому что об этом смогли договориться и свидетельство тому — несколько статей админ кодекса. Вопрос: сможете ли вы договориться на работе повсеместно использовать какой-то другой стиль кроме формального? А если новый сотрудник — то заново договариваться? На это может уйти много времени, что как-то не вяжется с продуктивностью.
Единственный способ создать функционирующее общество, это не вмешиваться в дела, которые вас не касаются.Это у вас пережиток советского воспитания: «не лезь», «не твое дело», «ты что самый умный?». Об этом можно вести отдельную дискуссию, но суть в том, что это, скорее всего, плохо и неправильно, и, ИМХО, одна из основных причин почему люди из СНГ по-прежнему хотят свалить на запад.
Если кто-то любит материться, пусть матерится.Так, где границу проведем? По какую сторону от границы будет огнестрельное оружие?
Если вам это мешает — договоритесь. Это отлично работает в современных обществах (меритократический капитализм).Хер это а не работает. Если вы заглянете в среднестатистический российский подъезд, то вы сразу поймёте, что 50 человек не могут договориться просто ни о чем. Не умеют-с.
Если ЧР слышит приватную бесседу — то она больше не приватная.
Одно дело если вас попросят говорить тише или в другом месте, другое, когда вас начнут поучать как друг друга называть.
Во-вторых...
Все что вы тут перечислили — это языки. Но существуют еще и межличностные отношения. Конечно, на работе можно ограничится лишь рабочими вопросами. Но люди есть люди все равно будут симпатия и антипатия. И это уже за рамками формального общения.
Это у вас пережиток советского воспитания
Я вырос не на пост советском пространстве, а в очень даже западном Израиле. И люди стараются не вмешиваться друг другу в отношения.
Так, где границу проведем? По какую сторону от границы будет огнестрельное оружие?
Причем тут оружие вообще? Мне от того, что кто-то с оружием ходит ни тепло ни холодно.
А граница находится между непреднамеренным и намеренным вредом. Легко придраться к мату, а вот к неуклюжести? Или к депрессии? Или к аутизму? Проявления этих вещей раздражают на порядок сильнее мата.
Хер это а не работает.
Это работает лучше чем автократия. Если есть проблема, то ей занимаются те кто замешан, а не все вокруг. А то что в РФ происходит это никак не пример.
Одно дело если вас попросят говорить тише или в другом месте, другое, когда вас начнут поучать как друг друга называть.Вот открытие: у всего есть мера.
Но люди есть люди все равно будут симпатия и антипатия. И это уже за рамками формального общения.Неформальные отношения с хорошо знакомыми людьми на работе мешают этой самой работе — инфа 100%.
Я вырос не на пост советском пространстве, а в очень даже западном Израиле.Вполне вписывается в мои представления об Израиле.
Причем тут оружие вообще?Подумайте.
Вот открытие: у всего есть мера.
И вот ее нарушают. Об этом и статья.
Неформальные отношения с хорошо знакомыми людьми на работе мешают этой самой работе — инфа 100%.
Неформальное общение это не только покурилки. Нелюбить человека можно за то как делает код ревью. Можно весь отдел похерить, с плохим менеджером, который только формально общается — инфа 100%ю
Вполне вписывается в мои представления об Израиле.
Какие?
Подумайте.
Я подумал, и все равно никакой связи не вижу.
P.S.
Мне не нравится ваш токсичный стиль общения.
Интересно, а что если после того как вы скажите джуну идика ты на @*_#, он вежливо попросил тебя выйти на улицу уточнить лично с ним ваши претензии. Возможно ваш пыл сразу поубаватся. Нельзя давать себя оскорблять, нужно это мгновенно пресекать любым способом, иначе у человека это войдёт в норму. Как тут писали — вежливость и порядочность на работе — это протокол общения
Вы намекаете на силовое наказание обидчика. Успешное наказание легко попадает под статью УК, с учетом того, что в травматологии пострадавшего будут едва ли не пытать: «итак, я вам предлагал признаться в том, что вас побили, и вы согласились? Нет? То есть вы решили скрыть факт того, что вас побили? И кто именно вас не побил?..».
А дальше как я со стороны программиста вижу влияние этого на дальнейшую карьеру: коллеги запомнят обе стороны конфликта как «чуваков, которые подрались в офисе». Именно так, без лишних деталей. Когда через 5 лет у них рекрутер спросит «знаешь ли ты Персону1» именно этот прецедент и всплывет в памяти, с погрешностью на испорченный телефон и забытые со временем детали.
С точки зрения менеджера обе стороны конфликта рассматриваются как потенциальный источник проблем. На их отношения между собой менеджеру пофиг, не пофиг на проект и коллектив в целом. А это как минимум риск спонтанных увольнений день-в-день на эмоциях.
С точки зрения кадровика (и всех помошниц, 90% из которых станут кадровиками других компаний через 5 лет) на корпоративе после выпивки это будут 2 обезьяны с гранатой, а сам случай — опасный прецедент, другие могут взять на вооружение.
С точки зрения топ-менеджмента это как минимум неприятная мелочь, а как максимум: потери репутации.
Плюс один — пацаны на районе уважают.
Быть невежливым и вызывать какие-либо втч отрицательные эмоции у других просто мешает работе.
Можно подумать, что быть *вежливым* и «вызывать какие-либо втч отрицательные эмоции у других» — работе не мешает. *Эмоции* — как бы, вообще не та вещь, которая — безусловно — уместна «на работе».
И, наконец, если некомпетентный джун тебе пятый раз присылает говнокод на ревью, а ты не видишь никакого решения кроме как «вызвать негативные эмоции» чтобы решить проблему, то ты — некомпетентеный начальник.
Даже опуская вариант, когда «вызвать негативные эмоции» — это и есть «решить проблему», ваше обобщение с «некомпетентностью»… это такое. Сказать, что «говнокод» — это «говнокод», если и является «некомпетентностью», то несколько в другой области :-)
Но фичи ломают архитектуру и вообще не вписываются, зато ОЧЕНЬ нужны.
В воздухе плавает запах дедлайна, свежих багов и пара топоров, которые не падают из-за густого мата, что не нравится нежным девочкам-тестировщицам и вызывает негативные эмоции.
Внимание, вопрос: и что делать в таком случае?
Что делать: действовать по принципу "вернуть проблемы тем, кто их породил, на устранение". Для этого провести анализ корневых причин, т.е. собрать фактологию, проявляющую возникновение ситуации. Где-то на верху будут две связанные причины: нарушили технологию разработки, чтобы "отжать" разработчиков (или аутсорсера). А для этого никак не решают вопрос соответствия нагрузки (объёма задач) производительности.
Т.е. проблема возникла намного раньше и выше: на уровне лиц, принявших ошибочные решение. Реакция разработчиков – тщетная попытка сигнализирования и защиты от бессмыленных и вредных перегрузок на уровне психики (т.е. мат и прочие реакции). В целом, это поломанный процесс разработки, где съумничал кто-то из лиц, принявших ошибочное решение и такие условия.
Вернуть им проблему – заставить исправить ошибки в решении, т.е. принудить к выполнению технологии разработки и обеспечению покрытия объёма задач производительностью с запасом 10-15%. И это как раз то место и направление, куда необходимо направлять все реакции в созданной подставе.
Отжимают тех, кто отжимается. Грузят лошадь, которая везёт. Увы, но степень упырства многих "на верху" переходит все вообразимые пределы. И отдела разработки с лихвой хватит, чтобы пару-тройку человек реально испугать (в т.ч. превосходящей физической силой) и заставить правильно учесть и обработать названные выше причины. Не просто так ЛПР закрываются в своей коморке, чтобы "порешать вопросы" скрытно от тех, кому потом прилетит головняк. И да, это всегда вопрос власти и её баланса. Пока его нет, будут отжимать, а значит будут "бухтеть недовольством под нос на весь ёпн-спейс".
Кто Вам сказал что людей хантят печеньками? Что у Вас вообще в голове творится?
Это что у Вас в голове творится? Где в статье про то, что хантят печеньками? Автор написал о том, что в вакансиях очень часто есть упоминание про печеньки. Я тоже это постоянно вижу и меня тоже это выводит из равновесия. При этом никто не говорит, что печеньки не нужны, с ними лучше чем без них. Но, блин, есть много вещей важнее этого. Кресло удобное, например. Или не адовый опенспейс на 100 человек, а маленькие кабинеты и т.д.
и зимой тепло
А давайте. Не приходилось в офисе сидеть в пуховике?
Ох, очень хотелось бы видеть в вакансиях фразы типа "у нас в офисе нормальная приточная вентиляция и уровень ppm" и "у нас не приняты громкие дебаты и оффтоп в опенспейсе". Вот реально, дал бы скидку 10-20% зарплаты за эти два пункта.
Автор написал о том, что в вакансиях очень часто есть упоминание про печеньки. Я тоже это постоянно вижу и меня тоже это выводит из равновесия.
Так вот для кого safe spaces придумали! :)
1.
Почему-то активно продвигается мнение, что нельзя критиковать людей, нельзя вообще высказвать им негативную оценку.
Не соответствует правде. Критика постоянно высказывается, особенно в пулл-реквестах, после работы QA, и пользователями. Я бы сказал большая часть работы программиста — это работа с конструктивной критикой
2.
Человек может раз за разом отправлять вам на ревью код с одними и теми же ошибками и надо отвечать на это вежливостью и улыбкой?
Вежливостью — да, улыбкой — нет. А потом просто вежливо попросить написать по собственному. Проявлять агрессию и выходить на конфликт — себе дороже.
3.
Как вам такой расклад — получить отрицательный фидбэк от коллег без явных причин? И нет, вы не выясните подробностей, вы просто раз за разом не будете получать повышение не зная почему.
Конечно же без явных причин! Токсичность и отсутствие компетенций тут не причем, да :)
4.
С годом опыта можно быть специалистом высшего уровня в профессии.
А когда, например, ява программист с 10 летним опытом, 5 из которых на управленческих позициях, начинает писать на PHP. Считаете, у за год не сможет до сеньора дойти? Ну считайте, ваше право :)
5.
Неожиданный факт — программисты не хотят работать без печенек.
Неожиданный факт — там, где печеньки и кофеек, работается почему-то лучше. при прочих равных я бы выбрал с печеньками.
6.
Через три месяца разговор с HR, в результате которого выясняется, что команда его ненавидит.
Ненависть коллектива сложно игнорировать, хочу я вам сказать. Видимо эта ненависть только по словам HR, а в реальности проблемы иного рода.
После прочтения данного произведения хотелось бы посоветовать автору перестать мыслить чрезмерно категоричными понятиями (ненависть, двуличие, подковерные интриги), и начать прислушиваться не только к своему мнению, но и к мнению окружающих, а так же хорошо выполнять свою работу, и тогда за токсичность никто уже увольнять не будет :)
Тут такое дело, нельзя всех причесать под одну гребёнку. А статью стоит рассматривать с юмором а не как крик души отчаявшегося грубияна.
В нетоксичных рабочих средах ваш тезис не соответствует правде. В них в пулл-реквестах, баг-репортах и т. п. критикуется не человек, а результат его работы: код, иное техническое решение и т. д. В нетоксичных рабочих средах большая часть работы программиста — это работа с конструктивной критикой его кода, его технических решений, а также с конструктивной критикой его поведения, его действий или бездействия, влияющих на производственные процессы.
В нетоксичных рабочих средах недопустима даже конструктивная критика личности человека, даже по его явной просьбе. Результаты работы, поведение в рабочих процессах — да, если конструктивно, то можно критиковать. Личность, поведение вне рабочих процессов — нет, даже конструктивно, по крайней мере в рамках работы — могут быть нюансы если общение не ограничивается рабочими процессами, но тут всё индивидуально.
недопустима даже конструктивная критика личности человека
Личность и психология — это не код писать. То, что вы считаете личностной проблемой может быть частью характера, позволяющей человеку раскрыться в иных направлениях деятельности. Не вам судить, что в личности человека хорошо, а что плохо, ему не пять лет, и лишением сладкого плохое поведение не исправить.
Критикуйте то, в чем у вас есть набор компетенций. Если вы программист — профессионально критикуйте код, а для профессиональной критики личности есть психологи и психотерапевты, и их этому минимум 10 лет учат.
И это элементарное уважение к человеку как к личности, «нетоксичность» тут вообще не при чем.
Критика постоянно высказывается, особенно в пулл-реквестах, после работы QA, и пользователями.
Более того, вся работа программера — это одна сплошная критика и негатив. Начиная от того, что код не работает или работает не так как надо, исправление чужих ошибок, изменения требований в процессе разработки, ответственность… При успешном запуске проекта награждают начальника, а программисту достанутся только issues от пользователей, которые нужно срочно закорректировать. Плюс все эти дебильные метрики, методологии, спринты, покрытия и вместе с ними куча дармоедов на шее, которые указывают как тебе нужно работать.
Вежливостью — да, улыбкой — нет. А потом просто вежливо попросить написать по собственному.
А если это не в вашей компетенции? Причем ответственный за проект ты, но задачи раздает и принимает начальник по принципу "работает — и ладно". Если человек коммитит код на Java в 201x году, где коллекции итерируются: for (int i = 0; i < list.size(); i++) list.get(i). А на просьбу переписать как надо жалуется начальнику, что я придираюсь. И кто тут разводит токсичность?
Ненависть коллектива сложно игнорировать, хочу я вам сказать.
Как показывает практика, ненависть и шум в основном разводят хреновые специалисты, как попытку оправдаться. И она всегда направлена против тех, кто в проекте что-то делает ввиде жалоб типа: "он придирается к моей работе", "он не объясняет мне как делать", "он не делится информацией", "он меня ничему не учит". HR, апелируя к жалобам, в итоге в токсичном поведении винят совсем других людей. Поэтому автор здесь прав — IT не детский сад, а спецы не няньки. Если человек некомпетентен, он баласт в проекте и будет только ухудшать климат и портить проект.
Причем ответственный за проект ты, но задачи раздает и принимает начальник по принципу «работает — и ладно»
Если начальник раздает и принимает таски, то ответственный не вы, а начальник. В данной ситуации я обычно огораживаюсь от человека, который делает дичь. И не только я, прошу заметить. В результате с человеком никто не хочет работать, через месяц составляется отчет, и по результату безделия человека просят уйти. Именно про такую «ненависть» я говорю.
Про личностей, которых вы упомянули, а именно
ненависть и шум в основном разводят хреновые специалисты, как попытку оправдаться— тоже регулируются подобным образом. Со скандалистами соглашаются работать такие же скандалисты, а результат такой команды редко выходит хороший. Ну и дальше по накатанной — пустой отчет — по собственному или по статье :)
Ответственный тот, кто согласился быть ответственным.
Это идеальный козел отпущения. Можно делать любую дичь, все равно вину свалят на того, кто согласился. Ответственности без полномочий не бывает, иначе это просто создание мальчика для битья
В данной ситуации я обычно огораживаюсь от человека, который делает дичь.
Отгородиться не удастся, ибо код и проект общий. А таск разбираться с любой проблемой на продакшне поставят тебе, ибо "ты есть лид" и ответственный. Вот и ловишь потом ликинги ресурсов и памяти в коде, к которому ты не имеешь никакого отношения и разбираешься с проблемой падений или проседания перформанса. А по завершении говорят "спасибо" и закрывают таск без всякого разбора полетов (а зачем, все ведь заработало, проблема решена, какая разница кто виноват — мы же все в одной команде?!).
Со скандалистами соглашаются работать такие же скандалисты, а результат такой команды редко выходит хороший.
Скандалисты как правило очень хорошо устраиваются в команде. Не успеешь моргнуть, как они уже начинают тобой командовать, становясь ненужным звеном между начальником и тобой.
ты есть лид
Да, лид, а не прослойка между ПМ и программистами. Если кто-то хочет в обход процесса ревью кода выложиться в продакшен, то может смело брать на себя ответственность за проблемы с этим кодом. Данный момент надо обозначить, желательно в письменной форме (емейлом), что снимает с вас много проблем в будущем.
Не успеешь моргнуть, как они уже начинают тобой командовать
Пусть командуют сколько хотят. А управляет тот, кто принимает последнее решение. Всегда можно организовать митинг с неким третьим заинтересованным в решении лицом и конструктивно обсудить возникшую проблему, а решение уже пусть принимает этот третий, главное, чтобы у него были на то полномочия.
А по завершении говорят «спасибо» и закрывают таск без всякого разбора полетов
От того что вы поблеймите своего подчиненного, кому от этого станет лучше? Может лучше действительно просто закрыть таск, предварительно спокойно его обсудив?
какая разница кто виноват
А действительно, кто виноват? Разработчик, написавший гавно, тимлид, пропустивший это в продакшен, тестировщик не увидевший это на тестах, или, может, ПМ, эту задачу поставивший и обозначив недостаточный срок реализации? Кто из них виноват? Или может все вместе накосячили, одной командой?
for (int i = 0; i < list.size(); i++) list.get(i)
Вот кстати для такого случая обычно заводят техдоки со всякими гайдлайнами и кодстайлами. Заодно людям которые так пишут поясняется почему это плохо и что он тут как бы не очень один и после него потоп не ожидается.
Если человек коммитит код на Java в 201x году, где коллекции итерируются: for (int i = 0; i < list.size(); i++) list.get(i)
А что в этом плохого-то? То, что метод size() вызывается каждый раз, и это ухудшает производительность? А разве JVM то не оптимизирует в рантайме?
Насчёт линейного времени — зависит от того, что за коллекция. Там может быть ArrayList или Vector, и там время доступа будет константное (но мы можем не знать, что у нас там на самом деле, т.к. интерфейс единый). При маленьких объёмах данных — это вообще, имхо, не суть важно.
Если очень хочется подстраховаться с этим моментом — правильнее использовать итератор. Но мне такой подход нравится меньше: нужно больше строк, делать дополнительные импорты, и там ещё есть некоторые нюансы в зависимости от типа коллекции (могу ошибаться, редко их использую в своих проектах).
P.S. Самое главное — я не понимаю, почему для вас стандартный заголовок цикла for(), который, кстати, одинаков вообще для любого C-подобного языка — это «отвлекаться на индексы». Такое вообще пишется (или вставляется по хоткею) на уровне автоматизма… Вот производительность кода — это да, серьёзно.
А вам не кажется, что у вашего варианта читаемость сильно ниже при беглом просмотре кода? Или это у меня только такое, субъективное?
Я, конечно, не s-kozlov, но нет, не кажется. Оно, как раз-таки сильно проще и приятнее. Меньше лишнего кода, меньше возможностей для выстрела себе же в голову.
P.S. Самое главное — я не понимаю, почему для вас стандартный заголовок цикла for(), который, кстати, одинаков вообще для любого C-подобного языка — это «отвлекаться на индексы».
Если человек не совсем дуб, то при итерации он в самом начале выделит элемент коллекции в переменную, аля var test = testList.get(i); В таком случае встреча индекса и использование коллекции в дальнейшем коде будет означать что-то специфическое. И, в целом, отвлечения на индексы особо не будет(но тут возникает вопрос — зачем? Зачем вручную прописывать создание переменной и использовать for(;;) конструкцию, когда есть более лаконичный foreach?)
А если человек дуб, то он просто везде будет использовать testList.get(i), что увеличит объём кода, уменьшит его читаемость и увеличит шансы случайно пропустить выстрел или логическую ошибку в виде testList.get(j) или testList.get(i-j)
Как по-мне, итерацию через индексы лучше делать только в том случае, если есть необходимость оперировать этими индексами. Не вижу смысла пихать такую итерацию куда попало, когда в языке есть куда более подходящие конструкции.
Зачем вручную прописывать создание переменной и использовать for(;;) конструкцию, когда есть более лаконичный foreach?)
Чтобы не создавать итераторы.
В случае с тем же Vector всё будет линейно.
У меня маленькое замечание не относящееся к делу прямо. Класс Vector остался в джаве только потому, что нельзя ломать спецификацию. Он — тяжёлое наследие прошлого. Использовать его нельзя.
Что касается ArrayList — он как бы есть, но он ничем не лучше. К тому же, он не является потокобезопасным.
Что за глупости? Только его обычно и используют, когда нужен динамический массив с изменяемой длиной.
Это не глупости, это суровая реальность. Если пишешь на Java и нужен динамический массив — нужно использовать ArrayList.
Что касается ArrayList — он как бы есть, но он ничем не лучше. К тому же, он не является потокобезопасным.
Проблема как раз в том, что Vector потокобезопасен. Поэтому вызов его методов приводит к синхронизации потоков, что существенно замедляет работу программы. И поэтому, если потокобезопасность на данный момент не нужна, а она не нужна в большинстве случаев — нужно использовать ArrayList.
Если нужна потокобезопасность Vector тоже плохой выбор. Нужно использовать либо обёртки, которые делают любую коллекцию потокобезопасной, такие как Collections.synchronizedList, либо использовать специализированные коллеции, такие как CopyOnWriteArrayList.
приводит к синхронизации потоков
В том-то и дело, что обычный код, как правило (могу ошибаться, поправьте) исполняется всегда в один поток (кроме обработки GUI). А раз так — ему пофиг, что использовать. Если же приложение многопоточное — всё равно нужна синхронизация будет, скорее всего.
Если нужна потокобезопасность Vector тоже плохой выбор. Нужно использовать либо обёртки, которые делают любую коллекцию потокобезопасной, такие как Collections.synchronizedList, либо использовать специализированные коллеции, такие как CopyOnWriteArrayList
А чем они лучше Vector?
В том-то и дело, что обычный код, как правило (могу ошибаться, поправьте) исполняется всегда в один поток (кроме обработки GUI). А раз так — ему пофиг, что использовать.
Даже если код выполняется в один поток — вся машинерия, которая синхронизирует потоки всё равно отрабатывает честно и честно жрёт время процессора. Поэтому нет, не пофиг. ArrayList эту машинерию не задействует вообще, поэтому он быстрее. Разработчики JDK рекомендуют использовать ArrayList там, где потокобезопасность не нужна. Так и написано — If a thread-safe implementation is not needed, it is recommended to use ArrayList in place of Vector.
А чем они лучше Vector?
Обёртки делают практически то же самое, что Vector. CopyOnWriteArrayList обеспечивает потокобезопасность тем, что делает новую копию внутреннего массива при каждом изменении. Его надо использовать если коллекцию в основном читают и иногда в неё что-то пишут.
Вариант Vector:
1 поток на запись, 20 потоков на чтение — стопаем всех при каждом обращении к вектору,
Вариант CopyOnWriteArrayList:
1 поток на запись, 20 потоков на чтение: да потоки на чтение могут получить устаревшую информацию, но они всегда могут прочитать из массива без остановки, блокируют ли друг друга потоки на запись — не помню, надо смотреть спеку.
В общем для ситуации "в основном читаем, изредка пишем" идеальная коллекция.
И да, в промышленной разработке про вектор, к счастью, уже забыли.
Если хотите подробности про мягкие блокировки и какие они плюсы дают — поищите по вкладу Doug Lea в java — он как раз их и разработал для java.
Смотрите, foreach подразумевает то, что о типе итерируемой сущности позаботится рантайм (или компилятор). В случае с JavaScript (я в основном пишу на нём), использование for… in, перебирающего все ключи объекта либо индексы массива — реально очень плохая идея, если у нас обычный массив. for всегда будет быстрее. JS правда, в отличие от Java, не компилируется в байт-код в общем случае (точнее, компилируется в него прямо перед исполнением, и время этой компиляции нам тоже важно).
Ох, юноша, ну куда же вы со своим js в обсуждение java? Ведь надо понимать, что и структуры и алгоритмы под капотом синтаксического сахара сильно разные. В Java foreach это скрытый вызов итератор и обход по нему. И не надо думать, что если в js есть слово java, то они хоть чем-то похожи.
Кстати, на минутку — есть какой-то аргумент, чем итератор лучше цикла for? Тем, что он сохраняет стейт коллекции в момент начала обхода? Так он ничего не сохраняет, там при попытке изменения коллекции исключение выкинет…
Итератор не сохраняет состояние, он отказывается работать с изменённой коллекцией. Если мы начали итерироваться по коллекции, а она изменилась — мы вполне может до багов дописаться. Как открытых (исключения при попытке доступа к отрицательным или выходящим за рамки индексам), так и скрытых — когда алгоритм ничего не заметил, но отработал с устаревшими данными, например.
Полная глупость. Вы сами это хотя бы понимаете? Оптимизация никогда не бывает преждевременной. Она либо окажется полезной (если приложение и объём данных будут расти), либо просто никак не скажется на качестве работы. Но ухудшить ситуацию — она не может. Если не брать случаи серьёзного говнякания архитектуры ради производительности, как Вы верно заметили.
Початайте Кнута, дельные вещи мужик написал. Ещё можете почитать/посмотреть доклады про оптимизации Шипилёва — очень доходчиво рассказывает про трудозатраты vs результаты оптимизаций. Не помню только, говорил ли он, что новичкам в языке лучше вообще не связываться с оптимизацией… Там ведь надо уже понимать как jvm твой код обработает и во что превратит…
В общем случае лучше писать правильный/красивый код, а оптимизации оставить на горячие участки, которые реально нужно ускорять.
Кстати, забыл добавить: выше комментаторы указывали, что создание итератора — это лишние накладные расходы, и в некоторых случаях они могут быть существенными. Тогда зачем использовать foreach вместо for (то, что это сахар — уже замедлит компиляцию в байт-код как минимум на копейки, плюс само наличие итератора, которое может быть нежелательным)? Не говорите только опять про опечатки в буквах, такие ошибки — это даже не уровень школы, серьёзный программист никогда их не допустит (да и IDE не даст).
Нет, создание итератора — не очень дорогая операция и если не жарить её миллионы раз на одной коллекции худо от них не будет точно. Время компиляции в java так же в большинстве случаев пренебрежимо мало и происходит один раз — при сборке пакетов (ну разработчик пару наносекунд подождёт, чего уж там, ага?). Худшее что я видел — пара минут на дофига кода. Гораздо хуже какой-нибудь gwt, который из 1-2к строк будет минуты 3 комплиться. Для кого долго — пусть покомпилят программы на c/c++.
Про опечатки — это хлеб стат. анализаторов и это первое чему они учатся. Да сейчас их встраивают в IDE, но онлайновые всё же далеки от совершенства. И да, даже с ними можно пролететь с опечаткой. Почитайте тематические статьи, если интересно. Но на исходниках > 10к "рассмотреть всё глазками" не работает почти никогда.
С последним утверждением — полностью согласен. Проблема в том, что цикл for — это не «фишка» только JavaScript. Такие циклы можно встретить и в программах на C, C++, ActionScript и PHP, как минимум. То есть это общепринятая конструкция. Да, в Java могут быть лучшие способы итерирования, и не только в Java. Но писать код, понятный программисту на любом языке — имхо, не есть минус…
Нет, писать на языке х надо как на языке х а не как на очень-на-него-похожем-но-с-совсем-другими-стандартами-у. Просто поймите, есть стандарты кодирования. Для каждого языка. И их надо придерживаться — они помогают писать меньше багов и выявлять их раньше.
PS простите за комментари n-in-1, минусы отрицательной кармы при недостатке писательских навыков :-)
В общем для ситуации «в основном читаем, изредка пишем» идеальная коллекция.
Согласен. А если у меня вообще поток всего один, и никто никого не блокирует? Можно ещё раз на пальцах, чем Vector медленнее ArrayList в случае одного потока?
И не надо думать, что если в js есть слово java, то они хоть чем-то похожи.
Я так и не думал, вы что.
В Java foreach это скрытый вызов итератор и обход по нему.
Окей, я про это выше уже читал. Создание итератора — в самом деле лишние накладные расходы, которых можно избежать. Зачем нам итератор? От него выигрыш только в случае использования LinkedList. Но если мы решим его использовать, то и несколько циклов в этот момент можно будет переписать, которые с ним работают. В чём проблема-то?
Итератор не сохраняет состояние, он отказывается работать с изменённой коллекцией.
И что тут хорошего? Ошибка в консоль, вылет из метода по не пойманному исключению, программа у пользователя «упала». Может лучше всё-таки отработать с чуть устаревшими данными? А ещё лучше — ещё на этапе написания кода подумать о том, что будет, если коллекцию кто-то попытается изменить. И вот здесь как раз пригодится CopyOnWriteArrayList, о котором Вы выше упоминали. Или можно самому вручную создать копию коллекции, и обходить уже её (в противном случае мы вылетим с ошибкой, если у нас итератор!).
Не помню только, говорил ли он, что новичкам в языке лучше вообще не связываться с оптимизацией… Там ведь надо уже понимать как jvm твой код обработает и во что превратит…
Соглашусь :) Именно поэтому я особо и не заморачиваюсь с быстродействием своего Java кода. Ну хотя наверное я начну это делать, только когда всё очень сильно начнёт тормозить…
В общем случае лучше писать правильный/красивый код, а оптимизации оставить на горячие участки, которые реально нужно ускорять.
Так никто и не спорит! Там же выше шла дискуссия о том, нужно ли использовать итератор, если он даёт оверхед. Моё мнение — если можно на этом сэкономить, то не стоит: обход по индексам, в случае, если соблюдены все меры предосторожности, даст тот же эффект в случае не списка.
ну разработчик пару наносекунд подождёт, чего уж там, ага?
Да Вы оптимист! У меня не самый большой курсовой проект комплилися на среднем железе (окей, на довольно слабом железе для тех лет) секунд 7-8. Это простой проект. А если что-то тяжёлое? Тут и 1-2 секунды можно лишних получить, особенно если плохой HDD вместо SSD.
Для кого долго — пусть покомпилят программы на c/c++.
Я в курсе про время компиляции программ на C++. Вы правда считаете, что это хорошо? Я вот не понимаю, как люди вообще так живут и работают (в случае, если у них нет супербыстрого корпоративного билд-сервера, а обычный ноут).
Про опечатки — это хлеб стат. анализаторов и это первое чему они учатся. Да сейчас их встраивают в IDE, но онлайновые всё же далеки от совершенства.
Онлайновые — это какие? Там имели в виду случай, когда в заголовке или теле цикла перепутана буква итератора. Как минимум любая IDE подчеркнёт ошибку, если мы напишем j вместо i, а такой переменной у нас нет. Да, бывают случаи вложенных циклов, бывает, когда переменная j есть внутри тела цикла, и мы опечатались в каком-то индексе. Ну а отладка на что? Точки останова? Юнит-тесты, в конце концов? Обычное тестирование «руками» на нескольких наборах данных? Такая ошибка обычно всплывает на первом же прогоне!
Но на исходниках > 10к «рассмотреть всё глазками» не работает почти никогда.
Вы что, за раз добавляете и коммитите 10k строк? Нет, вы обычно добавляете строк 100-200, ну в крайнем случае 500. А длина одной функции вообще в идеале должна быть строк 40-50, не больше. И циклов там — ну максимум 2-3. К чему тут обсуждать общий размер кодовой базы проекта вообще?
Просто поймите, есть стандарты кодирования. Для каждого языка.
Опять Вы про что-то не то говорите. Стандарт кодирования — это скорее про правила оформления кода. Например, то, что в C# открывающая фигурная скобка класса переносится на новую строку, в отличие от Java. Это да, тут я не спорю, лучше делать так, как рекомендует разработчик языка (хотя даже это можно перенастроить в IDE под себя и делать по-своему — если работаешь не в команде, либо если ты возглавляешь команду и сам определяешь правила оформления кода). Но цикл for-то тут причём? Это вполне себе легитимная конструкция языка Java! Это не какой-нибудь goto, который кое-где ещё есть, но использовать его не советуют. Никто его использовать не запрещает, более того, он для этого изначально и был предназначен — для обхода массивов в том числе. Да, в Java он пришёл скорее всего как наследие из C/C++, но я не видел ещё ни одной статьи, которая утверждала бы, что «for в Java — это зло, по возможности никогда его не используйте».
PS простите за комментари n-in-1
Да нет проблем. Хотя отвечать и правда чуть проще было бы в случае нескольких комментариев поменьше. Но проблему вложенности это не решит, да и объём текста для ответа тоже не уменьшит, так что невелика беда :)
А если у меня вообще поток всего один, и никто никого не блокирует? Можно ещё раз на пальцах, чем Vector медленнее ArrayList в случае одного потока?
Случай с одним потоком это как раз тот случай, когда Vector всегда медленнее. Потому, что любой метод у Vector работает дольше, чем у ArrayList за счёт того, что на каждом методе Vector осуществляется синхронизация. Когда поток один, синхронизация не нужна, но время на неё всё равно уходит.
Это да. Но насколько эта синхронизация замедляет работу?
На столько, что из-за этого замедления разработчики JDK и добавили ArrayList
Если же вы пишете программы себе в ящик, которые никто, кроме вас и видеть не будет — вы вольны использовать, что пожелаете, но убеждать и спорить с людьми по поводу этого вам не стоит, выставляете себя лишь в плохом свете.
Если вы пишете программы, которые будут читать другие разработчики на этом языке, то использовать Vector — дурной тонЭто с чего вдруг?.. Там интерфейс абсолютно такой же. Разница только в производительности — но каким боком связаны производительность выполнения и процесс чтения кода?
Это с чего вдруг?..
Вам уже десяток людей сказала — потому что для обычных коллекций в большинстве случаев принято использовать ArrayList.
Почему? Потому что Vector медленнее и в большинстве случаев синхронизация излишняя.
Бенчмарки гуглятся за полторы минуты, будь у вас такое желание.
stackoverflow.com/questions/17471913/java-vector-vs-arraylist-performance-test
www.baeldung.com/java-arraylist-vs-vector
И суммарно, если вы будете использовать Vector, то вы будете этим показывать свой низкий уровень владения языком, поскольку в 95% случаев это будет не оправданным решением, а лишь потому что вы так привыкли и вам так удобнее.
И, помнится, вы так ратовали за то, что использование foreach накладывает оверхед и лучше обходиться простым for с индексацией. Раз вы так боретесь за оверхед, то почему же используете Vector, который его вносит? Не находите противоречие?
И суммарно, если вы будете использовать Vector, то вы будете этим показывать свой низкий уровень владения языком, поскольку в 95% случаев это будет не оправданным решением
Может и так. Я просто не понимаю вот этого вот «дурной тон», как-то очень категорично прозвучало. такое ощущение, что у вас прямо кровь из глаз льётся каждый раз, когда Вы слово «Vector» видите в коде. Несерьёзно как-то :)
Я просто не понимаю вот этого вот «дурной тон», как-то очень категорично прозвучало. такое ощущение, что у вас прямо кровь из глаз льётся каждый раз, когда Вы слово «Vector» видите в коде.
Когда вы, в 2019 году будете писать стандартами 2000 года — это дурной тон. Крови из глаз не будет, однако наладить коммуникацию с коллегами вам будет куда сложнее.
Банально, видя ваши постоянные for и vector — на ревью к вам постоянно будут подходить и, скажем так, вбивать в голову — что так писать нельзя. Есть более подходящие инструменты.
Про veсtor и arrayList прекрасно написано тут, stackoverflow.com/questions/1386275/why-is-java-vector-and-stack-class-considered-obsolete-or-deprecated
Эта ссылка была в бенчмарке, который я кидал выше.
Несерьёзно как-то :)
И, если вы не измените своё мнение и стиль разработки после таких ревью, то коллеги просто не захотят с вами работать. Вы будете причиной негативной атмосферы в коллективе, которая ведёт к негативным последствиям для разработки продукта.
Если для вас это несерьёзно, то… что ж, ваш выбор.
Я просто не понимаю вот этого вот «дурной тон», как-то очень категорично прозвучало.
Ну а как ещё может реагировать человек, когда вы используете класс у которого нет преимуществ, а есть сплошные недостатки? Вы хотите его использовать потому, что вам название больше нравится? Вот это уже чутка странно.
такое ощущение, что у вас прямо кровь из глаз льётся каждый раз, когда Вы слово «Vector» видите в коде.
Ну в общем да, ощущение верное. Как только видишь Vector в коде, сразу становится понятно, что там помимо вектора можно запросто встретить вообще всё, что угодно. Например, я встречал вместе с вектором ConcurrentHashMap в однопоточной программе. Код, где есть вектор явно надо вычитывать в поисках проблем, которых в коде человека, знакомого с джавой, просто не может быть. Чаще всего встречается заблуждение, что если используешь Vector, то с синхронизацией можно вообще не заморачиваться, он всё сделает. Поэтому да, "кровь из глаз". На ревью, кстати, код с Vector не пропустят. Поэтому писать такой код бессмысленно.
Вы хотите его использовать потому, что вам название больше нравится? Вот это уже чутка странно.
Когда использовал его в первый раз — просто принципиально хотелось выпендриться и сделать не так, как в листингах, которые нам раздали. То есть попробовать что-то своё. Попробовал — получилось, интерфейс-то идентичный. Я там ещё и Hashtable вместо HashMap в одном месте заюзать умудрился. Один раз правда всего)
Чаще всего встречается заблуждение, что если используешь Vector, то с синхронизацией можно вообще не заморачиваться, он всё сделает.
Не всё. Нам в универе рассказывали, в чём нюанс, и в учебнике по Java было это написано. И я это помню прекрасно. Синхронизированы только отдельные операции, общую синхронизацию нужно обеспечивать самостоятельно.
На ревью, кстати, код с Vector не пропустят.
Почему? Производительность? Так не всегда она является узким место. Я вот смотрел сейчас бенчмарк, между прочим, там разница конечно в два раза, но пока это 7ms и 14ms, с этим жить можно.
Когда использовал его в первый раз — просто принципиально хотелось выпендриться и сделать не так, как в листингах, которые нам раздали
Понятное желание. Теперь, когда выяснилось, что так делать нельзя, не делайте так. Не нужно держаться за свои решения только потому, что они ваши, нужно порадоваться, что вы теперь знаете больше и будете делать по другому.
Почему [Vector не пропустят на ревью]? Производительность? Так не всегда она является узким местом
Возможно когда-то такое не пропускали из-за производительности. Сейчас не пропустят по тем же причинам, по которым не пропускают плохо отформатированный код. Видим Vector — отправляем реквест на доработку.
Возможно когда-то такое не пропускали из-за производительности.
Ещё раз — нам никто из преподов категорически не запрещал использовать векторы (хотя упоминали, что у них довольно плохо с производительностью). Это был 2010-ый год. Java SE 6, на минутку :)
по которым не пропускают плохо отформатированный код
А не проще его доформатировать и принять? Тем более, сейчас есть всякие линтеры и средства бьютификации.
Ещё раз — нам никто из преподов категорически не запрещал использовать векторы
В IT с хорошими преподавателями серьёзная проблема. Те, кто разбирается в предмете редко занимаются преподавательской деятельностью, увы ((.
А не проще его доформатировать и принять?
Ну да, поэтому пул реквест отклоняют с просьбой переформатировать код. Форматирование кода — забота того, кто делает пул-реквест. То же самое с векторами. Пул реквест отклоняется с просьбой заменить вектор на что-то подходящее.
Те, кто разбирается в предмете редко занимаются преподавательской деятельностью, увы
Ну у нас по практике преподы были молодые (аспиранты по сути). Так что книжки они читали тоже довольно новые, на возраст тут не спишешь. Мне всё-таки кажется, это Вы излишне категоричны в суждениях. То, что вектор неоптимальный вариант и более медленное решение — не мешает его применять (и получать работающий, и даже не глючащий продукт). Опять же — я применял его столько лет, и не разу не получил ни одной проблемы (с производительностью в том числе).
Предыдущий комментатор говорит про далёкость преподавателей (в том числе ваших аспирантов) от промышленной разработки. Это сказывается и сильно на том, какой и как они дают материал. И да, Vector нерекомендован к применению самими разработчиками java.
А то, что вектор очень неоптимальный вариант для многопоточной среды мешает его применять в промышленной разработке очень сильно — слишком удобный аналог есть, чтобы пользоваться потенциально проблеммным аналогом.
То, что вы не сталкивались с проблемами — не удивительно, требования к лабам существенно ниже, чем требования к промышленным программам.
Предыдущий комментатор говорит про далёкость преподавателей (в том числе ваших аспирантов) от промышленной разработки.
Я бы не сказал так. Тот парень в «ЛАНИТ-Теркоме» работал. Правда, его основной язык таки C++ :)
требования к лабам существенно ниже, чем требования к промышленным программам
В каком именно плане они ниже? Я бы не согласился.
Потом, лаба лабе рознь. У моей программы тысячи скачиваний только за первый год по всему миру, свои задачи она прекрасно выполняет.
У него не просто основной язык c++, он в принципе работал(ет) в компании, которая занимается преимущественно разработкой на этом языке (ещё у них там есть мобильщики, ага… но это свой отдельный мир всё же).
В общем вопрос в том, что применять в java технологии c++… это по меньшей мере странно.
В каком именно плане они ниже? Я бы не согласился.
Потом, лаба лабе рознь. У моей программы тысячи скачиваний только за первый год по всему миру, свои задачи она прекрасно выполняет.
Привидите пример вашей лабы:
- какие задачи решает?
- насколько критична скорость/производительность/потребление?
- что будет, если будет 100/1000/10000 и больше запросов в минут?
В общем вопрос в том, что применять в java технологии c++… это по меньшей мере странно.
Он этого и не делал. И в его листингах действительно были только ArrayList. Но меня он за код с векторами по рукам не бил, я вот о чём. Просто всех призывал учитывать, когда что лучше применять (в том числе учитывая то, нужна ли многопоточность).
Привидите пример вашей лабы
Ну, она не совсем лаба, а семестровая/курсовая, но не суть, не будем раздувать значимость :)
Визуализатор алгоритмов на графах. Задача — выполнять алгоритмы, подсвечивая в риалтайме состояние рёбер и вершин, вести логи операций. Есть встроенный редактор графов и удалённое хранение на сервере даже (не помню уже, зачем это делал). Соответственно, есть сервер под это дело в виде отдельной утилиты (с GUI). Он тоже использует векторы. Но я никогда не проводил нагрузочного тестирования всего этого. Скажем так, 1 клиент с 8-10 запросами в секунду (всего порядка 25-30 запросов, передача данных построчно в текстовом формате без использования даже HTTP протокола) — это не нагрузка.
Но меня он за код с векторами по рукам не бил, я вот о чём. Просто всех призывал учитывать, когда что лучше применять (в том числе учитывая то, нужна ли многопоточность).
А опытный джавист по рукам бы тоже не бил, но призывал всех не использовать Vector, если нет понимания зачем это надо. А если есть понимание, зачем нужна многопоточность, то призывал бы использовать другие решения (вплоть до велосипедов), но не использовать Vector, ибо он многие проблемы решить не способен, но вызывает ложное ощущение защищённости.
Визуализатор алгоритмов на графах. ...
Т.е. получаем:
- нагрузка низкая (вектор не в силах дать визуально-заметный лаг),
- производительность, как я понимаю, особая не нужна?
- потребление по памяти скорее всего можно поигнорировать (есть подозрение, что jvm у вас кушает больше, чем ваша программа)?
- а что за сервер, не подскажете (какие библиотеки, протокол, ...)?
ибо он многие проблемы решить не способен, но вызывает ложное ощущение защищённостиПримерно в таких формулировках нам вроде и не советовали его использовать, Вы правы. Я похоже и правда что-то подзабыл.
есть подозрение, что jvm у вас кушает больше, чем ваша программаНе исключаю, что так и есть :)
а что за сервер, не подскажете (какие библиотеки, протокол, ...)?Никаких библиотек. Текстовый протокол собственного сочинения, обмен через сокеты. И я прекрасно помню, там была проблема нарушения порядка прохождения отдельных запросов (отправляем 1, 2, 3, ..., 10, приходит 3, 4, 1, 6, 5, ...). Я не знал, как пофиксить это по уму, поэтому просто ввёл в протокол нумерацию строк. Кстати, новый коннекшен на каждую строку не делался, просто шла запись в стандартный PrintWriter через println. Могу покопаться в коде и посмотреть, как там было сделано.
Ну у нас по практике преподы были молодые (аспирант по сути). Так что книжки они читали тоже довольно новые, на возраст тут не спишешь.
Возраст тут не при чём, просто люди с джавой никогда особенно не сталкивались, иначе были бы в курсе.
Мне всё-таки кажется, это Вы излишне категоричны в суждениях.
Я категоричен, но не излишне.
То, что вектор неоптимальный вариант и более медленное решение — не мешает его применять
Именно это и мешает.
и получать работающий, и даже не глючащий продукт
Я всё это время говорил не о качестве продукта, а качестве кода. Продукт может быть очень хорошим, при том, что код там плохой.
Опять же — я применял его столько лет
Самое время перестать ))
и не разу не получил ни одной проблемы (с производительностью в том числе).
Проблем на код ревью у вас не было либо потому, что не было код ревью, либо потому, что ревью делали люди, не работающие с джавой. Проблем с производительностью не было, потому что производительность у вас в приложении не является узким местом.
Я категоричен, но не излишне.
Категоричность — это плохо :)
Именно это и мешает.
Нисколько. Ваша позиция сейчас напоминает позицию человека, который призывал бы использовать ассемблер вместо C/C++, потому что «так быстрее работает и легче контролировать результат».
Самое время перестать ))
С чего вдруг? Работает же. И даже если его «выпилят» в будущих версиях JVM совсем — те проекты, которые я писал под Java 1.6, так и останутся работать под 1.6 (в крайнем случае, под 1.7). Так что даже это не проблема.
Проблем на код ревью у вас не было либо потому, что не было код ревью
Да, их не было. Было тестирование собственными силами, чтобы понять, есть ли ошибки, и достаточно ли всё оптимально работает. В том числе и в плане скорости.
Проблем с производительностью не было, потому что производительность у вас в приложении не является узким местом.
Браво, вы наконец-то это поняли. Так зачем тогда там что-то переписывать, раз она не критична?)
Нисколько. Ваша позиция сейчас напоминает позицию человека, который призывал бы использовать ассемблер вместо C/C++, потому что «так быстрее работает и легче контролировать результат».
Если бы ассемблер и C/C++ ничем, кроме названия не отличались, ваша аналогия была бы хорошей. В данном случае она плохая.
Так зачем тогда там что-то переписывать, раз она [производительность] не критична?)
Вы всё это время думали, что я предлагаю вам переписать старый код? Я советую не использовать Vector в новом. Хотя старый код имеет смысл поправить если вы занимаетесь поддержкой проекта, просто, чтобы не было стыдно за свой код. Это конечно, если проект вам не совсем безразличен.
Это с чего вдруг?.. Там интерфейс абсолютно такой же.
Что интересно, и у LinkedList точно такой же интерфейс.
Разница только в производительности
И с LinkedList у ArrayList разница в производительности и ещё в количестве используемой памяти. Но с процессом чтения кода это не связано никак.
Готовы ли вы воспользоваться своей же логикой, чтобы оправдать использование LinkedList там, где все используют ArrayList?
Что интересно, и у LinkedList точно такой же интерфейс.
И это хорошо. Специально же так спроектировано.
Готовы ли вы воспользоваться своей же логикой, чтобы оправдать использование LinkedList там, где все используют ArrayList?
Между этими двумя коллекциями разница ещё меньше. Только вот час назад читал отличный вопрос на STO на эту тему :)
По сути, зависит от того, что нам нужно делать чаще: удаление/вставку или доступ к произвольному элементу (да, вставка в LinkedList тоже побыстрее, поиск по нему в среднем N/4, а в случае с ArrayList нам нужно делать сдвиг хвоста, и там в среднем N/2). В плане обхода — вообще без разницы. Оверхед по памяти — есть, но крайне мал, и чем меньше список, тем он меньше в абсолютном значении.
В моём коде, который я писал для браузерного движка, прямой доступ к элементу по номеру почти никогда не используется. Там везде только обходы, поэтому что именно использовать — там почти всё равно (не считая оверхеда по памяти у LinkedList).
Между этими двумя коллекциями разница ещё меньше.
Разница между LinkedList и ArrayList огромна.
В плане обхода — вообще без разницы.
Разница большая, LinkedList не ложится в кеш.
Оверхед по памяти — есть, но крайне мал
LinkedList занимает в памяти где-то в 6 раз больше места, чем ArrayList.
Там везде только обходы, поэтому что именно использовать — там почти всё равно
Так как там только обходы — использовать можно только ArrayList.
P. S. Прошу прощеня за краткость, стараюсь писать только главное. Работа ))
Разница между LinkedList и ArrayList огромна.
Не так и огромна. Посмотрите сами сравнения:
stackoverflow.com/questions/322715/when-to-use-linkedlist-over-arraylist-in-java
LinkedList занимает в памяти где-то в 6 раз больше места, чем ArrayList.
Простите, «лолшто»? Там оверхед в в два указателя на каждый элемент списка, и всё. Вы разве не в курсе, что память под указатель имеет постоянный размер независимо от типа (и количества полей и методов в классе, на который мы ссылаемся)?
Ссылка на объект или массив занимает одно 32-битное слово (4 байта) на 32-битной виртуальной машине JVM или Davlik. A null занимает то же место, что и ссылка. (Он должен, потому что нуль должен быть помещен в слот с типизированным типом, то есть поле экземпляра, локальную переменную и т.д.)
С другой стороны, объект занимает минимум 2 32-битных слова (8 байтов), а массив занимает минимум 3 32-битных слова (12 байтов). Фактический размер зависит от количества и типов полей для объекта, а также от количества и типов элементов для массива.
Для 64-разрядной JVM размер ссылки составляет 64 бита, если вы не настроили JVM на использование сжатых указателей.
Не так и огромна. Посмотрите сами сравнения:
Сравнение неполное, но даже там с самого начала написано, что почти всегда надо использовать ArrayList. В комментарии, кстати, есть уточнение про кеш.
Простите, «лолшто»?
"лолLinkedListбольшеArrayListгде-тов6раз" ))
Там оверхед в в два указателя на каждый элемент списка, и всё.
Ну, то есть по вашему мнению LinkedList занимает всего в 3 раза больше, чем ArrayList?
Вы разве не в курсе, что память под указатель имеет постоянный размер независимо от типа (и количества полей и методов в классе, на который мы ссылаемся)?
Ладно, шутки в сторону. В ArrayList на один элемент приходится 1 указатель на объект, то есть 8 байт. В LinkedList — указатель на объект — 8 байт, указатель на следующую ноду — 8 байт, указатель на предыдущую ноду — 8 байт, оверхед на объект с нодой — 16 байт.
Это у нас получает разница в 5 раз. По умолчанию в джаве включена компрессия указателей. Тогда на указатель приходится 4 байта и разница получается не в 5, а в 7 раз. Плюс могут быть различия в зависимости от конкретной реализации JVM. Такие дела.
А если у меня вообще поток всего один, и никто никого не блокирует? Можно ещё раз на пальцах, чем Vector медленнее ArrayList в случае одного потока?
На примере извлечение элемента i:
ArrayList:
Операция 1: берём указатель на внутренний массив (лёгкая операция в малое количество циклов)
Операция 2: извлекаем из массива элемент i (лёгкая операция в малое количество циклов)
Vector:
Операция 1: Входим в монитор (тяжёлая операция в существенно большее количество циклов)
Операция 2: Получаем указатель на внутренний массив (лёгкая операция в малое количество циклов)
Операция 3: Извлекаем элемент i из массива (лёгкая операция в малое количество циклов)
Операция 4: Освобождаем монитор (не помню точно, насчёт сложности операции)
Вот и посчитайте, что выполнится быстрее. Пример приведён исключительно для однопоточного приложения. Для многопоточного доступа (если у нас только чтение — то можно же и из ArrayList-а читать) там будут ещё нюансы, что читает одновременно только один поток, а остальные тупо стоят ждут.
Создание итератора — в самом деле лишние накладные расходы, которых можно избежать. Зачем нам итератор? От него выигрыш только в случае использования LinkedList. Но если мы решим его использовать, то и несколько циклов в этот момент можно будет переписать, которые с ним работают. В чём проблема-то?
Потому что, чем меньше мест где можно накосячить — тем меньше багов в программе. Foreach не даёт возможности накосячить, for через интовый итератор — только в путь. При этом проигрышь по производительности от итератора в большинстве случаев не ощущается от слова никак. А вот там, где ощутили — там и нужна оптимизация. В общем code convention — они не просто так придуманы.
И что тут хорошего? Ошибка в консоль, вылет из метода по не пойманному исключению, программа у пользователя «упала». Может лучше всё-таки отработать с чуть устаревшими данными?
Исключение — отличный маркер для падений теста, вы так не думаете? Исключение в проде тоже не так плохо, как может показаться — при минимально-грамотной настройке оно окажется в логе и будет относительно легко её пофиксить. Насчёт "а может и фиг с ним" — представьте, что ваша программа считает зарплату и передаёт на шлюз команды по выплате. И вот у вас ушёл какой-то топ с зарплатой в дофига-денег, а алгоритм вовремя не прочухал и отправил его зарплату техничке, которая оказалась следующая в списке. Вот такой вот весёлый баг.
А ещё лучше — ещё на этапе написания кода подумать о том, что будет, если коллекцию кто-то попытается изменить. И вот здесь как раз пригодится CopyOnWriteArrayList, о котором Вы выше упоминали. Или можно самому вручную создать копию коллекции, и обходить уже её (в противном случае мы вылетим с ошибкой, если у нас итератор!).
Ну вы неужели думаете, что баги пишутся сознательно? Половина багов возникает по невнимательности, вторая половина — при изменении изменении зависимого/зависящего от этого куска кода. Ну просто меняются условия работы и там, где код использовался в одни поток вдруг появляется несколько потоков.
Так никто и не спорит! Там же выше шла дискуссия о том, нужно ли использовать итератор, если он даёт оверхед. Моё мнение — если можно на этом сэкономить, то не стоит: обход по индексам, в случае, если соблюдены все меры предосторожности, даст тот же эффект в случае не списка.
Ещё раз — да оверхед по стоимости выполнения (копеечный в общем-то — и по памяти и по процессору), который обеспечивает уменьшение мест для появления багов. Право слово — оно того стоит в 99% ситуаций.
Да Вы оптимист! У меня не самый большой курсовой проект комплилися на среднем железе (окей, на довольно слабом железе для тех лет) секунд 7-8. Это простой проект. А если что-то тяжёлое? Тут и 1-2 секунды можно лишних получить, особенно если плохой HDD вместо SSD.
В java как-то принято в модульность. Реально проектов на 100 тысяч строк и больше не так уж и много, но даже эти проекты собираются за пару минут. Вот тесты могут крутиться уже существенно дольше. И я говорил про оверхед от единичного использования синтаксического сахара.
Онлайновые — это какие?
Онлайновые — это которые IDE запускает во время написания кода и/или простоя самостоятельно.
Там имели в виду случай, когда в заголовке или теле цикла перепутана буква итератора. Как минимум любая IDE подчеркнёт ошибку, если мы напишем j вместо i, а такой переменной у нас нет.
А если такая переменная есть?
Да, бывают случаи вложенных циклов, бывает, когда переменная j есть внутри тела цикла, и мы опечатались в каком-то индексе. Ну а отладка на что? Точки останова? Юнит-тесты, в конце концов? Обычное тестирование «руками» на нескольких наборах данных? Такая ошибка обычно всплывает на первом же прогоне!
Простите, вы собираетесь каждый кусок кода вручную тестировать? Иначе зачем вам эти самые "отладка" и "точки останова"? Нет на это времени практически никогда. К такому способу тестирования прибегают в 2х случаях: есть бага, но не до конца понятно, в какой момент алгоритм лажает, или код совсем уж труднотестируем автоматически — так вручную на паре-тройке наборов прогоняется… Юнит-тесты… Вы слышали о 100% покрытии не в TDD? А большинство работает не по TDD. А вы в курсе, что реально все случае проверить нереально, именно поэтому появилась такая штука как "мутационное тестирование"? В общем способов-то обезопаситься много… но вот foreach реально тупо дешевле. Его использования занимает условно секунду, а тесты/юнит-тесты/прочие радости — минуты, часы, ...
Вы что, за раз добавляете и коммитите 10k строк? Нет, вы обычно добавляете строк 100-200, ну в крайнем случае 500. А длина одной функции вообще в идеале должна быть строк 40-50, не больше. И циклов там — ну максимум 2-3. К чему тут обсуждать общий размер кодовой базы проекта вообще?
Ну бывает, что и по 2к строк за раз в коммит уходит, пусть и крайне редко… Средний коммит, да — 100-400 строк. А длина функции больше 10 строк — это уже сигнал внимательно на неё посмотреть и по возможности разбить… Вот только как всегда, есть нюанс: баги привносятся чаще всего не в том месте, которое изменяют, а в те места, которые от него зависят. И чем больше кодовая база, тем больше случаев взаимного использования разных кусков кода. А опечатки "замыленый" глаз банально не видит даже в 10 строчках (проверено неоднократно).
Опять Вы про что-то не то говорите. Стандарт кодирования — это скорее про правила оформления кода.
Вы не поверите, но использование (или не использование) синтаксического сахара — это тоже часть стандартов кодирования.
Но цикл for-то тут причём? Это вполне себе легитимная конструкция языка Java!
Ну так кто же заставляет от цикла-то отказываться? Только вот количество возможных вариантов его использования снижаются сознательно — выше уже неоднократно писал почему
Это не какой-нибудь goto, который кое-где ещё есть, но использовать его не советуют.
Вот 90% говорящих про вред goto никогда не пользовались goto. В грамотных руках — отличнейшая инструкция… а в ассемблере — так и вовсе никуда без неё.
Никто его использовать не запрещает, более того, он для этого изначально и был предназначен — для обхода массивов в том числе.
Стандарты кодирования могут запрещать. Из тех же соображений, что и goto.
Да, в Java он пришёл скорее всего как наследие из C/C++, но я не видел ещё ни одной статьи, которая утверждала бы, что «for в Java — это зло, по возможности никогда его не используйте».
Ну так вы не представляете, сколько альтернативных путей использования цикла for, не включающих в себя обход массива! И никто там его не запрещает.
Входим в монитор (тяжёлая операция в существенно большее количество циклов)
Спасибо, и правда наглядно. Я примерно так и представлял себе работу вектора. Но я не знаю абсолютно, как в Java устроены мониторы. Надо бы почитать. Просто может ведь оказаться, что не такая уж это страшно тяжёлая операция, как многим кажется :) Это ведь всего лишь специальный объект со своими методами и полями. И если одновременно запущенных потоков — минимум, то на что там может уйти так уж много процессорных тактов, я так и не понимаю.
И вот у вас ушёл какой-то топ с зарплатой в дофига-денег, а алгоритм вовремя не прочухал и отправил его зарплату техничке, которая оказалась следующая в списке. Вот такой вот весёлый баг.
Так я ж писал — нельзя серьёзный алгоритм (который может привести к серьёзным проблемам из-за багов) пихать в прод, толком не протестив. Особенно если программа многопоточная. Сначала юнит-тесты хотя бы сделать и прогнать надо… И даже с точки зрения самого алгоритма — ваш подход не решит проблему, а только сделает её более явной и заметной. А чтобы её решить, надо сам код переписывать. например, перед обходом коллекции делать копию, как я предложил выше.
Половина багов возникает по невнимательности, вторая половина — при изменении изменении зависимого/зависящего от этого куска кода.
За первое надо по рукам бить, второе — пытаться поймать на тестах. Ну или смириться с багами, которые вылезут потом :)
И я говорил про оверхед от единичного использования синтаксического сахара.
Только мест, где Вы будете его использовать, намного больше одного. И да, я вполне представляю проект, которые даже на сегодняшнем железе будет собираться в районе минуты (раз мой собирался 8 секунд при своём малом размере). Наверное, таких проектов даже немало.
А вы в курсе, что реально все случае проверить нереально, именно поэтому появилась такая штука как «мутационное тестирование»?
Все — не реально, но все имхо как правило проверять и нет необходимости. Про мутационное тестирование увы не читал :)
К такому способу тестирования прибегают в 2х случаях: есть бага, но не до конца понятно, в какой момент алгоритм лажает, или код совсем уж труднотестируем автоматически — так вручную на паре-тройке наборов прогоняется…
Есть случай ещё проще. Есть бага, понятно, где она, но программист сильно задолбался и не хочет исправить так, чтобы усугубить ситуацию (либо не сделать её лучше). Если фиксить интуитивно код, который не очень тривиален — есть шанс пофиксить неправильно. Именно в таких случаях полезно поставить брейкпоинт в проблемную строку, и посмотреть медленно и внимательно, что там чему равно, какие индексы у нас берутся и с какой стороны что вычитается.
А длина функции больше 10 строк — это уже сигнал внимательно на неё посмотреть и по возможности разбить…
Вы говорите прямо как нас в вузе учили… Да вот только жаль у меня пока не выходит таких коротких функций в реальных проектах, даже там, где логика очень простая :) Примерно 25-30 строк получается.
В грамотных руках — отличнейшая инструкция…
Да-да, нам так же говорили. Я вроде бы даже видел её где-то в исходниках JDK, кажется. Сам лично правда не использовал, не довелось как-то :)
Ну так вы не представляете, сколько альтернативных путей использования цикла for, не включающих в себя обход массива! И никто там его не запрещает.
Давайте ещё раз. Я охотно верю, что стайлгайды могут многое запрещать, или наоборот, требовать. В том числе использование синтаксического сахара. Но. Обход массива без использования итератора — не такой страшный грех, как goto, всё-таки, на мой взгляд. Возвращаясь к началу — Вы вроде так и не смогли назвать сценарий, где мы получим баг, кроме опечатки в букве (что совсем уж рука-лицо и возможно только при наличии обеих переменных в текущей области видимости) и наличия нескольких потоков. Я вообще говорю про однопоточный вариант — и даже в многопоточном случае использование итератора не избавит от необходимости делать коллекцию иммутабельной каким-либо способом, иначе у нас сгенерируется исключение, и обход массива прервётся, а нам это не годится.
Ну и напоследок. Мне вот очень приятно и привычно видеть обход любой коллекции глазами в коде как for и буковки i (ну привычка такая за много лет сформировалась уже). Использование итератора в чистом виде подразумевает или использование while (и одна доп. строка сверху для создания итератора), или использование for без третьего выражения
for (Iterator it = list.iterator(); it.hasNext(); )
Слава богу, конечно, что есть вариант с foreach, это реально позволяет не использовать while и не добавлять лишние строки в код над циклом.
Но я не знаю абсолютно, как в Java устроены мониторы. Надо бы почитать. Просто может ведь оказаться, что не такая уж это страшно тяжёлая операция, как многим кажется :) Это ведь всего лишь специальный объект со своими методами и полями. И если одновременно запущенных потоков — минимум, то на что там может уйти так уж много процессорных тактов, я так и не понимаю.
Смотрите: у нас неизвестная конфигурация машины, например простенький компьютер в серверной стойке — 4 процессора по 4 ядра по 2 потока на каждое. А теперь нам надо удостовериться, что кеш по объекту одинаковый на всех этих потоках. Я не знаю точную реализацию монитора в java (да и зависит это от jvm), но возьмём простейший случай — по аналогии с volatile переменными: при каждом обращении к монитору мы должны загрузить (а после окончания операции — выгрузить) состояние из хипа. Т.е. процессор сбивается с текущей работы и начинает загрузку данных из RAM -> l3 кеш -> l2 кеш -> l1 кеш, после чего возвращается к выполнению инструкций дальше. В интернете достаточно много инфы по сравнению скорости доступа к каждому виду памяти — поищите, если интересно.
Т.е. в худшем случае (если массив не подгружен в текущий кеш) для вектора будет следующая процедура:
- подгрузка данных монитора из RAM,
- если монитор свободен — обновление данных монитора в RAM (если нет — вешаем поток и ждём сигнала и это совсем уже не быстрая процедура)
- подгрузка или выгрузка данных массив из/в RAM (в зависимости от выполняемой операции… но это если кешей нет, а если нужный участок массива в кеше — в RAM не идём)
- (вот в этой опреации не уверен, но по идее должна быть) загрузка данных монитора из RAM (чтобы освободить следующий поток, если есть такой)
- сохранение данных монитора в RAM
Это приблизительная схема, как оно реально работает — это надо у разработчиков jvm уточнять.
Так я ж писал — нельзя серьёзный алгоритм (который может привести к серьёзным проблемам из-за багов) пихать в прод, толком не протестив.
Вы точно живёте не в мире розовых пони? Большинство заказчиков не готовы ждать даже просто 100%-ного покрытия тестами...
Особенно если программа многопоточная. Сначала юнит-тесты хотя бы сделать и прогнать надо…
юнит-тесты ничего не проверяют для многопоточной среды. Точнее не гарантируют качественную проверку. Банально во время теста jvm может работать на одном единственном ядре компьютера и фактически будет работать в однопоточном режиме.
И даже с точки зрения самого алгоритма — ваш подход не решит проблему, а только сделает её более явной и заметной.
А то ж! Тут главное, что стоимость одного куска проверенного вхлам кода не высока, а вот обеспечить подобное (в плане финансов*времени) для всей кодовой базы — большинство заказчиков не готовы.
А чтобы её решить, надо сам код переписывать. например, перед обходом коллекции делать копию, как я предложил выше.
Нафиг-нафиг так делать в обычном режиме. Велосипеды это почти всегда плохо. Велосипеды хорошо, когда готового хорошего решения не существует. Или когда они совсем не подходят под какую-то странную ситуацию. А чтобы переписать код — нужно о проблеме узнать (возвращаемся к выбрасыванию логируемого исключения). Я же говорю — это основная проблема, потому что чаще ломается не новый код, а зависимый от изменённого… ну или изменённый, к которому кто-то обращается не по новому протоколу, а этого не заметили.
За первое надо по рукам бить, второе — пытаться поймать на тестах. Ну или смириться с багами, которые вылезут потом :)
Когда искусственный интелект успел захватить мир? Я что-то не заметил, простите. Свойство биомассы таково, что "любой человек допускает ошибки". А ещё бывают криво прописанные требования. Тесты — тоже не панацея. Да и правильный стиль кодирования тоже, но в сумме это позволяет неплохо так повышать качество кода. Никто ж не говорит, что можно ляпать ошибки или не тестировать...
Только мест, где Вы будете его использовать, намного больше одного. И да, я вполне представляю проект, которые даже на сегодняшнем железе будет собираться в районе минуты (раз мой собирался 8 секунд при своём малом размере). Наверное, таких проектов даже немало.
Вы сейчас про сборку или про компиляцию? На сборку саму по себе синтаксический сахар вообще никак не влияет, только на компиляцию. Ваш проект, полюбому, компилировался пару-тройку секунд от силы.
Среднее время сборки не очень крупного проекта (не включая время тестирования) — 30-50 секунд на компьютере с hdd. А вот тесты у меня на текущем проекте ~8 минут суммарно гоняются… Так что те наносекунды, которые сожрёт синтаксический сахар меня совсем не интересуют. (даже если там будут тысячи вхождений — затраченное время всё равно окажется на уровне миллисекунд).
Есть случай ещё проще. Есть бага, понятно, где она, но программист сильно задолбался и не хочет исправить так, чтобы усугубить ситуацию (либо не сделать её лучше). Если фиксить интуитивно код, который не очень тривиален — есть шанс пофиксить неправильно. Именно в таких случаях полезно поставить брейкпоинт в проблемную строку, и посмотреть медленно и внимательно, что там чему равно, какие индексы у нас берутся и с какой стороны что вычитается.
Вообще-то для такой ситуации больше подходят юнит-тесты: делается вызов, который должен вызвать проблему бага и продиагностировать её, а потом уже с готовым тестом бага и фиксится. Дебаг для таких ситуаций — избыточная лень.
Вы говорите прямо как нас в вузе учили… Да вот только жаль у меня пока не выходит таких коротких функций в реальных проектах, даже там, где логика очень простая :) Примерно 25-30 строк получается.
Ну значит вам относительно повезло с преподами. А Роберт наш Мартин в своей книжке (чистый код — рекомендуется к прочтению) вообще ратует за функции не длиннее 5 строк, если я правильно помню. Но это на мой вкус — реально уж совсем мельчить. И да, изредка я не против существования функций 20-30 строк, но там должна быть какая-то уж совсем своя логика, которую трудно разбить на подшаги...
Давайте ещё раз. Я охотно верю, что стайлгайды могут многое запрещать, или наоборот, требовать. В том числе использование синтаксического сахара. Но. Обход массива без использования итератора — не такой страшный грех, как goto, всё-таки, на мой взгляд.
Нарушение принятых на проекте конвенций — как раз того же уровня грех (ибо goto запрещён теми же стайлгайдами). Ну и как изначально писали люди — после небольшого привыкания (это если первый раз видите foreach, а раньше пользовались for на индексных целочисленных итераторах) это банально легче читается. А чем легче читается — тем меньше ошибок. Правда-правда. Меньше шансов перепутать переменную индекса (ибо 0), меньше шансов перепутать переменную в которую читается элемент массива (ибо в объявлении цикла), меньше шансов промахнуться мимо нужной переменной в слачае обработки элемента массива.
Возвращаясь к началу — Вы вроде так и не смогли назвать сценарий, где мы получим баг, кроме опечатки в букве (что совсем уж рука-лицо и возможно только при наличии обеих переменных в текущей области видимости) и наличия нескольких потоков.
По мне — и этих двух ситуаций хватает, чтобы предпочесть foreach
Я вообще говорю про однопоточный вариант — и даже в многопоточном случае использование итератора не избавит от необходимости делать коллекцию иммутабельной каким-либо способом, иначе у нас сгенерируется исключение, и обход массива прервётся, а нам это не годится.
В большинстве случаев — плевать нам с высокой колокольни на иммутабельность. А вот в тех редких случаях, когда она внезапно уже потребуется (после какой-нибудь мелкой фичи в совсем другом месте) — так хоть легче будет продиагностировать проблему. И я вам уже приводил пример, когда пусть лучше прервётся, чем отработает с неправильными данными.
Ну и напоследок. Мне вот очень приятно и привычно видеть обход любой коллекции глазами в коде как for и буковки i (ну привычка такая за много лет сформировалась уже).
Поработайте с месяцок только с foreach и вам уже перестанет этот вариант казаться таким уж удобным. Правда. Большинство к этому приходят.
Использование итератора в чистом виде подразумевает или использование while (и одна доп. строка сверху для создания итератора), или использование for без третьего выражения
Ну что вы уж так-то?! Ведь синтаксический сахар foreach раскладывается примерно в следующую картину:
for (Iterator it = list.iterator(); it.hasNext(); SomeClass element = it.next()) {...}
Ну или на while можно аналогичным образом написать.
PS и я бы не сказал, что foreach используется всегда. Приведённый мной пример можно использовать, если есть потребность модифицировать массив (итератор позволяет, как минимум, удалять текущий элемент… возможно поддерживается и операция вставки до/после, но тут я ничего сказать не могу — слишком редко пользуются итератором… впрочем если коллекция такого не позволяет, то попытка изменения через итератор выбросит исключение :-)
Т.е. в худшем случае (если массив не подгружен в текущий кеш) для вектора будет следующая процедура
Если у нас не серверное приложение, и процессор один (допустим, многоядерный) — то очень может быть, что часть этих пунктов не понадобится, если монитор находится в кэше процессора одного из уровней. Или он в принципе не может там оказаться? Я плохо в этом понимаю, объясните плиз.
Также хотел бы отметить, что и само обращение к данным иногда идёт через RAM (если поле volatile). И я так понимаю, в случае с Vector JVM попытается обновлять данные массива именно в RAM при каждой записи, чтобы не было проблем у других потоков. Или же такое обновление будет только перед чтением (когда актуальные данные потребуются другому потоку)?
Большинство заказчиков не готовы ждать даже просто 100%-ного покрытия тестами...
Ну позвольте, где я писал про 100%? И вообще, заказчик часто в это вовсе не лезет, ибо не разбирается — и степень покрытия остаётся чисто на усмотрение разработчика. Как по мне, процентов 60-70 уже неплохо.
юнит-тесты ничего не проверяют для многопоточной среды. Точнее не гарантируют качественную проверку. Банально во время теста jvm может работать на одном единственном ядре компьютера и фактически будет работать в однопоточном режиме.
Ясно. А есть какие-то способы тестирования многопоточных программ (автоматизированные)?
это основная проблема, потому что чаще ломается не новый код, а зависимый от изменённого…
И в этот момент мне снова показалось, что хороший юнит-тест, проверяющий совокупную работу нескольких логических модулей в связке, мог бы такие проблемы быстро выявить… Но это я теоретизирую :)
Вы сейчас про сборку или про компиляцию? На сборку саму по себе синтаксический сахар вообще никак не влияет, только на компиляцию.
Про всё в сумме. Команда Build в контекстном меню проекта :)
Вообще-то для такой ситуации больше подходят юнит-тесты: делается вызов, который должен вызвать проблему бага и продиагностировать её, а потом уже с готовым тестом бага и фиксится. Дебаг для таких ситуаций — избыточная лень.
Вот здесь вообще Вас не понял. Лень — это использовать дебаг, или лень когда его не используют? Ваш метод явно сложнее, дольше и контринтуитивнее. Смотрите, у нас идёт какая-то хитрая работа с индексами, и мы знаем, что у нас опечатка, возможно несколько раз. Чем хуже поставить брейкпоинт и посмотреть на реальные значения индексов по сравнению с исправлением «на глазок» и последующим перепрогоном теста? Тем более, если код свежий или вообще писался прямо только что, теста по нему может не быть от слова «совсем».
И да, изредка я не против существования функций 20-30 строк, но там должна быть какая-то уж совсем своя логика, которую трудно разбить на подшаги...
Кстати, когда я писал основу для браузерного движка, у меня получались кошмарно огромные функции. Главной проблемой разбиения на более мелкие методы было то, что в рамках метода у меня доступен целый набор локальных переменных, которые в случае разбиения на несколько вспомогательных методов нужно как-то в них передавать (а их много, и это приведёт к совершенно кошмарным сигнатурам). Делать эти значения полями класса — как-то совсем моветон. Как бы Вы отрефакторили такой длинный метод (речь идёт о Java)?
меньше шансов перепутать переменную в которую читается элемент массива (ибо в объявлении цикла)
Имхо одинаково маловероятно. Ну да, здесь у нас переменная в заголовке цикла указана, а там мы используем какую-то свою. Но я так и не понял, как вообще её в принципе можно перепутать.
В большинстве случаев — плевать нам с высокой колокольни на иммутабельность. А вот в тех редких случаях, когда она внезапно уже потребуется (после какой-нибудь мелкой фичи в совсем другом месте) — так хоть легче будет продиагностировать проблему. И я вам уже приводил пример, когда пусть лучше прервётся, чем отработает с неправильными данными.
Когда реально плевать — и обычный for не навредит, т.к. один поток. Когда не плевать — согласен насчёт того, что быстрее и легче продиагностировать.
Вообще пример с зарплатами, как по мне, тоже сильно надуманный. В Вашем примере у нас поменялся список сотрудников, потому что оттуда кого-то удалили, общая длина коллекции стала меньше, и в этот же самый момент тот узел или модуль системы, куда мы передаём данные, уже имеет актуальную копию новых данных. Это не всегда так, особенно если данные отправляются на другую машину по сети. А если мы отправляем их просто другому потоку или другому приложению на той же машине…
В любом случае, надо каким-то образом обернуть получение массива сотрудников и отправку данных по зарплатам в транзакцию, чтобы гарантировать, что между получением списка и отправкой списка сумм ничего не изменилось. И в этом плане, как по мне, надо использовать или изначально иммутабельную коллекцию (что наверное правильнее), или делать копию списка и работать уже с ней (эту копию другие потоки никак не затронут). С другой стороны, тут может возникнуть уже обратная проблема: мы отправляем данные по старому списку, хотя на самом деле он поменялся; об этом знает получатель данных, но не знает наш код. По-хорошему тут надо вводить версионирование списка фамилий и при отправке данных прикреплять номер версии, по которой мы делали обход, я бы решил проблему так.
Ну что вы уж так-то?! Ведь синтаксический сахар foreach раскладывается примерно в следующую картину
Это если использовать ещё одну переменную. А на самом деле можно ведь и напрямую в теле цикла использовать it.next(), а читать обычно нужно в переменную, определённую в методе выше до цикла (подсчёт суммы, копирование в другую коллекцию).
итератор позволяет, как минимум, удалять текущий элемент
Спасибо, я как-то про это забыл. Тогда я вообще теряю суть — зачем итератор контролирует состояние (модификацию коллекции другими потоками), если он позволяет её модифицировать при обходе в текущем потоке? Я думал смысл как раз в полной иммутабельности при обходе. Я правильно понимаю, что фишка в том, что в данном сценарии мы контролируем происходящие с коллекцией изменения?
Если у нас не серверное приложение, и процессор один (допустим, многоядерный) — то очень может быть, что часть этих пунктов не понадобится, если монитор находится в кэше процессора одного из уровней. Или он в принципе не может там оказаться? Я плохо в этом понимаю, объясните плиз.
Монитор, как и volatile переменные из кешей обрабатываться не будут. Более того, там по идее должен быть какой-то механизм гарантирующий атомарность оперции чтения-записи...
Также хотел бы отметить, что и само обращение к данным иногда идёт через RAM (если поле volatile). И я так понимаю, в случае с Vector JVM попытается обновлять данные массива именно в RAM при каждой записи, чтобы не было проблем у других потоков. Или же такое обновление будет только перед чтением (когда актуальные данные потребуются другому потоку)?
вектор не имеет классификатора volatile на массиве, соответственно работать он будет с процессорным кешэм (если тот есть… или загружать из RAM, если кеша нет)… запись из кеша в RAM происходит на точке останова текущей функции, если я правильно помню… надо смотреть спецификацию, подзабыл уже.
Ну позвольте, где я писал про 100%? И вообще, заказчик часто в это вовсе не лезет, ибо не разбирается — и степень покрытия остаётся чисто на усмотрение разработчика. Как по мне, процентов 60-70 уже неплохо.
Ну вот и не будет у вас список покрыт тестами. А потом в нём ошибка. Какая лучше — с исключением или с испорченными боевыми данными?
Ясно. А есть какие-то способы тестирования многопоточных программ (автоматизированные)?
Что-то определённо есть, как минимум нагрузочное тестирование в том числе может показать проблемы параллельного доступа… но вот методов гарантирующих вызов некоторых мелких кусков кода в параллель я не припоминаю.
Вот здесь вообще Вас не понял. Лень — это использовать дебаг, или лень когда его не используют? Ваш метод явно сложнее, дольше и контринтуитивнее. Смотрите, у нас идёт какая-то хитрая работа с индексами, и мы знаем, что у нас опечатка, возможно несколько раз. Чем хуже поставить брейкпоинт и посмотреть на реальные значения индексов по сравнению с исправлением «на глазок» и последующим перепрогоном теста? Тем более, если код свежий или вообще писался прямо только что, теста по нему может не быть от слова «совсем».
Если есть бага — то код писался ну точно не вот прям счас, да и в целом в такой ситуации лучше покрыть тестом (иначе как будете валидировать исправление?). Лень — она как раз "заюзать дебаг, нафиг тесты". А дебаг, действительно нужен, когда ситуация непонятная.
Кстати, когда я писал основу для браузерного движка, у меня получались кошмарно огромные функции. Главной проблемой разбиения на более мелкие методы было то, что в рамках метода у меня доступен целый набор локальных переменных, которые в случае разбиения на несколько вспомогательных методов нужно как-то в них передавать (а их много, и это приведёт к совершенно кошмарным сигнатурам). Делать эти значения полями класса — как-то совсем моветон. Как бы Вы отрефакторили такой длинный метод (речь идёт о Java)?
Ну так я же не вижу реальный пример. Возможные пути:
- вынести локальные переменные в какой-либо класс и уже их передавать параметром,
- выделить относительно атомарные действия (даже если найдётся 4 атомарных действия в 2-3 строки длиной, то мы из 25 строк метода получим 17-21 строку, что уже много лучше
- выбросить старый код и написать новый с новой архитектурой, в которой найти способ изначально ослабить взаимозависимость элементов.
И да для web-движка это может быть малоэффективным, посколько там бывает много сопряжённых действий.
Имхо одинаково маловероятно. Ну да, здесь у нас переменная в заголовке цикла указана, а там мы используем какую-то свою. Но я так и не понял, как вообще её в принципе можно перепутать.
почитайте тут на хабре статейки про статический анализ (особенно выделяется рекламными постами одна компания-производитель дорогово пром. стат. анализатора, не помню сейчас её название — регулярно пишут… и проверка "похоже на опечатку" у них достаточно часто стреляет).
Когда реально плевать — и обычный for не навредит, т.к. один поток. Когда не плевать — согласен насчёт того, что быстрее и легче продиагностировать.
И в который раз я вас отправляю по этому вопросу к стилю кодирования и к вопросу, что так просто легче не наделать случайных ошибок.
Вообще пример с зарплатами, как по мне, тоже сильно надуманный. В Вашем примере у нас поменялся список сотрудников, потому что оттуда кого-то удалили, общая длина коллекции стала меньше, и в этот же самый момент тот узел или модуль системы, куда мы передаём данные, уже имеет актуальную копию новых данных. Это не всегда так, особенно если данные отправляются на другую машину по сети. А если мы отправляем их просто другому потоку или другому приложению на той же машине…
Ну да, пример надуманный — для наглядности. И работать он будет и на локальной машине. Только на совсем уж древним компьютерах с одним вычислительным потоком у них почти нет шансов.
В любом случае, надо каким-то образом обернуть получение массива сотрудников и отправку данных по зарплатам в транзакцию, чтобы гарантировать, что между получением списка и отправкой списка сумм ничего не изменилось. И в этом плане, как по мне, надо использовать или изначально иммутабельную коллекцию (что наверное правильнее), или делать копию списка и работать уже с ней (эту копию другие потоки никак не затронут). С другой стороны, тут может возникнуть уже обратная проблема: мы отправляем данные по старому списку, хотя на самом деле он поменялся; об этом знает получатель данных, но не знает наш код. По-хорошему тут надо вводить версионирование списка фамилий и при отправке данных прикреплять номер версии, по которой мы делали обход, я бы решил проблему так.
А тут уже вопрос к "бизнесу" — какое решение должно быть. Более того, в нормальной ситуации описаный пример будет легко поправить заиспользовав транзакции БД и правильно спроектировав процедуру удаления работника. Но если всё держать "в памяти" — то там тот ещё простор решений, от вашего версионирования до CopyOnWriteArrayList-а и велосипедах на каких-нибудь ReentrantLock.
но вот методов гарантирующих вызов некоторых мелких кусков кода в параллель я не припоминаю
Это и не нужно. Можно просто гонять всё в цикле много-много раз, и рано или поздно такая ситуация всплывёт сама :)
Если есть бага — то код писался ну точно не вот прям счас
С чего Вы взяли? У меня такое сплошь и рядом — написал код только что, а он творит какую-то дичь во время запуска :) И я не против написания теста в дальнейшем, но дебаг в данном случае правда нагляднее и быстрее.
выделяется рекламными постами одна компания-производитель дорогово пром. стат. анализатора, не помню сейчас её название — регулярно пишут… и проверка «похоже на опечатку» у них достаточно часто стреляет
Читал пару раз их статьи, знаю, про какой Вы продукт говорите :) Ну значит программисты в самом деле часто ошибаются.
до CopyOnWriteArrayList-а
Вот как раз как он нам поможет избежать отправку старой версии данных — я не очень понял :) Но наверное, что-то сделать на его основе можно.
И да для web-движка это может быть малоэффективным, посколько там бывает много сопряжённых действий.
Может и так. А может, я просто недостаточно думал над этим вопросом. Могу скинуть Вам в личку код функции отрисовки тени для прямоугольного блока, если интересно. Там вообще какая-то жесть на 100 строк почти.
Это и не нужно. Можно просто гонять всё в цикле много-много раз, и рано или поздно такая ситуация всплывёт сама :)
Если бы! Некоторые вещи даже в проде до существенного повышения нагрузки не сразу всплывают… Тот же классический Java-вский DateTimeFormatter (или как он там называется… запамятовал) — ведь два года в проде провисел, прежде чем начал изредка хрень вносить в данные!
С чего Вы взяли? У меня такое сплошь и рядом — написал код только что, а он творит какую-то дичь во время запуска :) И я не против написания теста в дальнейшем, но дебаг в данном случае правда нагляднее и быстрее.
С того, что бага — это ужепосле перехода формального модульного тестирования к полноценному функциональному. Если речь не про пет/учебный проект, то обычно этим занимается другой человек, а ты уже потерял контекст. А если вы говорите про кривой алгоритм во время модульного тестирования — то это не бага, а ошибка алгоритма… Чисто формальные различия.
Вот как раз как он нам поможет избежать отправку старой версии данных — я не очень понял :) Но наверное, что-то сделать на его основе можно.
Так я же сказал — плясать-то надо не от собственного понимания "как надо", а от требований бизнеса. Вспоминая пример — может бизнесу проще отдать последнюю зарплату дорогому сотруднику частично автоматически (а совсем без оплаты там ведь и не будет, если вдуматься в ситуацию, только вручную она там уже должна в такой ситуации обрабатываться), чем если мы потратим лишнюю день-неделю-месяц на разработку (а такое — сплошь и рядом в промышленной разработке).
Может и так. А может, я просто недостаточно думал над этим вопросом. Могу скинуть Вам в личку код функции отрисовки тени для прямоугольного блока, если интересно. Там вообще какая-то жесть на 100 строк почти.
лучше на гитхабе заведите открытый репо и туда учебные проекты складывайте (в том числе и сами, в ретроспективе, сможете оценить изменения в качестве и стиле своего кодирования со временем).
Тот же классический Java-вский DateTimeFormatter (или как он там называется…
Называется он SimpleDateFormat, и он действительно не безопасен — потому что на самом деле™ форматирует не java.util.Date
, а вовсе даже java.util.Calendar
— и оный является полем класса, и на него бывает гонка, о чём есть заметки во всех javadoc'ах по этому семейству классов.
А вот DateTimeFormatter добавлен в java 8, и он потокобезопасный, и это важно — а то так будут ходить слухи, что в "Java нельзя даже нормально время отформатировать в многопоточном приложении". Правда, им уже нельзя форматировать ни java.util.Date
, ни java.util.Calendar
, ну да туда им и дорога.
и на него бывает гонкаА можно попроще, для новичка — как эта гонка выглядит в псевдокоде и при чём тут то, что кто-то является чьим-то полем?
class SimpleDateFormat {
private Calendar calendar = Calendar.getInstance();
public String format(Date theDate) {
calendar.setTime(theDate);
return format(calendar);
}
private String format(Calendar calendar) {
...
}
}
/**....*/
class Main {
static SimpleDateFormat formatter =
SimlpeDateFormat`yyyy-MM-dd`;
public static int main(String[] args) {
ExecutorService exc =
Executors.newFixedThreadPool(10);
IntStream.range(0, 1000).forEach(val -> {
exc.execute(() -> {
Date theDate = Date.from(
Instant.now().plus(val, DAYS)
);
System.out.println(String.format(
"Days in future %d, date %s",
val,
formatter.format(theDate);
));
});
});
}
exc.shutdown();
exc.awaitTermination(
Long.MAX_VALUE, TimeUnit.MILLISECONDS);
}
Мы собираемся печатать дату, которая отличается на
val
дней от сегодня. Но из-за вызова setTime
внутри format(Date)
на одном и том же объекте может получиться (а может и не получиться — именно поэтому баг такой гадкий) так, что напечатана будет какая-нибудь другая дата — например, если между вызовом setTime
и format(Calendar)
в одном треде произойдёт вызов setTime
в другом треде, и это значение попадёт в кэш и будет загружено в первый тред. Тогда если сегодня — `2019-04-01`
, мы можем увидеть в консоли что-то типа "Days in future 3, date 2019-04-26"
.То есть я правильно понял, что если у нас однопоточное приложение (это всё-таки наиболее частый случай), то проблем с этим классом нет?
И ещё — можно ли как-то решить эту проблему путём блокировок? Например, поставить где-то блоки synchronized? Я понимаю, что класс встроенный, и наследоваться от него — наверное идея не очень. Можно ли решить проблему, меняя только вызывающий код?
И с кэшем я не очень понял. Верно ли я понимаю, что экземпляр Calendar.getInstance() — один на все потоки? Тогда вообще всё тривиально конечно.
private Calendar calendar — это вроде бы ссылка на объект. Объект никуда не копируется и лежит в общей памяти. Один поток его изменил — объект изменился для всех потоков. Или объекты могут копироваться в кэш-память процессора как и скалярные переменные?
если у нас однопоточное приложение (это всё-таки наиболее частый случай), то проблем с этим классом нет?
Да. Если компилятор может доказать, что на доступ к полю не будет конкуренции, то он может и synchronized-блоки убрать. Ну, или облегчить.
Я понимаю, что класс встроенный, и наследоваться от него — наверное идея не очень
Нет проблемы наследоваться от любого не-final типа в JDK, если соблюдать LSP. Но если идея здесь — сделать собственный тип с мониторами на внутренний Calendar — думаю, гарантий не прибавится, т.к. нужно видеть полный набор операций, который конкретный поток делает с formatter
'ом.
Конкретно эта именно проблема может — и должна, раз уж разработчики JDK не решают сами — быть решена на стороне вызывающего кода, например, синхронизацией на сам formatter — тогда будут гарантии, что каждый поток владеет состоянием formatter'а безраздельно, но при этом и программа становится, фактически, однопоточной:
synchronized(formatter) {
System.out.println(String.format(
"Days in future %d, date %s",
val,
formatter.format(theDate);
));
}
Верно ли я понимаю, что экземпляр Calendar.getInstance() — один на все потоки?
Да, верно. Но это не было бы проблемой если изначально разработчики не использовали бы этот экземпляр для хранения даты в процессе форматирования, а хотя бы клонировали его при начале форматирования/парсинга. К сожалению, имеем то, что имеем.
Или объекты могут копироваться в кэш-память процессора как и скалярные переменные?
Честно говоря, не уверен. Насколько я понимаю, так копироваться в кеш может ссылка на объект, и при этом не даётся никаких гарантий касаемо happens-before если ссылки/поля не выполняются в контексте какого-нибудь монитора, но я могу сильно ошибаться.
Зато вот нашёл статью про модель памяти, может, там есть ответ: https://habr.com/ru/company/golovachcourses/blog/221133/
думаю, гарантий не прибавится
Да, верно. Но это не было бы проблемой если изначально разработчики не использовали бы этот экземпляр для хранения даты в процессе форматирования, а хотя бы клонировали его при начале форматирования/парсинга. К сожалению, имеем то, что имеем.Так вот этот метод при наследовании можно было бы и переопределить.
думаю, гарантий не прибавится, т.к. нужно видеть полный набор операций, который конкретный поток делает с formatter'омЗачем? Вы ведь привели проблемный участок кода самого класса SimpleDateFormat. Или речь про то, что могут быть и другие, и все их искать долго?
но при этом и программа становится, фактически, однопоточнойНу есть ещё вариант создавать по инстансу Calendar на каждый поток (но для этого опять же нужно наследоваться и переопределять логику). Возможно, так работать будет быстрее, но и памяти жрать в разы больше :)
Нет проблемы наследоваться от любого не-final типа в JDK, если соблюдать LSP.Что такое LSP?
Я один раз попытался сделать наследование какого-то класса, потому что стояла очень сложная задача, которую иначе нормально было не решить (что-то связанное с Java2D, вроде нужна была своя реализация скруглённого прямоугольника, потому что дефолтная имеет серьёзные косяки).
Это был настоящий ад — в первую очередь потому, что значительная часть методов, которые использовались в переопределяемых методах, имели модификатор private. И при этом мне нужно было их вызывать. Я не нашёл способа лучше, как копипастить код существующей реализации…
А в другой раз (когда я пытался экспериментировать с «низкоуровневыми» методами вывода строк, и пытался наследовать jLabel), было ещё того хуже: внутри наследуемого класса повсеместно использовался вспомогательный класс, который имел «пакетный», а не публичный доступ. И по понятным причинам я его подключить к себе не мог.
Так вот этот метод при наследовании можно было бы и переопределить.
К сожалению, нет, нельзя — мякотка проблемы находится не там, где происходит setTime
, а внутри метода format(Calendar)
. И состоит она в том, что нет никакого такого метода — есть метод, работающий с полем Calendar, загружая его значение из ссылки this.calendar
. Даже если бы мы что-то переопределили и клонировали бы, нам пришлось клонированный экземпляр вписать в поле this.calendar
— нас это не спасёт от гонки. Тут может помочь разве что сделать сам публичный внешний метод format
synchronized — но решение неполное, т.к. остаются все прочие способы получить доступ к this.calendar
, которые уже просто так синхронизировать не получится, бо мы не имеем над ними контроля. Решение поможет в моём псевдокоде, но создаст только иллюзию безопасности в общем случае.
Вы ведь привели проблемный участок кода самого класса SimpleDateFormat
Я привёл только самый простой пример. Есть ещё варианты, когда треды вызывают formatter::setTimeZone
или formatter::setLenient
перед вызовом formatter::format
, и там тоже будут такие же по сути проблемы.
LSP
… Это был настоящий ад...
Этот опыт, что вы описываете, не о том, что сложно переопределить некий тип из JDK — он говорит о том, что сложно переиспользовать private-код из JDK. Здесь нет явной проблемы — в Java действительно не получится переопределить части, для которых не предусмотрена явно такая возможность, и это относится к вообще любому коду на Java.
Однако, ничто вам, в принципе, не помешает сделать
public class MyImmutableList<E>
extends ArrayList<E> {
@Override
public void set(int index, E element) {
if (!Objects.equals(element, get(index))) {
throw new UnsupportedOperationException();
}
}
}
И как-то так получить список, в который можно добавить элемент, но нельзя заменить элемент, при этом сам список можно будет передавать почти в любой код, и вести он себя будет в соответствии с контрактами ArrayList(+ ваша надстройка) — можно итерироваться, добавлять/удалять элементы, брать размер списка, но попытка заменить элемент или отсортировать — приведут к ошибке.
есть метод, работающий с полем Calendar, загружая его значение из ссылки this.calendarЭто в каком именно методе происходит? Вот его логику можно было бы переопределить, чтобы он не с полем работал.
И как-то так получить список, в который можно добавить элемент, но нельзя заменить элемент, при этом сам список можно будет передавать почти в любой код, и вести он себя будет в соответствии с контрактами ArrayList(+ ваша надстройка) — можно итерироваться, добавлять/удалять элементы, брать размер списка, но попытка заменить элемент или отсортировать — приведут к ошибке.Красивый пример. Но очень простой) Здесь ведь достаточно переопределения одного публичного метода.
Это в каком именно методе происходит?
Да вот в этом. Я вам точно говорю — снаружи синхронизировать будет куда проще.
Красивый пример. Но очень простой
Ну у меня не настолько хорошая фантазия или богатый опыт хаков JDK, чтобы я сходу могу придумывать сложные примеры. Впрочем и цели такой не было — показать что-то сложное. Основная идея как раз в том, что расширять типы из JDK — не сложно. По крайней мере, для доброй части типов.
Если речь не про пет/учебный проект, то обычно этим занимается другой человек, а ты уже потерял контекст. А если вы говорите про кривой алгоритм во время модульного тестирования — то это не бага, а ошибка алгоритма… Чисто формальные различия.Да я в курсе про тестировщиков. Но всё равно не очень понимаю. Если в алгоритме нет формальной ошибки — откуда взяться багу? Плохая состыковка API двух разных модулей? Но такое тоже обычно на этапе компиляции всплывает всегда. Если только мы не гоняем что-то в сериализованном виде (например, по сети), и ошибка не закрадётся вот в эти самые данные перед их отправкой другому модулю (т.е. неверный формат исходящих данных).
лучше на гитхабе заведите открытый репоДля TinyBrowser он есть. Могу дать ссылку
Вы почитайте про самые известные фейлы, некоторые из которых, например унесли реальные жизни, а потом говорите "откуда взяться багу". Как говорится — человеку свойственно ошибаться… а программы пишет человек. Тут и расхождение по бизнеслогике возможны и опечатки и неверно подобранный алгоритм и ещё вагон и маленькая тележка иных багов.
А можно попроще, для новичка — как эта гонка выглядит в псевдокоде и при чём тут то, что кто-то является чьим-то полем?
Опишу в виде примера, в SimpleDateFormat проблема похожая, но не так явно выглядящая. Есть класс A, у него есть поле, например int[] a. А внутри метод вида:
this.a = a;
StringBuilder sb = new StringBuilder();
for (int i =0 ; i < this.a.length ; i++) {
this.a[i] *= 2;
sb.append(this.a[i]);
}
return sb.toString();
}
А теперь в параллельных потоках вызовем этот метод, в одном с массивом new int[] {2, 3, 4}, в другом с массивом new int[] {5, -2, 10}… и, допустим, случится так, что второй вызов произойдёт когда для первого пройдёт i=0 и перед i=1 (ну по какой-то причине нитка притормозила, например), получится что первый поток получит строку 4-420 (вместо ожидаемой 468), а второй поток получит строку 10-420 (как и ожидалось). Вот состояние, когда несколько потоков конкурируют за один и тот же ресурс и называется гонкой.
Там риски по безопасности сильно растут (особенно если это что-то антивирусное или связанное с передачей данных в облако). В своё время Dropbox вроде именно поэтому поддержку XP прекратил. А насчёт цены разработки — я бы всё же не согласился, не факт, что там всё становится прямо уж в разы сложнее. Что-то наоборот под старые ОС делать проще даже…
А я говорю, что оно становится сильно дороже? Нет, это просто ещё одна слабосовместимая с прочими платформа, и чем больше срок прекращения поддержки, тем более она отличается от родственых, вплоть до усилий сравнимых с совсем непохожими платформами (например линукс). А каждая такая платформа требуется отдельной поддержки (а значит и вкладываемых средств)
Ну не знаю. Я вот уже года 3 планирую прочитать книжку про программирование под Android. Как только научусь что-то более-менее писать — Android 2.3 точно буду поддерживать. Тем более у самого он стоит.
Ну вот вы из соображений "сам пользуюсь" "планируете" учитывать 2.3, но даже вы не планируете 2.1 (а то и 1.х), а будь у вас какой-нибудь 3.х/4.х/5.х — вы ба на той версии и остановились.
А почему? Если кому-то так нужны стримы и лямбды (хотя имхо это нужно редко) — ну есть 8-ая в конце концов. Но в основном и 7-ой хватает за глаза и за уши (ладно, с 6-кой я погорячился, она не умеет неблокирующий ввод-вывод толком, и менее гибко работает, например, с атрибутами файлов). В 7-ой версии с этим всё на порядок лучше и приятнее.
Ну вот и в каждой версии (точнее теперь — в каждой LTS версии) есть какие-то вкусняшки, ради которых стоит попробовать, например на 9ку переходить может показаться странным, а на 11, которая включает в себя 9ку — вполне себе, а там, например, собственая модульность, возможность формирования обрезаных пакетов установки (чтобы не тащить с собой всю jdk, если хочется это делать отдельной инсталяцией и не париться по поводу наличия той самой jdk на целевой машине), ещё там в промежутке где-то появился новый сборщик мусора и целая куча подкапотных изменений.
Так оно только в системном L&F — и естественно, работает только на винде. Не вижу причин, почему использовать Windows Forms или WPF можно (при этом разработчик приложения ничего не отчисляет Microsoft за возможность выводить их контролы на экране), а Swing — нет. Если JVM дёргает обычный Windows API в этом случае, то никакие лицензии не нарушены, вроде.
Фишка в том, что это работает на винде. В Linux/MacOs системный будет действительно системным, а не виндовым, соответственно ClearType-а там не будет, если его не поддержит сама система. L&F "а-ля виндовс" с собой технологию не потащит (и даже в винде не факт, что заработает).
transcengopher так и SimpleDateFormat можно пользоваться — другое дело, что нужно своими руками строить потокобезопасность.
и опечатки и неверно подобранный алгоритмТак это всплывёт на юнит-тестах обязательно.
Вот состояние, когда несколько потоков конкурируют за один и тот же ресурс и называется гонкой.Спасибо, понятно. Ну тут на мой взгляд в момент вызова в начале метода надо копию массива делать, а не работать с тем, что есть. Или как-то сделать так, чтобы для каждого потока был свой экземпляр поля (кстати, так вообще можно?).
Фишка в том, что это работает на винде. В Linux/MacOs системный будет действительно системным, а не виндовым, соответственно ClearType-а там не будет, если его не поддержит сама система. L&F «а-ля виндовс» с собой технологию не потащит (и даже в винде не факт, что заработает).А где я предлагал тащить виндовый ClearType повсюду?)) Я понимаю, что главная фишка Java — кроссплатформенность. Но конкретно я хотел именно под Windows иметь браузер с чётким выводом текста. Да ещё и под конкретную её версию (хотя тестировал код и на более новых, и с разным DPI в настройках) :)
По остальному согласен полностью.
Да, если вдруг захотите улучшить тот проект (там ещё до финиша ох как далеко) — то буду очень рад пуллреквестам :)
github.com/popov654/tinybrowser
Так это всплывёт на юнит-тестах обязательно.
при 100% покрытии, спровоцированном TDD — да, проблема опечаток будет решена. На текущий момент TDD распространена достаточно плохо. Проблема неверного алгоритма — в лучшем случае частично решена будет. Однако в части случаев получится так, что на тестовом наборе всё ок, а в проде — ошибки.
Спасибо, понятно. Ну тут на мой взгляд в момент вызова в начале метода надо копию массива делать, а не работать с тем, что есть. Или как-то сделать так, чтобы для каждого потока был свой экземпляр поля (кстати, так вообще можно?).
это была упрощёнyая иллюстрация того, что происходит в SimpleDateFormat. Как с этим борются? Ну три основных способа: а) каждый раз создаём новый SimpleDateFormat (в целом не очень оптимальное решение, но этот класс имеет не сильно большие накладные расходы по памяти… хотя вот по времени исполнения получается уже хуже), б) синхронизация вызовов объекта (и на этом участке получается однопоточное приложение) и в) упаковываем в ThreadLocal — этот объект позволяет создавать инстанс объекта для каждого потока индивидуально (тоже не без минусов — во-первых всё-таки объектов будет больше одного, во-вторых при неправильном обращении с ThreadLocal можно получить неплохую такую утечку памяти). Ну а в приведённом мной примере — да, действительно нужно было просто копию массива делать… или ещё лучше решение — просто не сохранять в переменные инстанса, а передавать по всей цепочки вызовов параметром… но иногда это сложно сделать архитектурно — если требуется много действий… но в такой ситуации надо всю архитектуру переделывать на самом деле.
Теперь есть ещё четвёртое решение — пользоваться чем-то более приятно написанным, чем старые DateTime-части JDK. Например, потокобезопасным форматтером:
static DateTimeFormatter formatter = ...?profit
public static String formatMyTime(Date date) {
ZonedDateTime zdt = date.toInstant()
.atZone(formatter.getZone());
return formatter.format(zdt);
}
В отсутствие Java8 можно "перебиваться" Joda. Если хочется совсем упороться — то взять Time4J.
До принятия йоды в JDK это было мало для кого вариант — всё же одно дело нативные сущности, другое — привнесённые. Удобство использования просто разное. Да и в йоде по удобству АПИ есть сложные моменты. Радует только то, что вопрос именно к удобству. Т.е. если говорить java 7 (и более ранних) — для них существуют по большей части предложенные мной решения. Да и в целом ваше решение — оно уже не решение проблемы потокобезопасного использования заданного класса — оно решение использовать что-то вместо него.
У меня, честно говоря, никогда не стоит прямо задачи "используй экземпляр этого класса потокобезопасно" (разве что в каком-нибудь тесте) — как правило, требование более высокое — "у нас неправильно форматируется время в час пик, почини".
Кстати, для именно более высоко сформулированной задачи в Java7 Joda тоже будет решением, потому что умеет вот так: DateTimeFormatter::print(long millisecond-instant)
— а значит без проблем работает где-нибудь в виде метода-утилиты, и не будет заставлять вас отказываться от использования Calendar'ов в API.
в йоде по удобству АПИ есть сложные моменты
Расскажите про это подробнее.
Ну как простейший пример — попробуйте без дополнительных телодвижений распарсить 2012-11-30 в LocalDateTime или OffsetDateTime. Вылетит исключение, что он не может создать нужные типы, потому что нет таких-то полей (вроде наличие часа в строке хватило бы, не помню уже). Это можно обойти донастроив парсер, чтобы он вставлял 0 если часы-минуты-секунды отсутствуют.
нельзя распарсить 2012-11-30 в LocalDateTime
Логично — ведь в строке не указано время, и не бывает "времени по умолчанию". У вас там дата — значит, работать надо с датой, LocalDate. Это, к слову, намного удобнее чем работать с "моментом, указывающим на начало дня, в базе он хранится как UTC, а клиенту надо будет показать тоже начало дня, но в его часовом поясе, смотри не перепутай".
То же самое с OffsetDateTime — какой часовой пояс вы предлагаете считать "поясом по умолчанию"? Если пояс сервера — юзайте LocalDateTime сразу. Статически задать пояс нельзя пока "Europe/Moscow" означает два или более разных сдвига в зависимости от хотелок политиков.
Я наоборот назову это более хорошим дизайном API — вы сразу знаете, что вы дали на вход и что вы получите в качестве результата. Не как раньше, где в принципе не было понятия каледнарной даты, нельзя было никак выразить требование "каждые два дня в 19:16", а Calendar.getInstance()
мог вернуть вам буддийский календарь, и ничего вы с этим просто так не поделаете — сколько кода вы видели, который пишет new GregorianCalendar()
?
А ваша проблема действительно решается "донастройкой парсера", и это делается один раз, в утилите:
Либо
var staticFormatter = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_DATE)
.appendOptional(DateTimeFormatter.ISO_TIME)
.parseDefaulting(ChronoField.NANO_OF_DAY, 0)
.toFormater();
staticFormatter.parse("2012-11-30", LocalDateTime::from);
new DateTimeFormatterBuilder()
.append(staticFormatter)
.parseDefaulting(ChronoField.OFFSET_SECONDS,
//помните, что offset_seconds зависит от "сейчас"?
ZoneId.systemDefault()
.getRules()
.getOffset(Instant.now())
.get(ChronoField.OFFSET_SECONDS)
).parse("2012-11-30", OffsetDateTime::from);
Либо, раз уж так охота не знать, пользуетесь вы форматом для даты, момента или локального момента:
DateTimeFormatter.ofPattern(externalPattern)
.parseBest(dateString,
OffsetDateTime::from,
parsed -> LocalDateTime.from(parsed)
.atZone(ZoneId.systemDefault())
.toOffsetDateTime(),
parsed -> LocalDate.from(parsed)
.atStartOfDay(ZoneId.systemDefault())
.toOffsetDateTime()
);
Статически задать пояс нельзя пока «Europe/Moscow» означает два или более разных сдвига в зависимости от хотелок политиков.При чём тут хотелки политиков? В конкретный момент времени сдвиг для Москвы всегда однозначен, и для временных зон всё это хранится (вся история изменений). То есть для каждой временной метки в UTC можно однозначно посчитать её локальное представление. В чём здесь проблема-то?
То, что я вижу в коде выше, выглядит громоздко и страшно, как по мне…
То есть для каждой временной метки в UTC можно однозначно посчитать её локальное представление
Вот именно, что сдвиг можно элементарно узнать когда вам уже известен момент в UTC и имя зоны. В нашем случае же задача стоит именно в том, чтобы узнать, какой момент UTC закодирован в строке.
выглядит громоздко и страшно, как по мне…
Код выглядит громоздко от того, что изначально постановка задачи предполагает, что кто-то должен сделать много допущений. Как вы (должно быть) знаете, OffsetDateTime
— это как раз момент времени, специфическая его форма, когда часовой пояс представлен неким смещением относительно UTC. При этом, в строке "2012-11-30"
содержится только дата. То есть, чтобы составить из этой даты момент времени, нам не хватает "всего-то" остатка совы — времени и смещения относительно UTC. Вы кому предлагаете эти данные "родить" — разработчикам стандартной библиотеки, которые о специфике вашей программы ничего не знают? Нет, согласно дизайну java.time
допущений следует делать как можно меньше (в идеале — не делать вообще), и все необходимые данные нужно предоставить разработчику, так как это он лучше должен знать, какие допущения можно делать, а каких — нельзя. Вот второй блок кода как раз этим и занимается, кстати — говорит, что делать парсеру если данных недостаточно, а OffsetDateTime
всё-таки нужен. Причём, вот это всё вообще можно вынести в соответствующую утилиту, назвать метод getOffsetDateTimeFromAnyString
, и там в комментариях объяснить всю степень редисочности вашей внешней системы, которая меняет формат кодировки дат непредсказуемым образом.
С другой стороны, если вам всегда приходит yyyy-MM-dd
, и вам, опять же, всегда нужен оттуда OffsetDateTime на момент начала дня в Мадриде, нет ничего проще:
private static
DateTimeFormatter frmt = DateTimeFormatter
.ofPattern("yyyy-MM-dd");
public static
OffsetDateTime parse(String input) {
return LocalDate.parse(input, frmt)
.atStartOfDay(ZoneId.of("Europe/Madrid"));
.toOffsetDateTime();
Нет, именно всякоразличных умолчаний там практически нет. Пожалуй, кроме возможности получить
XxxDateTime.now()
,
которое, по сути, XxxDateTime.now(Clock.system(ZoneId.systemDefault())
(время по системным часам в часовом поясе машины).
Нет, те поймите неправильно, из той исходной строки, вы сможете без всяких проблем распарсить LocalDate
. Но вот на случай с недостающими данными, когда нужно больше полей, чем год, месяц, день и epoch-day — увы.
Если вы из просто даты всегда хотите получать момент в UTC (не Лондоне!) на начало суток, то самое простое что я могу придумать — это сделать один раз соответстующий парсер со значениями по умолчанию. Как-то так
new DateTimeFormatterBuilder()
// или append(DateTimeFormatter.ISO_LOCAL_DATE)
.appendPattern("yyyy-MM-dd")
.parseDefaulting(ChronoField.NANO_OF_DAY, 0)
.withZone(ZoneOffset.UTC)
.build();
Это достаточно делать один раз и сохранить в статическое поле — новые парсеры, в отличие от старого SimpleDateFormat
потокобезопасные. Но вот "умолчаний" в парсерах нет. Они даже часовой пояс машины не используют — потому что если парсер дёргать из нескольких потоков и вдруг кому-то придёт в голову светлая идея поменять TimeZone.default
… я думаю, вы понимаете.
Не решена, а уменьшится количество инцидентов. Банально одна и та же опечатка может быть допущена и в тесте, в и коде. Причём просто возвести в квадрат вероятность опечатки нельзя — нередко это связанные события, события причина которых в особенностях конкретного человека, клавиатуры или IDE.
почему закопали Vector
Никто его не закопал, многие и сегодня прекрасно его используют. Особенно, если синхронизация действительно нужна.
Нам в вузе во всяком случае говорили, чтобы мы просто смотрели на то, когда его стоит использовать, а когда нет, и чтобы понимали отличия между Vector и ArrayList, вроде.
А ссылкой на более правильные и мягкие методы синхронизации не поделитесь? Я бы почитал.
Создать один итератор (константная, притом мизерная, память и практически константное и опять же мизерное время)
Если коллекция маленькая, то расходы на создание итератора сравнимы с расходами на итерацию по коллекции, или даже превышают их. Тем более, что итератор создаёт нагрузку на сборщик мусора. Но в 99% этим можно пренебречь, тут я с вами согласен.
или превратить линейное время итерации в квадратичное,
А каким образом время итерации превратится в квадратичное? Если мы передадим туда не ArrayList, а что-то другое? Не то чтобы это совсем невероятно, но само наличие коллекции типа LinkedList, передаваемой туда, где ждут List — это уже очень подозрительно и обычно отсекается на уровне пул реквеста.
Повторюсь, что это [создание итератора для foreach] небольшие константные расходы
Да, совершенно верное. Но, если коллекция — очень маленький ArrayList то использование итератора легко может замедлить обход коллекции раза в 2 (пишу безответственно, не измерял), а потом ещё создаст нагрузку на сборщик мусора. Константные расходы это почти всегда хорошо, за исключением тех случаев, когда величина константы велика.
LinkedList редко, но используется.
Я не помню, когда видел последний раз и не заменил на ArrayList.
А еще не все коллекции бывают списками.
Ну как я понял мы тут говорим только об интерфейсе List.
Так что совершенно непонятно, зачем даже обсуждать использование заведомо худшего способа итерации.
Чтобы прояснить кейсы, когда он не заведомо лучший.
Кстати, если подходить к вопросу педантично, то в случае с итераторами есть ещё вызов метода next у итератора, который пусть немного, но медленнее, чем инкремент i. ))
Как говорил Кнут, преждевременная оптимизация хуже преждевременной эякуляции.
Вы цитируйте, не стесняйтесь )). А лучше, я процитирую.
In established engineering disciplines a 12% improvement, easily obtained, is never considered marginal; and I believe the same viewpoint should prevail in software engineering.
На русский переводится примерно так:
В сложивщейся инженерной дисциплине улучшение на 12% легко получаемое никогда не считают незначительным; и я верю, что та же самая точка зрения должна господствовать в разработке программного обеспечения.
А теперь насчёт преждевременной оптимизации. У меня сложилось впечатление, что вы думаете, что кто-то прямо в процессе написания кода использует циклы вместо итераторов. Такое, конечно, бывает, но редко.
Обычно код запускают, профилируют, находят узкие места и, если одним из таких узких мест оказывается итерация по коллекции — с помощью IDE заменяют там foreach на стандартный for. А потом проверяют помогло, или нет.
for key in obj
(аналог forEach в Java) мы в переменную key
получаем ключ. В случае объекта мы получим все поля (включая поля из цепочки прототипов, что может быть для нас лишним, поэтому в теле цикла нужно проверять, что у нас за поле), а в случае массива — там будут целочисленные индексы. И хотя в JS массив — это тоже объект, просто особого класса, всё же использование for… in влечёт некоторые дополнительные проверки. Как бы то ни было, на реальных бенчмарках, которые делали энтузиасты в разных браузерах в 2010-2011 году, производительность при использовании for… in проседала более чем вдвое. Собственно, тот же случай, что с использованием Vector, от использования которого вы меня здесь дружно отговариваете.Да, Java — совсем другой язык, и там совсем другая картина. И best practices другие. Но просто у меня есть некоторые привычки (писать циклы именно так), и я пишу так абсолютно в любом языке, потому что единообразие — это удобно с точки зрения скорости кодинга и быстроты «переключения» на другой язык.
Как бек, с навыками фронта (не дотягиваюя до звания фуллстека) могу вам с уверенностью сказать: в каждом языке лучше применять best practices конкретно этого языка.
И for… in в js это совсем не то же самое, что foreach в java.
А я не знаю, почему его не сделали. Множествами я тоже не пользуюсь. Как по мне, это очень неудобная коллекция — например хотя бы потому, что для её обхода необходим итератор (то есть нельзя проитерироваться по ней в цикле for, что, я настаиваю, является самым интуитивным подходом). И не сделав метод get (хотя да, он не имеет смысла, потому что у элементов нет уникальных ключей, а если они будут, то это будет уже хэш-таблица), разработчики JDK серьёзно подпортили универсальность интерфейса, т.е. независимость реализации от типа используемой фактической коллекции.
Всё разработчики JDK очень грамотно посчитали — Set вполне имеет своё уникальное предназначение и лишние методы (а-ля get) ему не нужны. Ну а вы из-за своих привычек просто отказываетесь от полноценного использования языка.
Hashtable/Hashmap
Да сколько можно! Во-первых не используйте слово Hashtable в приличном обществе, во-вторых названия классов — HashTable и HashMap. Меня от каждого такого вашего комментария как демона от святой воды трясёт ))
Извините за глупый вопрос, и где же лучше всего использовать Set? Назовите реальный, не придуманный пример, плиз
Везде, где вы не хотите писать дополнительные комментарии, что Map используется не как Map, а как Set. То есть любой случай, когда вам надо проверить есть ли объект у чего-то, а больше ничего не надо. Классический пример — принадлежность пользователя к какой-нибудь группе.
во-вторых названия классов — HashTable и HashMapИзвините, случайная опечатка. И кстати, про Hashtable вы совершенно не правы. Именно так, как я написал. Вот фрагмент кода из моего серверного модуля к GraphBuilder:
private Socket sock;
private static boolean guiEnabled = false;
private static int max_index = 0;
private static int last = -1;
private static String sessionName = "";
private static String sessionKey = "0";
private static Date writeTime = new Date();
private static String[] newGraph;
private static Vector<String[]> dataStorage =
new Vector<String[]>();
private static Hashtable<String, Integer> names =
new Hashtable<String, Integer>();
Везде, где вы не хотите писать дополнительные комментарии, что Map используется не как Map, а как Set. То есть любой случай, когда вам надо проверить есть ли объект у чего-то, а больше ничего не надо. Классический пример — принадлежность пользователя к какой-нибудь группе.Не убедили. Смотрите, у нас есть некое хранилище, где объекты — это пользователи (вы только что предложили, да и я вчера об этом думал). Если мы выберем Set — то мы не сможем быстро получить конкретного пользователя по ключу. А если там подробные данные о нём, или например хранится его последний чат (если мы анонимный чат пишем)? Или если там в одном из полей хранится ID этого самого чата? Или список ID чатов? В итоге нам придётся обходить всё множество, и сложность будет линейной. Имхо, хэш-таблица решила бы проблему лучше.
Не убедили. Смотрите, у нас есть некое хранилище, где объекты — это пользователи (вы только что предложили, да и я вчера об этом думал).
Я предложил не это. Я предложил в одном из полей пользователя хранить в сете группы, к которым принадлежит пользователь. Не для того, чтобы искать пользователя по группе, а для того, чтобы проверять, принадлежит уже найденный пользователь к группе, или нет.
Но наверное, использовать стандартные коллекции — правильнее.
Я вам по большому секрету скажу — HashSet под капотом — HashMap, ага.
Почему HashSet, а не HashMap? А зачем мне лишние сущности? Это будет отвлекать от основной цели объекта, да и оптимизировать хранение "значения" будет не совсем просто — всё-таки не даром HashSet это специальная реализация HashMap под капотом.
Почему не HashTable — потому же, почему не Vector. Мне не нужен устаревший синхронизированный класс.
Зачем использовать? Кеш объектов, словарь объектов, список объектов — которые нужны или целиком, или в которых нужен поиск по объекту… И нужно гарантировать, что элемент в списке будет ровно один (а в некоторых случаях дубли просто противопоказаны).
Не вижу никакой проблемы в поддержке кода с циклом for на индексах вместо цикла forEach. Вы какую-то проблему из пальца высасываете, честное слово…
Ну вот зачем вы свою психотравму из js тащите в java?! Объясню просто: нет никакого foreach в Java, есть синтаксический сахар for для обхода коллекции. На этом предлагаю спор о целесообразности тащить ужасные привычки из одного языка в другой закрыть.
PS Кстати, а стримов вы наверное совсем боитесь?
да и оптимизировать хранение «значения» будет не совсем простоНе очень понял, что вы имеете в виду под оптимизацией. Быстрая проверка наличия объекта именно по объекту, а не по ключу? Окей, допустим. Возможно, если он оптимизирован лучше, чем HashMap, то и правда лучше использовать его. Про Hashtable понятно. Опять же, я использовал в одном проекте именно Hashtable, но не просто так: там хэш-таблица была в серверном модуле, и в неё действительно могли читать (а также одновременно в неё писать) несколько потоков. Я понимаю, что это не панацея, и у меня всё равно могло всё поломаться, потому что надо полноценные блокировки было вводить. Но имхо если бы я использовал HashMap, поломалось бы ещё быстрее и ещё хуже…
которые нужны или целиком, или в которых нужен поиск по объекту…Поиск полным обходом что ли, с линейным временем? Вы сказали, что в HashSet оптимизирован поиск по значению, а не по ключу — но я не очень понимаю, как это поможет искать нам объекты по значениям отдельных полей, не строя какие-то дополнительные индексы своими силами…
Объясню просто: нет никакого foreach в Java, есть синтаксический сахар for для обхода коллекции.Так его выше комментаторы окрестили как forEach, я-то при чём? В JavaScript, кстати, у массивов есть такой метод, принимающий как аргумент функцию.
На этом предлагаю спор о целесообразности тащить ужасные привычки из одного языка в другой закрыть.Окей, но для меня всё же проще придерживаться одинакового стиля на всех языках, а не перестраиваться каждый раз. Мне даже переход с JavaScript на PHP 5.3-5.4 доставляет боль (потому что объявление ассоциативных массивов через
=>
вместо :
, произвольный объект надо объявлять как ассоциативный массив, если хочешь сделать это быстро и аккуратно, объединение строк через .
вместо +
, и доллары перед каждой переменной, что тратит время при наборе кода).Кстати, а стримов вы наверное совсем боитесь?Я знаю, что есть потоки в C++. Стримы появились только в Java 8, я пока ещё о них не читал, к сожалению. Но почитаю, спасибо. Если это что-то удобное — зачем их бояться, наоборот, надо использовать. Другое дело, я ради совместимости с более старыми ОС вряд ли вообще на 8-ой версии буду что-то разрабатывать. Я слышал, там некоторые вещи могут работать не очень.
Не очень понял, что вы имеете в виду под оптимизацией. Быстрая проверка наличия объекта именно по объекту, а не по ключу?
Оптимизация по памяти.
. Опять же, я использовал в одном проекте именно Hashtable, но не просто так: там хэш-таблица была в серверном модуле, и в неё действительно могли читать (а также одновременно в неё писать) несколько потоков. Я понимаю, что это не панацея, и у меня всё равно могло всё поломаться, потому что надо полноценные блокировки было вводить. Но имхо если бы я использовал HashMap, поломалось бы ещё быстрее и ещё хуже…
Для этого существует ConcurrentHashMap. Там есть всякие computeIfAbsent и прочие неблокирующе-синхронизирующие методы.
Поиск полным обходом что ли, с линейным временем? Вы сказали, что в HashSet оптимизирован поиск по значению, а не по ключу — но я не очень понимаю, как это поможет искать нам объекты по значениям отдельных полей, не строя какие-то дополнительные индексы своими силами…
Изучайте матчасть. В HashSet/HashMap сперва идёт поиск bucket, хранящий элемент по значению hashCode, после чего уже, да, идёт линейное сравнение для элементов, имеющих одинаковый hashCode. Поэтому для нормального функционирования этих коллекций необходимо чтобы ключ (для мапы) или значение (для сета) был корректно реализован метод hashCode.
Так его выше комментаторы окрестили как forEach, я-то при чём? В JavaScript, кстати, у массивов есть такой метод, принимающий как аргумент функцию.
Потому что для джавистов это действительно foreach, а вот вы на него проэцируете свои проблемы в других языках из-за названия. Поэтому я и предлагаю отказаться от путающего вас названия и пользоваться наименованием инструкции.
Окей, но для меня всё же проще придерживаться одинакового стиля на всех языках, а не перестраиваться каждый раз. Мне даже переход с JavaScript на PHP 5.3-5.4 доставляет боль (потому что объявление ассоциативных массивов через => вместо :, произвольный объект надо объявлять как ассоциативный массив, если хочешь сделать это быстро и аккуратно, объединение строк через. вместо +, и доллары перед каждой переменной, что тратит время при наборе кода).
Я (правда исключительно теоретически) могу писать на java, c, c++, assembler, delphi, js и php. И в каждом языке придётся писать в соответствии с особенностями этого языка. Вы же не пишете xml в стиле json? так а чем полноценные-то языки хуже? Сосредоточтесь на 2-3 языках… если так хочется — обновляйте список каждые пару лет. Тогда и глупого желания писать как в других языках будет меньше. Ну и полезно годик-два повариться в ентерпрайзе, даже если потом к нему прикасаться не будете.
Я знаю, что есть потоки в C++. Стримы появились только в Java 8, я пока ещё о них не читал, к сожалению. Но почитаю, спасибо. Если это что-то удобное — зачем их бояться, наоборот, надо использовать. Другое дело, я ради совместимости с более старыми ОС вряд ли вообще на 8-ой версии буду что-то разрабатывать. Я слышал, там некоторые вещи могут работать не очень.
простите но вот это — первостатейный бред. Везде где jvm заданной версии запускается (а это более-менее все ОС, кроме совсем уж устаревших) все фишки заданной версии будут работать корректно.
Изучайте матчасть. В HashSet/HashMap сперва идёт поиск bucket, хранящий элемент по значению hashCode, после чего уже, да, идёт линейное сравнение для элементов, имеющих одинаковый hashCode. Поэтому для нормального функционирования этих коллекций необходимо чтобы ключ (для мапы) или значение (для сета) был корректно реализован метод hashCode.Я знаю, что это за метод и что он делает. Вы вообще похоже меня не поняли, по ходу дела. У нас HashSet раскидывает элементы по бакетам в соответствии с хэш-функцией. Это так. Но как это нам поможет найти объект по значению какого-то отдельного поля в нём? Вот и получается, что поиск по сету объектов в общем случае, если у нас нет полной копии (которая вернёт тот же хэш-код) — будет линеен. А если у нас есть полная копия, то и искать как бы ничего не надо…
Поэтому я и предлагаю отказаться от путающего вас названия и пользоваться наименованием инструкции.Хорошо.
Вы же не пишете xml в стиле json?А это вообще как? Мой мозг отказывается такое представить.
Ну и полезно годик-два повариться в ентерпрайзе, даже если потом к нему прикасаться не будете.Согласен, но при чём тут нелюбовь к «переключению» на другой язык и работа в крупной компании? Вы к тому, что там неизбежно придётся писать на нескольких языках параллельно?
Везде где jvm заданной версии запускается (а это более-менее все ОС, кроме совсем уж устаревших) все фишки заданной версии будут работать корректно.Я неверно выразился, простите. Вот смотрите, при установке JRE 8 на WinXP установщик настоятельно рекомендует обновить версию ОС. А ещё там прогресс-бар выглядит при установке… Ну, странновато по дизайну. Это достаточный аргумент, чтобы остерегаться использовать на XP даже версию 8? Вот напишу я красивую форму на Swing — а у меня вот так же что-нибудь сломается. Нет, возможно там ничего не ломается, и это всё моя больная фантазия. Но если они даже инсталлятор сделали вот так вот тяп-ляп…
Я знаю, что это за метод и что он делает. Вы вообще похоже меня не поняли, по ходу дела. У нас HashSet раскидывает элементы по бакетам в соответствии с хэш-функцией. Это так. Но как это нам поможет найти объект по значению какого-то отдельного поля в нём? Вот и получается, что поиск по сету объектов в общем случае, если у нас нет полной копии (которая вернёт тот же хэш-код) — будет линеен. А если у нас есть полная копия, то и искать как бы ничего не надо…
А если вам нужно искать по какому-то отдельному полю, то у вас выбор: или линейная сложность или дополнительный расход на кеширующую мапу с ключём по этому вашему полю...
А это вообще как? Мой мозг отказывается такое представить.
Это примерно так же, как на java писать в стиле js. Те кто пишут на java в регулярном режиме в лучшем случае будут плеваться про себя.
Согласен, но при чём тут нелюбовь к «переключению» на другой язык и работа в крупной компании? Вы к тому, что там неизбежно придётся писать на нескольких языках параллельно?
Я к тому, что там вынуждены строго соблюдать гайдлайны к конкретному текущему языку. Если их одновременно несколько — к каждому из них.
Я неверно выразился, простите. Вот смотрите, при установке JRE 8 на WinXP установщик настоятельно рекомендует обновить версию ОС. А ещё там прогресс-бар выглядит при установке… Ну, странновато по дизайну. Это достаточный аргумент, чтобы остерегаться использовать на XP даже версию 8? Вот напишу я красивую форму на Swing — а у меня вот так же что-нибудь сломается. Нет, возможно там ничего не ломается, и это всё моя больная фантазия. Но если они даже инсталлятор сделали вот так вот тяп-ляп…
И снова — учите матчасть. В пределах одной версии swing на всех компьютерах будет отображаться строго одинаково — это UI, который целиком и полностью строится на java. Вот если вы будете работать с AWT или SWT (или как там она называется) — тогда да, в каждой ОС всё будет выглядеть по-разному, т.к. UI будет строиться с использованием системных элементов.
PS ну и вообще вспоминать сейчас win XP в разработке не каких-нибудь станков, а обычных "формочных" приложений — моветон. Слишком маленький за ними рынок остался, чтобы на них реально затачиваться.
Можно ссылку на цитату разработчиков, где они такое говорят? И аргументацию, почему эти коллекции не были удалены из JDK?
Не удаляются — исходя из старого java-вского "обратная совместимость гарантируется". Из-за этого же не меняются контракты методов. Рекомендации не использовать эти коллекции — в javadoc этих классов, например в openjdk это звучит так, абзац со строки 65, а в javadoc к sun-овской/оркаловской jdk, насколько помню было прописано более негативный прогноз использования.
Это примерно так же, как на java писать в стиле js.Ну вы всё же слишком разные вещи сравниваете. Java и JS — оба построены на ECMA Script, тогда как у JSON и XML вообще практически ничего общего (кроме общих понятий вроде «сущность» и «свойство»).
В пределах одной версии swing на всех компьютерах будет отображаться строго одинаковоА вы точно в этом уверены? Я читал, что элементы Swing — «легковесные». Но тем не менее, они выглядят абсолютно нативно, и ведут себя тоже нативно. Даже ClearType сглаживание работает совершенно одинаково на jLabel из Swing и на обычных Label из AWT (чего нельзя сказать о выводе строки или символа через API c помощью методов вывода, где сглаживание как раз не работает как надо, используя некий кастомный grayscale алгоритм, явно не имеющий отношения к ОС). Отсюда у меня есть сильные подозрения, что «под капотом» там вызывается совершенно стандартное API Windows, которое и рисует эти самые компоненты UI, а JRE только передаёт ему на вход нужные параметры отрисовки.
ну и вообще вспоминать сейчас win XP в разработке не каких-нибудь станков, а обычных «формочных» приложений — моветон. Слишком маленький за ними рынок остался, чтобы на них реально затачиваться.Напрасно вы так. Не важно, какой там рынок, я вот ещё полгода назад видя ситуацию с окончанием поддержки Firefox пытался написать простой веб-браузер, который обрабатывал бы HTML, CSS и исполнял JS код, и при этом нормально работал бы на Win XP (и выводил там корректно сглаженный текст, с чем у того же Chrome большие проблемы были даже в версиях 22-49, а сейчас и вовсе который не поддерживается).
Наоборот, это в случае серверов можно не заморачиваться (нет препятствий обновить серверную ОС, всё равно она нужна только как среда для исполнения сервисов), ну и для смартфонов/планшетов, возможно, поскольку эти устройства физически ломаются, бьются и тонут так часто, что можно условно считать большинство пользователей имеющими самую последнюю версию (хотя даже тут лучше опираться на реальные графики статистики и поддерживать несколько последних версий ОС). Ну и ещё то обстоятельство, что на мобильное устройство нельзя вручную установить более старую версию ОС из-за отсутствия драйверов в свободном доступе.
а в javadoc к sun-овской/оркаловской jdk, насколько помню было прописано более негативный прогноз использованияВот здесь не понял. Что значит «более негативный прогноз»? И вообще, зачем начинать с openJDK, когда стандарт де-факто в отрасли, которым 90% людей пользуется — это JDK и JRE от Sun/Oracle? Она же бесплатная, верно? В чём там загвоздка, разве не логичнее использовать авторскую разработку, а не форк с неё, который к тому же непонятно, насколько совместим?
P.S. Прочитал вашу ссылку.
Unlike the new collection implementations, Vector is synchronized. If a thread-safe implementation is not needed, it is recommended to use ArrayList in place of VectorТут не сказано «вы никогда не должны использовать, любое использование крайне не приветствуется». Тут сказано «если потоко-безопасная реализация не нужна, рекомендуется использовать альтернативы». Это сильно иначе звучит, не находите? :) Хотя да, я понимаю, что случай, когда она не нужна — самый частый, а рекомендации лучше соблюдать.
UPD: Я кажется понял, почему мы не поняли друг друга насчёт Swing. То, что писал я — применимо к моему опыту работы с System Look&Feel (который имитирует системный UI, а по факту, как оказалось, просто делегирует значительную часть операций отрисовки ОС). Для кастомных Look&Feel, включая тот, что установлен по умолчанию, вы несомненно правы — на любых ОС отображение будет одинаковым.
Но касаемо ClearType сглаживания у меня кстати есть большие вопросы, работает ли оно вообще в кастомных L&F. Судя по тому, что я вижу на XP при включенном ClearType (и корректно настроенном под монитор) — скорее нет, чем да: очень похоже на хороший grayscale, причём опять же реализованный внутри самой JVM. В принципе оно и логично: ClearType является частью шрифтового рендерера Windows, а Swing как раз призван обеспечить отображение независимое от ОС, чтобы было «всё везде одинаково». Потому и шрифт рисуется напрямую рантаймом.
Ну вы всё же слишком разные вещи сравниваете. Java и JS — оба построены на ECMA Script, тогда как у JSON и XML вообще практически ничего общего (кроме общих понятий вроде «сущность» и «свойство»).
Простите, что? Смотрим вики (русскую)[https://ru.wikipedia.org/wiki/ECMAScript] — Java повлиял на ECMAScript, не наоборот,
смотрим (английскую)[https://en.wikipedia.org/wiki/ECMAScript] — Java повлиял на ECMAScript, не наоборот. Так что сравнение в полной мере корректное.
Напрасно вы так. Не важно, какой там рынок, я вот ещё полгода назад видя ситуацию с окончанием поддержки Firefox пытался написать простой веб-браузер, который обрабатывал бы HTML, CSS и исполнял JS код, и при этом нормально работал бы на Win XP (и выводил там корректно сглаженный текст, с чем у того же Chrome большие проблемы были даже в версиях 22-49, а сейчас и вовсе который не поддерживается).
Вот вы и подтвердили, что это нифига не мейнстрим, заморачиваться поддержкой похороненых вендором версий систем. Дорого, долго и профита нет.
Вот здесь не понял. Что значит «более негативный прогноз»? И вообще, зачем начинать с openJDK, когда стандарт де-факто в отрасли, которым 90% людей пользуется — это JDK и JRE от Sun/Oracle? Она же бесплатная, верно? В чём там загвоздка, разве не логичнее использовать авторскую разработку, а не форк с неё, который к тому же непонятно, насколько совместим?
openJDK — 100% совместимая реализация языка + на неё рекомендовал для дальнейшего бесплатного использования переходить сам Оракл (в 11ой версии поменялось лицензионное соглашение для oracleJDK, резко ограничив бесплатные варианты использования). Так что эти доли сейчас сильно поменяются. А под "более негативным прогнозом" я подразумеваю то, что в оркаловой jdk, 6ой, кажется версии было написано именно о не-рекомендованности его использования.
Java в swing не поддерживает ClearType
Java повлиял на ECMAScript, не наоборотИ что?)) Это отменяет тот факт, что Java и JS схожи по синтаксису? :)
Дорого, долго и профита нет.Где из моих слов следует, что дорого и долго (хотя на самом деле, любой масштабный проект с нуля таким и бывает)? А про профит я вообще молчал. Да, может его и нет. Но это не значит, что в принципе нет пользователей, которые хотели бы иметь на XP исправный рабочий браузер. Притом удобный и без глюков, и поддерживающий современный JavaScript, чтобы сайты работали.
openJDK — 100% совместимая реализация языкаНо она написана не разработчиком языка и JVM, а другими людьми. То есть это тоже JVM, но другая. Совместимость — это очень здорово, но зачем?
в 11ой версии поменялось лицензионное соглашение для oracleJDK, резко ограничив бесплатные варианты использованияКому вообще нужна 11-ая версия, если 6-ая и 7-ая работают прекрасно, и там с лицензией всё норм? Что там жизненно необходимого добавили?
А под «более негативным прогнозом» я подразумеваю то, что в оркаловой jdk, 6ой, кажется версии было написано именно о не-рекомендованности его использования.Спасибо, теперь понял.
Java в swing не поддерживает ClearTypeНо ведь при выборе нативного L&F поддерживает… На глаз же видно. Могу даже скрины покидать. И программный код, чтобы было видно, что там не AWT юзается.
И что?)) Это отменяет тот факт, что Java и JS схожи по синтаксису? :)
Так большинство используемых в пром. программировании языков имеют c-like синтаксис! Это же ни о чём не говорит, кроме того, что авторы хотели упростить переход на их язык! В итоге-то у каждого языка сложился свой собственный свод правил, как писать на нём правильно.
Где из моих слов следует, что дорого и долго (хотя на самом деле, любой масштабный проект с нуля таким и бывает)? А про профит я вообще молчал. Да, может его и нет. Но это не значит, что в принципе нет пользователей, которые хотели бы иметь на XP исправный рабочий браузер. Притом удобный и без глюков, и поддерживающий современный JavaScript, чтобы сайты работали.
Я вам писал о том, что поддерживать работоспособность ПО в не поддерживаемых версиях вендором ОС стоит дополнительных денег… и если там полтора землекопа пользователей — то и заморачиваться этим никто не будет, потому что "долго, дорого и профита от такой работы нет". Ну не будете же вы сейчас выпуская приложуху под андроид 6-7-8 делать, чтобы и на какой-нибудь устаревшей версии а-ля 2.1 оно запускалось!
Но она написана не разработчиком языка и JVM, а другими людьми. То есть это тоже JVM, но другая. Совместимость — это очень здорово, но зачем?
Вас, наверное, это удивит, но большую часть OpenJDK пишут те же люди, что и OracleJDK. "А зачем" — ну теперь это будет следствием нового лицензионного соглашения.
Кому вообще нужна 11-ая версия, если 6-ая и 7-ая работают прекрасно, и там с лицензией всё норм? Что там жизненно необходимого добавили?
Вы будете сильно расстроены, если узнаете, что желающих работать с 6-7ой версией постепенно уменьшается и они уходят сильно на задний план? Ещё пару-тройку лет будет ходовой версией 8ка, но после она тоже уйдёт со сцены. И не учитывать это в планах… ну вредно для тех, кто собирается использовать платформу и дальше.
Но ведь при выборе нативного L&F поддерживает… На глаз же видно. Могу даже скрины покидать. И программный код, чтобы было видно, что там не AWT юзается.
Не знаю, насколько оно там поддерживает, и какова реализация данной фичи, вот только ClearType, если мне память не изменяет — виндовая фича и без кучи лицензионных проблем не может быть запущена в том же линуксе… Вполне возможно, что вы оказались правы в своём предположении, что нативный L&F использует нативный UI...
в не поддерживаемых версиях вендором ОСТам риски по безопасности сильно растут (особенно если это что-то антивирусное или связанное с передачей данных в облако). В своё время Dropbox вроде именно поэтому поддержку XP прекратил. А насчёт цены разработки — я бы всё же не согласился, не факт, что там всё становится прямо уж в разы сложнее. Что-то наоборот под старые ОС делать проще даже…
Ну не будете же вы сейчас выпуская приложуху под андроид 6-7-8 делать, чтобы и на какой-нибудь устаревшей версии а-ля 2.1 оно запускалось!Ну не знаю. Я вот уже года 3 планирую прочитать книжку про программирование под Android. Как только научусь что-то более-менее писать — Android 2.3 точно буду поддерживать. Тем более у самого он стоит.
Вас, наверное, это удивит, но большую часть OpenJDK пишут те же люди, что и OracleJDK.А, ну это сильно меняет ситуацию тогда :)
Вы будете сильно расстроены, если узнаете, что желающих работать с 6-7ой версией постепенно уменьшается и они уходят сильно на задний план?А почему? Если кому-то так нужны стримы и лямбды (хотя имхо это нужно редко) — ну есть 8-ая в конце концов. Но в основном и 7-ой хватает за глаза и за уши (ладно, с 6-кой я погорячился, она не умеет неблокирующий ввод-вывод толком, и менее гибко работает, например, с атрибутами файлов). В 7-ой версии с этим всё на порядок лучше и приятнее.
если мне память не изменяет — виндовая фича и без кучи лицензионных проблем не может быть запущена в том же линуксе…Так оно только в системном L&F — и естественно, работает только на винде. Не вижу причин, почему использовать Windows Forms или WPF можно (при этом разработчик приложения ничего не отчисляет Microsoft за возможность выводить их контролы на экране), а Swing — нет. Если JVM дёргает обычный Windows API в этом случае, то никакие лицензии не нарушены, вроде.
А какие у вас там привычки — дело ваше и тех бедолаг, что вынуждены поддерживать ваш код.Не вижу никакой проблемы в поддержке кода с циклом for на индексах вместо цикла forEach. Вы какую-то проблему из пальца высасываете, честное слово…
Мне по идее вообще не стоило встревать — но я лишь хотел сказать, что есть некоторое количество людей (не все и не большинство), которые Vector всё ещё используют. Кстати, если он так ужасен, почему его не выпилят? Ах да, знаменитая обратная совместимость. Ну так не вопрос, можно было начиная с некоторой версии в фоне, незаметно для программиста, заменять его на ArrayList, а в консоль при компиляции выводить об этом предупреждение. Но тем не менее он зачем-то оставлен? Очень нелогично.
Просто если разработчики JDK говорят, что не надо использовать Vector или HashtableМожно ссылку на цитату разработчиков, где они такое говорят? И аргументацию, почему эти коллекции не были удалены из JDK?
уже написал, что раскусил вас: вы тролль, причем очень умелыйНу-ну.
Потому что если вы не тролль, то это совсем печально.Да ладно? По-моему, всё ок :)
вместо самообученияНе вместо. Как только мне придётся писать в следующий раз многопоточное приложение — я обязательно ознакомлюсь и с ConcurrentHashMap, и с общей теорией на тему грамотной синхронизации, и если надо будет — с чем угодно. И постараюсь найти лучшее решение, чем тупо пихать всюду Vector и Hashtable (тем более, на сто процентов это не спасёт).
использует циклы вместо итераторов
Кстати, на минутку — есть какой-то аргумент, чем итератор лучше цикла for? Тем, что он сохраняет стейт коллекции в момент начала обхода? Так он ничего не сохраняет, там при попытке изменения коллекции исключение выкинет…
на улучшение или создание чего-тоЕсть в жизненном цикле продукта стадии, когда пилить новые фичи пачками ежедневно уже не нужно. Как раз тогда и есть смысл заниматься оптимизацией (но честно говоря, лучше делать её сразу, пока всё в памяти свежо и ты точно знаешь, как в твоём коде что работает). Имхо.
Меньше лишнего кода, меньше возможностей для выстрела себе же в голову.
А где тут можно выстрелить себе в голову? Тут же всё тривиально.
Если человек не совсем дуб, то при итерации он в самом начале выделит элемент коллекции в переменную, аля var test = testList.get(i);
Верно. Но если там в теле цикла одна строчка — то даже этого может быть не нужно.
Зачем вручную прописывать создание переменной и использовать for(;;) конструкцию, когда есть более лаконичный foreach
Более лаконичный, но менее броский при беглом сканировании кода глазами (всё-таки эти i-шки хорошо и сразу видны, а вот вариант с двоеточием — имхо, не очень заметен).
и увеличит шансы случайно пропустить выстрел или логическую ошибку в виде testList.get(j) или testList.get(i-j)
Эм, что? Откуда тут j вообще? Это уже более сложный вариант алгоритма, с двумя вложенными циклами, и вот там действительно индексы могут быть иногда нужны. Но я вообще не его рассматривал :)
когда в языке есть куда более подходящие конструкции
Ну есть ещё вариант с итераторами, но он более многословный.
А где тут можно выстрелить себе в голову? Тут же всё тривиально.
Эм, что? Откуда тут j вообще? Это уже более сложный вариант алгоритма, с двумя вложенными циклами, и вот там действительно индексы могут быть иногда нужны. Но я вообще не его рассматривал :)
Вот так и можно выстрелить себе в голову. Стреляет-то не язык, а программист, что использует вещи не по назначению.)
j в данном случае просто визуально похожая буква(а не вложенный цикл), из-за чего можно не заметить подмену, что может привести к тому самому выстрелу в голову.
Более лаконичный, но менее броский при беглом сканировании кода глазами (всё-таки эти i-шки хорошо и сразу видны, а вот вариант с двоеточием — имхо, не очень заметен).
Дело привычки больше. Как по-мне, оба заметны в равной степени. Что там for(smth:smth), что там for(smth;smth;smth).
Ну есть ещё вариант с итераторами, который работает и в Java 6, и в Java 5, но он более многословный.
foreach это и есть сахар над итераторами, насколько я помню.)
А в современной версии есть ещё вариант итерирования через лямбды и стримы.
Каждой задаче свой инструмент.
Для простого итерирования — foreach, для замысловатой логики с индексами — for(;;), для фильтрации по значениями, сортировки — stream, для однострочных действий — .forEach через лямбды.
j в данном случае просто визуально похожая буква(а не вложенный цикл)
Что?..) Во-первых, не настолько похожа, чтобы перепутать (если шрифт нормального размера). Во вторых, такой переменной может просто не быть в данном методе определено — тогда сразу красным IDE подчеркнёт такой код.
Что там for(smth:smth), что там for(smth;smth;smth).
Вы не поняли фишку. Дело не в том, что три компонента и for становится длиннее. Дело вот в этих палочках с точечками и пробелах между ними. Эта штука очень здорово видна даже при прокрутке кода на скорости. Визуальный паттерн. И кстати, с j это работает уже не так хорошо, а с остальными буквами вообще в разы хуже.
А в современной версии есть ещё вариант итерирования через лямбды и стримы.
Это только начиная с Java 8. Если я пишу на 6-ой — к сожалению, не вариант. Хотя почитать всё равно стоит, чтобы иметь представление, давно собираюсь)
foreach это и есть сахар над итераторами, насколько я помню
Кстати, забыл добавить: выше комментаторы указывали, что создание итератора — это лишние накладные расходы, и в некоторых случаях они могут быть существенными. Тогда зачем использовать foreach вместо for (то, что это сахар — уже замедлит компиляцию в байт-код как минимум на копейки, плюс само наличие итератора, которое может быть нежелательным)? Не говорите только опять про опечатки в буквах, такие ошибки — это даже не уровень школы, серьёзный программист никогда их не допустит (да и IDE не даст).
А вам не кажется, что у вашего варианта читаемость сильно ниже при беглом просмотре кода? Или это у меня только такое, субъективное?
Скорее всего субъективное. Общепринятое мнение, что вариант s-kozlov читается лучше.
Насчёт линейного времени — зависит от того, что за коллекция.
В 99% случаев использование LinkedList в Java там, где обозначен интерфейс List — ошибка, так что проблемы с линейным доступом скорее всего не будет.
При маленьких объёмах данных — это вообще, имхо, не суть важно.
Внезапно при маленьких данных становится важно, что использовать — foreach, или стандартный for. В этом случае при использовании foreach накладные расходы на него могут оказаться сравнимыми со временем обхода коллекции.
Если очень хочется подстраховаться с этим моментом — правильнее использовать итератор.
В foreach в джаве под капотом именно итератор ))
Самое главное — я не понимаю, почему для вас стандартный заголовок цикла for(), который, кстати, одинаков вообще для любого C-подобного языка — это «отвлекаться на индексы».
Потому что в джаве, когда заранее известно, что надо обойти всю коллекцию, принято использовать foreach. Ну или, с недавних пор, стримы.
Внезапно при маленьких данных становится важно, что использовать — foreach, или стандартный for. В этом случае при использовании foreach накладные расходы на него могут оказаться сравнимыми со временем обхода коллекции.
Спасибо! Не знал про этот момент раньше)
Ещё такое соображение: если нам в процессе обхода понадобится удалить часть элементов, то мы не можем использовать итератор, потому что получим ошибку (а вот обход с индексами с корректировкой переменной после каждого удаления — без проблем). Насколько я понимаю, удаление по индексу из вектора должно работать за константное время, а вот удаление с передачей самого элемента — потребует ещё этот элемент найти, и тут уже время доступа может быть линейным. Или нет?
Ещё такое соображение: если нам в процессе обхода понадобится удалить часть элементов, то мы не можем использовать итератор, потому что получим ошибку
У интерфейса List есть метод listIterator, который вернёт такой итератор, у которого есть метод remove, который удалит элемент, на котором стоит итератор. Для LinkedList сложность вызова метода remove у итератора будет константной, а у ArrayList — линейной.
(а вот обход с индексами с корректировкой переменной после каждого удаления — без проблем).
Нельзя удалять элементы по индексу во время прохода по листу. Работать будет, но с производительностью можно будет попрощаться. Ниже скажу почему.
Насколько я понимаю, удаление по индексу из вектора должно работать за константное время, а вот удаление с передачей самого элемента — потребует ещё этот элемент найти, и тут уже время доступа может быть линейным. Или нет?
Вызов list.remove(index) будет иметь линейную сложность, независимо от того, чем является list. В случае с ArrayList — для удаления элемента надо будет сдвинуть следующие элементы влево, а в случае с LinkedList — нужно будет сначала найти элемент по индексу.
у которого есть метод remove, который удалит элемент, на котором стоит итератор
Спасибо, не знал про такое.
В случае с ArrayList — для удаления элемента надо будет сдвинуть следующие элементы влево
А зачем он их двигает сразу? Теоретически, можно было бы оставлять пропуски… Ну понятно, в общем там всё как в обычном массиве работает. С Vector та же история?
Для LinkedList сложность вызова метода remove у итератора будет константной, а у ArrayList — линейной.
Так подождите. Если у меня вектор — получается, мне всё равно, чем удалять? Раз всё равно удаление выполняется за линейное время. Я просто делал это через индексы в своём проекте.
А зачем он их двигает сразу?
Чтобы гарантировать константное время доступа к элементу листа по индексу. Если мы оставим пропуски, для поиска элемента по индексу придётся перебирать элементы коллекции.
С Vector та же история?
С Vector то же самое, только Vector использовать нельзя. Это legacy класс, использование которого пагубно сказывается на производительности.
Vector и ArrayList всегда идут в паре, и применяется то, что нужно, в зависимости от ситуации. Vector внутри синхронизирован, если что. В многопоточном коде это критично.
Что у него не так с производительностью? И никакой он не legacy. Скиньте пруф этого «гениального» утверждения.
Будем обсуждать в соседней ветке, ок?
Ну и зачем создавать себе зависимость от этого там, где она не нужна?
Выше уже написали, что ничего не меняется при удалении (всё будет зависеть от типа коллекции при любом подходе). А при чтении по индексу — в случае Vector и ArrayList тоже в общем-то нет разницы. Но да, тот подход лаконичнее, писать меньше.
Вообще вариант с индексами, если они сами по себе не нужны в теле цикла, однозначно хуже, по всем показателям. Зачем вообще с ним сравнивать?
Он не хуже. Он эквивалентен. Кроме случае с LinkedList и доступа к элементу за линейное время.
Foreach — синтаксический сахар над итератором.
Нет, совсем недавно. Я просто не очень привык применять эту форму for с двоеточием
А я не понимаю, с чего бы мне писать на Java как на абстрактном си-подобном языке, не используя возможности Java.
Ну например потому, что с индексами визуально нагляднее, я выше уже писал, почему. А ещё потому что привычка из JavaScript — там for через индексы работает существенно быстрее, чем for...in.
Изначально об удалении речи не шло.
Но это часто необходимая операция! Как можно её не рассматривать?
Второе утверждение противоречит первому.
Там выше кто-то говорил, что LinkedList редкий случай. Но я вообще несколько запутался. Вы не могли бы ещё раз прояснить, в каких ситуациях обход по индексу будет медленнее, чем foreach или итератор? Такой кейс вообще в природе существует?
Про универсальность — тоже нет смысла спорить, как по мне, поскольку если у любой коллекции есть метод get() — он сделан не просто так, а именно ради того, чтобы нас не беспокоил тип коллекции при обходе. То есть нельзя сказать, что вариант с индексами и get() хотя бы в каком-то случае сломает наш код. Вот замедлить — да, иногда может. Поэтому я и прошу Вас перечислить, когда именно он это сделает.
С последним утверждением — полностью согласен. Проблема в том, что цикл for — это не «фишка» только JavaScript. Такие циклы можно встретить и в программах на C, C++, ActionScript и PHP, как минимум. То есть это общепринятая конструкция. Да, в Java могут быть лучшие способы итерирования, и не только в Java. Но писать код, понятный программисту на любом языке — имхо, не есть минус…
LinkedList. Существует.Я вот в своей практике (пусть она и не такая обширная, как у вас) ни разу его не использовал. Зачем оптимизировать код под коллекцию, которой никогда не пользуешься и пользоваться не планируешь? Опять же, я не говорю про работу в большом проекте в команде, я говорю про собственный проект, где 1 или максимум 2 разработчика.
по крайней мере, по сравнению с итерированием и добавлением в конецСоглашусь. Но всё-таки и она довольно часто нужна.
Сами-то поняли, что написали? Где метод get() у java.util.Set?А я не знаю, почему его не сделали. Множествами я тоже не пользуюсь. Как по мне, это очень неудобная коллекция — например хотя бы потому, что для её обхода необходим итератор (то есть нельзя проитерироваться по ней в цикле for, что, я настаиваю, является самым интуитивным подходом). И не сделав метод get (хотя да, он не имеет смысла, потому что у элементов нет уникальных ключей, а если они будут, то это будет уже хэш-таблица), разработчики JDK серьёзно подпортили универсальность интерфейса, т.е. независимость реализации от типа используемой фактической коллекции.
Что вы используете в своих pet projects — ваше личное делоЧто такое pet projects? Типа проекты, где автор сам себе единственный разработчик?
А что, бывают какие-то ещё проекты (ну если не брать участие в серьёзном Open Source типа Chromium/Firefox/VLC/etc.)? Как бы 80-90 процентов проектов — именно такие. Редко когда приходится привлекать кого-то ещё себе в помощь.
Да хотя бы потому, что у множеств нет порядка элементов, соответственно, не имеет смысла запрос «дай мне n-й элемент».Я в курсе, что такое множество, спасибо, Капитан Очевидность :) Я лишь про то, что универсальность страдает в итоге из-за того, что у множества нельзя попросить вернуть элемент методом get (я не говорю, что на вход непременно должен приниматься порядковый номер, у хэш-таблиц вон принимается ключ, и ничего).
У тех, кто использует for-each, никаких проблем с независимостью реализации нет.А, простите, через forEach можно ещё и множества обходить? Вот этого не знал. Хотя, раз выше написали, что там итератор создаётся «под капотом», то всё логично.
Да, подход с forEach лаконичнее и универсальнее (на примере списков и множеств доказали). Согласен со всеми.
Но всё-таки множества используются очень редко. Да и списки — не так чтобы очень часто.
Но если гнаться за идеальным кодом — да, наверное forEach лучше.
Но всё равно Вы не последовательны — выше Вы вон утверждали, что плохо делать оптимизацию раньше времени (оптимизированный код всяко лучше неоптимизированного). То есть там Вы не хотите стремиться к идеальному коду. А тут что иначе обстоит, вроде всё то же самое, только речь не о производительности, а о краткости конструкции и её максимальной «безопасности» в случае смены типа коллекции. Почему для Вас эти два аспекта важнее скорости работы приложения? Это глупо, особенно учитывая, как редко меняют тип коллекций на практике в живом проекте.
Ну и как бы у get(i) тоже никто не гарантирует константную сложность, но не в этом суть. Плохого то, что этот код еще нужно читать и поддерживать. В Java 8 коллекции итерируются при помощи стримов или при помощи цикла for-each, который был введен еще в 2004 году, а до этого использовались итераторы вместо индексов. Индекс при итерировании используется только с ArrayList, когда итерация идет не по-порядку, и в тех случаях, когда значение индекса используется в цикле.
Опять уволили за токсичность? Сочувствую, тоже бывало.
Вот это – токсичность. А если по-русски, то язвительность. А по существу – атака клеветой на репутацию. Клевета – потому что вам не известна действительная ситуация. Следовательно, обоснованных и объективных утверждений о ней делать не можете, но сделали. Незапрошенное сочувствие – тоже съязвили, т.к. имеет коннотацию "оппонент проявил слабость". Т.е. ещё одна атака на репутацию. Потому свой комментарий вы закончили типичной манипуляцией размывания понятий (рассуждая про неуместность категоричности).
Не хотите признавать происходящее, цели и мотивы участников ситуации, и для этого атакуете точность суждений (заведомо ложно вменяя категоричность и пытаясь её отменить)? Так это не предмет выбора: это вопрос честности и объективности перед собой и другими, которую не терпят такие, как вы (т.к. она кое-чего лишает), и потому же столько элементов психологических игр в ваших комментариях (а не только в этом – имел возможность немного изучить вас через них). Потому у вас такая отсылка к учёту мнений других. Мотив, стоящий за этим, – чтобы исполнялась их (а значит и ваша) линия поведения за чужой счёт, выраженная их мнением, суть которого – просто желание и его осуществление, независимо ни от чего.
Т.е. всё это сводится к банальной борьбе за возможность самореализации, и чья линия управления получит продолжение, а чья – нет, т.е. чья информация в системе будет дальше жить, а чья – нет. И да, без анализа мотивов и интересов людей невозможно разобрать ситуацию. Проблема в том, что люди почти всегда не желают, чтобы их мотивы и интересы знал кто-то ещё, т.к. это создаёт угрозу самой возможности реализации их линии поведения, а также налагает и проявляет ответственность за поступки, отношение, поведение и выбор. Вокруг этого крутится множество психологических игр, выражающихся ложными интерпретациями, ложью, клеветой, саботажем и разного рода психологическими атаками. Выигрышем (ложным, на деле) в ней считается принуждение оппонента к своей воле, а проигрышем – признание фактов, собственных мотивов, интересов и действий, означающих (ложно, т.к. это мозгоглюк) подчинение воле оппонента.
Хватит играть! Скучно? Это забота исключительно того, кому скучно: никто не обещал, и потому не обязан что-либо делать, чтобы кому-то не было скучно. Самое лучшее, что можно сделать, чтобы не было язвительности и связанных с ней ситуаций и процесса порождения конфликтов, – пресекать такое поведение и психологические игры.
С детьми в теле взрослых это сложно, но можно, потребуются терпение и власть. В целом, наиболее эффективный подход – лишать цели игры. Обычно, помимо собственно самой ситуации как цели игры, это ещё и эмоции от неё и её процесса. Когда игрок чувствует, что не получит желаемых эмоций от ситуации и выигрыша не существует, его мотивация к игре довольно быстро иссякает. На этой теме построены сценарии по идее Дэвида Шора (легендарный сериал "Доктор Хаус"). Даже когда игра проявлена вместе с её целями, у игрока остаётся ход "не признавать, чтобы игра продолжалась". Вот почему необходимо воздействовать на мотивы и ресурсы для их воплощения: они управляют выбором, а значит поведением.
И не нужно относиться к людям, как к чему-то особенному: это сложные системы, а потому обладают поведением, управляющими факторами, программами и всем тем, на чём вообще строятся сложные системы. Никакого чуда в этом нет, кроме разума: не является частью человека, а живёт на нём, как на носителе (тривиально проверяется по всем ситуациям, в которых человек есть, а разумное поведение отсутствует). Чтобы снять возможные глупые споры на тему, что такое система: система, от греческого слова, – это способ двояко анализировать что-либо одновременно и как целое, и как состоящее из частей. Т.е. способ задать некую границу в системе представления (в собственной голове, в первую очередь), позволюящую отделить и отличить представление объекта анализа от всего остального, и посмотреть внутрь него. Ничего иного понятие системы в своём определении не требует и не предполагает (ни определённости, ни алгоритмичности, ни-че-го). Понятие над-системы – изменение направления взгляда и области анализа: т.е. это всё то, что находится за выбранной границой вне объекта анализа. Иное общепринятое название – среда.
Такой подход к анализу ситуаций и поведению людей быстро выключает желание играть, потому что начинаешь видеть, как происходит то, что не может происходить иначе (конечно, потребуется опыт изучения, и не малый), пока не внесут изменения в алгоритмы, программы и иные управляющие факторы. И тогда становится очевидно, что вся эта история с токсичностью не стоит и выеденного яйца, и является искуснейшей попыткой саботажа интеллектуальных и разумных процессов и подавления естественных психических процессов, чтобы максимально отвлечь энергию мозга на беспродуктивную и бесполезную деятельность от дела и продуктивной деятельности. Потому что не нужно и нельзя вестись на западленские методики и тренды: свои иметь и делать надо.
— Вы все врете!
Наверное, надо каждый раз его хвалить за такое, да… А то расстроится, бедняга, и больше не будет багов плодить.
Так в том и дело, что надо так как Вы написали. А токсично это «ты идиот, что за *** написал»
Чего Вы добьетесь токсичным ответом? Проучите идиота? Не обольщайтесь, единственное что Вы делаете таким образом — срываете Ваш личное раздражение.
Вежливый и объективный фидбек позволит исправить конкретные ошибки и исправить человека в будущем. Токсичное поведение вызывет защитную реакцию, то есть человек будет считать Вас м**ом и это вряд ли это поможет проекту. А если надо человека уволить, то на основе нормального фидбека это сделать просто, а после токсичного поведения получите скандал с выяснением отношений.
Если человек технически смог допустить 100+ уникальных падений, то либо у Вас дикие проблемы в проекте (и лучше всего максимально аккуратно обсудить путь к изменениям); либо же это нарочный саботаж, и человека надо просто вежливо уволить.
И главное, токсичное поведение бьет по всей команде, а не только по одному девелоперу.
Если не справляется — еще один шанс, но с предупреждением. Если с третьей попытки не справился — перевод на другую позицию либо замена.
Вот, кстати, самый нормальный взрослый подход. Только почему-то во многих компаниях до сих пор хихоньки, хахоньки и «да ты — %##%, да что же ты такое написал?!»
Вот если управляли как в комментарии выше: «мил человек, поправь косяки, иначе придётся попрощаться», не вижу ничего ошибочного. И на интервью кандидат мог хорошо отвечать, а потом халтурить. Есть полно профессиональных собеседующихся. Да и стресс по таким незначительным поводам испытывать ни к чему.
Вот это сильно зависит от отношения. В науке, например, норма, делать десятки, сотни, тысячи экспериментов, в расчёте на то, что хоть один завершится успехом, а проваленные — это не ошибки, а рутина.
Если есть желание улучшить ситуацию, то лучше добавить опытного разработчика, который поможет исправить ситуацию, закрыть фичу, а потом спокойно всей командой обсудить как менять процесс чтобы этого избежать. Я был в роли такого девелопера, со мной так сработало, и я в той фирме неплохо вырос. «Ещё один шанс» я бы гарантированно зафейлил.
У меня так сработало без необходимости увольнять. Был довольно бестолковый разработчик. После разговора 1x1 с обозначением моментов, где ему стоило бы изменить свой подход и назначением его ответственным за автоматизацию тестирования некоторого куска — человек начал проявлять себя с хорошей стороны гораздо чаще. И хоть и не стал топовой звездой, но одним из лучших разработчиков в нескольких коммандах определенно стал.
С другим не так получилось хорошо. Три шанса человек упустил — перевели его в обратно в Tier-3 support, откуда он изначально пришел.
> Если есть желание улучшить ситуацию, то лучше добавить опытного разработчика
Возможно вы не согласитесь, но я считаю это микроменеджментом. Обратиться к опытному человеку и попросить помощи — задача самого ответственного. Я могу ему подсказать, что вот тот-то хорошо в теме разбирается. Ну и отдавать все сложное одному опытному — черевато тем, что кроме этого одного никто ничего не сможет делать, а людям мало того, что иногда надо в отпуск уходить, так они еще и болеют и могут другую работу найти.
> Я был в роли такого девелопера, со мной так сработало, и я в той фирме неплохо
> вырос. «Ещё один шанс» я бы гарантированно зафейлил.
Я думаю мало кто не был в роли такого девелопера. В зависимости от того на какой стадии карьеры и с кем это происходит — подход должен быть, разумеется разный. Одному нужно разъяснить — ну не знает человек и все тут, другого направить — не подумал, третий в принципе не хочет делать иначе. Тут как повезет с коммандой и компанией.
В зависимости от того на какой стадии карьеры и с кем это происходит
Согласен. 146 падений — это явно особый случай.
Но главное в том, что Вы обозначили конкретные моменты и поставили конкретный план улучшений. Это кардинально противоположно предложенному выше «надо токсично». А далее да, всё индивидуально.
Вы все врете!
Это как раз пример токсичного поведения, не заметили? И вместо того чтобы самому переходить на мат не лучше ли такого человека выкинуть из коллектива? А то я вот почему-то сомневаюсь что «вы-все-врете» товарищ от мата внезапно просветлеет и станет нормально себя вести.
— Вы все врете! это всё потому что я гей!
б) Смешно смотреть на бородатых дядек, которые всерьез с вами спорят.
в) А у вас все впереди, конечно.
Судя по дате в профиле, человеку 34. И дата рождения в июне, так что не совсем недавно.
В принципе, нам всем 17 лет! Просто разное количество месяцев, а у кого-то вообще отрицательное, не превышающее (-204) месяцев
Одинаковые в том смысле, что способны адаптироваться к условиям среды?
Ну, кто-то адаптирует себя под условия среды, а кто-то адаптирует среду под себя. Программисты (в отличие от) вполне могут себе позволить последнее.
Для аналогий лучше что-то более распространенное подобрать, чтение или письмо например, а то для меня как для человека попробовавшего безуспешно прокачать все три навыка звучит как приговор :)
Абстрактную алгебру мне осваивать сильно проще, чем общение с людьми.По-моему, ваши 11,3k комментариев здесь как бы говорят нам, что с общением с людьми у вас всё в порядке. :-)
А при смене окружения, банально при поступлении в ВУЗ например, это умение нужно применять.
Я в ВУЗе учился без применения этого умения и ничего. Скорее, наоборот, пару раз пришлось пресечь излишне активные попытки «уменьшить дистанцию».
Умение заводить друзей во взрослом возрасте — это отдельное умение.Скажем так, это тот самый пресловутый soft skill, который надо осознанно прокачивать. Подростку это как раз меньше нужно в силу возраста: мы так сделаны, что в подростковом возрасте (должны быть) заняты поисками партнеров и занятием места во взрослой иерархии. Это без социалки не делается никак, вот она и дается практически из коробки.
Для более взрослого состояния предполагается, что либо все уже есть, либо уже нехрен и пытаться: и действительно, в каком-нибудь неолите не оставивший потомства до двадцати — готовый лауреат премии Дарвина в широком смысле. Следовательно, нехрен и тратить силы на социалку, займитесь добычей съедобных корешков.
Тот незначительный факт, что сейчас концепция несколько изменилась, мимо закономерностей онтогенеза прошел незамеченным, будут еще они на всякую фигню внимание обращать.
Так что теперь либо вручную: непривычно, тяжело и больно — либо уже забить.
где-то в конце первого курса мне просто стало очень леньОчень знакомое ощущение, примерно как из анекдота про философа: «но зачем?..»
Только у меня ломалось не «сразу все», а кусочками. Вот здесь я внезапно больше не вижу смысла находиться. Вот этим мне уже категорически влом заниматься. Еще, кажется, месяц назад… Как три года?
Если хуже не становится, наверное можно и хрен с ним, да. С другой стороны, ежели оно приносит дискомфорт, то возможно, лучше бы этим все-таки озадачиться.
Не оскорбление, но близко к нему. «этот код не будет работать ожидаемо», «этот код не соответствует нашим требованиям и соглашениям», «этот код будет сложен в поддержке» — нормально, воздействие на рациональную сферу человека. «Плохой» — уже воздействие на эмоциональную сферу, не несущее конструктива вообще. А «твой код плохой» — явная попытка (пускай и неосознанная) неконструктивно критиковать не просто код, а его автора. Зачем вы вообще добавляете «твой»? Чтобы посильнее человека задеть? Имеет ли для вас значение с точки зрения производственных интересов акцентировать внимание на том, кто совершил ошибку, если человек и так прекрасно это знает?
«Лена, ты неправильно поднимаешь штангу! Так у тебя нагрузка на спину, можно повредить позвоночник. Надо срывать вес ногами а уже потом подключать спину.»
Это что, токсичное поведение?
или
«Лена, всё хорошо, но только можешь сорвать спину, лучше делать вот так: ...»
Можно спорить, какой подход лучше. Как по мне, обычно второй работает куда лучше.
Я не вижу разницы между этими двумя подходами. Не вижу оскорбления или ещё какого-то негатива, но это может стать причиной того, что кого-то назовут токсичным и снимут с управления командой, как минимум поставят на вид. Это явный перебор.
Если же есть пара минут, то зачем использовать способ, работающий хуже?
У Milfgard в одной из книг описано 5 градаций того, как объяснить человеку что он делает неправильно. Так вот,
Лена, всё хорошо, а если ты ещё будешь вот так делать ...это где-то 2-3 ступень из пяти. И там же объясняется, почему каждая следующая форма работает лучше предыдущей.
«Лена, ты всё неправильно делаешь. Надо так:...»я не считаю токсичным поведением. Я отвечал на вашу фразу «не вижу разницы» и постарался ее показать.
«Твой код плохой, я сейчас подробно изложу причины и дам советы»Это на грани токсичности, хотя я не считаю такую фразу атакой на мою личность. И знаю людей, которые мгновенно займут оборонительную стойку и выйти на конструктивное общение потребует усилий.
Так как вторая фраза может убить конструктив, я стараюсь ее избегать и не рекомендовал бы ее использовать.
То есть важно не только то, как человек говорит/критикует, а еще и то, способен ли он меняться в ответ на критику в свой адрес — для достижения более спокойной атмосферы в коллективе.
Люди в среднем не в состоянии правильно расставить запятые, а вы им приписываете построение фраз на уровне куртуазных романов. Я не могу одновременно держать в голове структуру кода и изъясняться при том изысканными выверенными высказываниями, и едва ли каждый может. Такое «на грани» выглядит просто поиском причины обидеться на ровном месте. То есть токсичным поведением.
Я считаю, что в большинстве случаев людям нет никакого дела ни до моей личности ни до каких-то атак на неёИ вы счастливее других, которые таки видят атаку там, где ни для меня, ни для вас ее нет. Такие люди есть, я с ними лично общаюсь. Или вы не верите, что они существуют и меряете всех по себе? А какие доводы нужны, чтобы вы задумались как сказать Аллочке что можно сделать лучше так, чтобы она не плакала как в прошлый раз?
вы им приписываете построение фраз на уровне куртуазных романовНет, фразы вполне простые и короткие. Нет, я не приписываю эти фразы людям — это советы человека, которые умеет в общение и управление коллективом. Я не готов процитировать их по памяти, но правда обычные.
Такое «на грани» выглядит просто поиском причины обидеться на ровном местеТо есть вы считаете, что людей с не такой толстой шкурой, как у вас, нет?
Нет, я не считаю что нужно ориентироваться на слабейшего. Цель моего предыдущего комментария — показать причины, по которым "кто-то другой в тех же обстоятельствах будет расцениваться собеседником иначе."
Я отвечаю на ваши вопросы, потрудитесь ответить и вы на мой.
А какие доводы нужны, чтобы вы задумались "как сказать Аллочке что можно сделать лучше так, чтобы она не плакала как в прошлый раз"?
4. Я не очень понимаю, почему вот здесь и здесь не работает вот так, как мы договаривались. Объясните?
5. Леха, тебе нравится, как вот это и это получилось? Я не очень понимаю, почему вот это так работает. Скажи, ты сможешь сделать лучше?
Как вы считаете, это сложные конструкции? Вне авралов, для повседневного общения?
Не «ты пишешь код неправильно», «а этот код написан неэффективно»
То есть типа сам собой написался, а имя на коммите с Нибиру прилетело?
Отрывок назывался что-то вроде «как давать обратную связь». Вечером, часов через пять, доберусь до дома и смогу сказать и книгу и где в ней текст с точностью до номера страницы. Ну и процитирую, если цитата будет вменяемых размеров.
«Ты сделал плохо, переделай здесь и здесь» – это двойное оскорбление.
1. Ты сделал плохо, переделай здесь и здесь.
1. В проекте плохо сделана вот эта часть, надо ее переделать.
1. Вот здесь и здесь не работает вот так и вот так, как мы договаривались.
1. Я не очень понимаю, почему вот здесь и здесь не работает вот так, как мы договаривались. Объясните?
1. Леха, тебе нравится, как вот это и это получилось? Я не очень понимаю, почему вот это так работает. Скажи, ты сможешь сделать лучше?
В варианте 3 вы переходите <....> к конструктивному обсуждению. В варианте 4 вы берете проблему на себя, ни в чем не обвиняя контрагента. А в варианте 5 ставите на кон профессиональную репутацию человека
Я нагло сократил авторский текст, чтобы не раздувать цитату. Раздел занимает один разворот и в нем Сергей уместил еще не одну хорошую мысль, так что рекомендую прочитать целиком.
в свою очередь оставлю ссылку на пост, который я упоминал выше: "Управленческие инструменты: 4-фазный алгоритм решения проблем с людьми или «А чего ты хочешь, если ты такой хреновый менеджер?»"
Психологическая стойкость нужна спортсменам-олимпийцам. Остальные лучше учатся на позитиве, или на балансе позитива и негатива.
А лучшие тренера подстраивают стиль общения под характер спортсменов, и выращивают олимпийских чемпионов.
А обижаться на такие фразы как минимум странно. Они чисто утилитарные, вы ищете глубокий смысл там где его нет. Всё равно что обижаться на «У вас шнурки развязались» или «Вы рюкзак не застегнули».
Я не призываю все общение подстраивать под них — это неправильная модель. Я хочу рассказать, что да, такие люди есть и да, они так не троллят, они так думают.
В мире дофига людей, имеющих серьёзные проблемы с самооценкой. У них, фактически, психологическая форма аллергии: борьба личности с самой собой, выходящая далеко за рамки нормы. Ну вот есть они и точка, и с этим приходится жить. Неизбежный природный факт, «хвосты нормального распределения». Просто так сложились гены и биохимия, возможно воспитание. Эти люди в среднем имеют такие же интеллектуальные и физические способности, они вполне продуктивны пока нет приступа. Но персональные нападки провоцируют приступ так же, как аллерген провоцирует анафилактический шок.
Можно спорить о том, как это лечить и лечится ли это вообще, но по-любому психология личности не в компетенции тренера по штанге, для этого в спортивной команде есть спортивнй психолог. Тренер-профессионал будет учитывать личностные качества каждого подопечного, а не в среднем по залу — точно так же как врач, выписывающий лекарства, учитывает возможные аллергии и побочные эффекты каждого отдельного пациента, а не «в среднем по больнице». Тренер-полупрофессионал будет исправлять одни ошибки, но вносить другие по незнанию. Тренер-мудак будет пытаться «лечить».
Неучёт побочек от своей деятельности — это слабый профессионализм, недальновидность и верхоглядство, приличествующее молодёжи, для которой главное «крутая технология», а на остальное наплевать. Или тем, кому цель важнее средств.
Обычно тренер очень хорошо знает, когда первый подход можно применить, и он будет таки оптимальным. Но обычно второй вариант работает лучше, и вопрос не в «поставить на вид», а в том чтобы добиться наилучшего результата. Не это ли задача тренера и руководителя?
(я буду обновлять страницу, честно)
Или как некитаец, который не слышит разницы между четырьмя тонами в китайском языке. И по этому считает, что её нет.
И, что самое грустное, так как он эту разницу не видит и не слышит, и убеждён, что её нет, он не только не способен понять других, которые эту разницу видят и слышат, он ещё и возмущается, что другие что-то выдумывают.
Твой код плохой, я сейчас подробно изложу причины и дам советыОдин сплошной бессмысленный пируэт.
Если есть конкретные проблемы надо с них начинать. Оценки можно и в конце расставить, да и мало кто расстроится если на них вообще забить.
Если есть только ощущения и задетые эстетические чувства можно перейти к изложению альтернатив.
Если конкретных проблем и альтернативных решений нет стоит жать кнопку приянть, сэкномит время коллег и деньги работодателя.
А что нельзя критиковать без грубых словечек и личностных оскорблений? Умение владеть собой и уважительно общаться с коллегами — это тоже признак профессионализма. Человек который пытается самоутвердиться за счет менее сильных коллег явно страдает комплексом неполноценности и я бы такого герою не доверил сервер, кто знает как он себя поведет в критической ситуации, сумеет ли вовремя обратиться за помощью и признать свои ошибки?
У монетки есть две стороны.
На собеседование говорят «Мы Вас нанимаем как специалиста по решению или предтвращениею некоторого спекта проблем. У вас будут следующие полномочия ....»
Вы выходите на работу и начинете выполнять свою работу хорошо. Поскольку вы же только вышли, то вы не погрязли в трясине интриг и взаимных соглашений и вы выдаете результат, что бы пройти испытательных срок.
Проблемы которые вы решаете уже есть результат некоторых компромисов и отсутсвия компетенций «до вас». Выданный вами результат кого-то не устраивает — или случайно облажали «решение Важного Человека» или случайно показали коллективную некомпетентность или что-то подобное. В любом случае, в результате вашей работы кто-то окажется не «в лучшем виде», а это угроза зарплате или авторитету или неформальному лидерству.
Вот тут и начинается самое интересное:
- Умные люди попробуют получить ваши знания (научиться у вас или доверится вам) что бы работа стала лучше, результат достигался с меньшим гиморроем и все придет в норму через пару месяцев
- Идиоты будут «защищаться» всячески стараясь дискредитировать вас и результаты вашей работу. Они не будут стараться получить ваши знания и понять их ибо их Корона/ЧСВ/болото, как они считают, под угрозой и надо спасать. С их точки зрения они не делают ничего плохого! Но тут и выясняется, что вы то человек новый «не проверенный» а против вас «проверенные». И тогда вопрос — а кто их нанял ?! Кто допустил весь этот фееричеческий трэф? Угроза захватывает не только «прямых коллег» но их/ваше окружение.
Единственная реакция — убрать источник раздражения. И вы объявляетесь таковым
По факту, вас не нанимали ублажать коллег (для этого есть специальные мальчики и девочки), вас нанимали решить бизнес проблему. В рамках законодательства и должностных интсрукций. И из этого и нужно исходить.
Если бизнес-проблема в том, что отсутсвует обратная связь (положительная или отрицательная) — это печальный случай.
Также встречаются проблемы с отсутствием песочниц, т.е. приняты все действия сразу отправлять в продакшен. Не верите? Большинство руководителей компаний не имеют экспериментальных площадок для обкатки своих решений, поэтому решения идут сразу в продашкен. В лучшем случае обкатка идет на одном подразделении и только потом распространяется на все предприятие.
Также есть проблема с работой динамических систем. Представьте переезд. И редко кому удается во время переезда продолжать работать в нормальном режиме. Выкручиваются тем, что сворачивают деятельность на время переезда или переезд разбивать на части, т.е. прекращает деятельность только та часть, которая переезжает. Точно также про замену — тут вообще растягивается во времени на длительные периоды, т.к. подключается еще и фактор обучения.
Есть еще понятие авральности работы. Человек в режиме аврала может находится недолго без ущерба для себя и остальных. Многие работают либо в режиме периодического, либо слишком длительного аврала. Недолго — это около 7 лет, дальше могут начаться проблемы.
Автор об этом пишет. Инфантилизм наступает
Гадят-не гадят — это одно. Но вот если постоянно повторяют слова "этот код плохо написан" вместо "этот код не соответствует нашим стандартам и соглашениям", то одно из повторений вполне может оказаться последней каплей. Инфантилизмом будет как раз терпеть "ты это плохо сделал, папе не нравится, переделай"
А почему не обосновать во время код ревью? Вы в целом понимаете, что слово "плохо" — это субъективная оценка и ваши критерии "плохости" могут не совпадать с автором кода.
А почему не обосновать во время код ревью?
Потому что на ревью обычно сидит несколько человек, и у большинства из них есть чем заняться, кроме как в надцатый раз слушать то, что они сами давно знают?
Получается текст, где примерно всё можно тут же отзеркалить:
«Что за бред — доверять управление сервером банка юному бородачу, который плачет от того, что ему не дают шутить про ориентацию? Это должен быть матёрый сисадмин со стальными яйцами, десятилетиями опыта и виртуализацией профессиональных навыков в отдельном левополушарном контейнере, куда нет доступа эмоциям. Вряд ли он вырастет из человека, которого так заботливо оберегали от любого ограничения свободы материться, что он страшно переживает по этому поводу».
Можно высказывать человеку в лицо неприятную правду так, что он при этом не будет чувствовать себя оскорблённым и униженным. А можно по пустяку облить его говном. Токсичность это именно второе. Токсичность можно простить человеку, если ему немного лет (например, подросток — такое поведение для них типично), но взрослого токсичного мало кто будет терпеть, т.к. это явная распущенность, признак того, что человек непомерно самовлюблён и не желает работать над собой.
Кстати, я заметил, что токсичные люди, как правило, очень не любят токсичность в свой адрес, и быстро затухают, отведав своих же пирогов.
Дочитал сверху и до сюда, не могу понять кто пытается запретить конструктивную критику и где?
А я всегда считал, что токсичность отличается от просто неприятного характера своей заразностью (хотя это не следствие из термина в его первоначальном значении). Т.е. токсичный человек раскалывает коллектив, и все постепенно начинают вести себя так же, а то и хуже, начинаются подозрения, обидки, интриги всякие и прочее. Возможно, это неверное толкование, но оно основано на личном опыте взаимодействия с подобными людьми.
Когда человек сношает мозги на ровном месте, из мухи раздувает слона, тратя кучу времени и сил там, где можно обойтись несколькими точными и спокойными репликами.
А когда человек предлагает заменить «fuck» на «hug» — это сношение мозгов или борьба с токсичностью?
Если по существу: взгляд автора я разделяю не до конца, но таки слегка разделяю. Если нужно быстро решить важный вопрос, куда производительнее покрыть друг друга
Вообще, мат — это DSL.
Хотя может быть это уже подсознание на что-то намекает в тяжёлый понедельник. )
Это синдром абстинентный, а лексика обсценная.
Не лучше ли "- вот в требованиях есть (подразумевалось) такое поведение, а в этом коде оно не реализовано, надо реализовать. — требования нечёткие, но теперь я понял, пошёл реализовывать, а ты уточни требования, чтобы QA не поняли так же как я сначала и не заводили несуществующих багов"?
Не лучше ли "- вот в требованиях есть (подразумевалось) такое поведение, а в этом коде оно не реализовано, надо реализовать. — требования нечёткие, но теперь я понял, пошёл реализовывать, а ты уточни требования, чтобы QA не поняли так же как я сначала и не заводили несуществующих багов"?
Да, так отлично. И мало кто назовёт такой диалог «токсичным»:
1. Нет никаких оскорблений, грубых слов или повышенного тона.
2. Нет претензий сотрудников друг к другу. Есть неработающий код, невыполненные требования, неуточнённые требования, несуществующие баги. Это проблемы, которые нужно решать и устранять. Обычная рабочая ситуация.
Топикстартер слишком толерантен для того, чтобы называть вещи своими именами.
старое определение это «энергетические вампиры»
Это старое выражение услышал только с десяток лет назад от "высокодуховных дев", именуемых в народе более точным термином "дуры". Начитались бредней журналюшек и понесли безмозглую шизу в массы.
Почему-то активно продвигается мнение, что нельзя критиковать людей, нельзя вообще высказвать им негативную оценку.
Можно высказывать негативную оценку, но не стоит переходить на личности. Например: «здесь можно исправить следующие вещи...», вместо «ты — редиска и весь твой плох». Это влияет на самооценку людей и рабочее настроение, которое сильно портится
Аврал в работе программиста если и не норма, то явление частое и надо быть к нему готовым. Нельзя отловить все баги на деве, обязательно случаются ситуации, требующие срочного решения. Надо быть готовым к тому, что хотя бы день в году будет проведён в экстремальном режиме, возможно это будет экстремальная ночь, если всё плохо то и экстремальная неделя.Раз в год это нормально. Раз несколько месяцев — относительно нормально. Если аврал постоянный и бесконечный, значит что-то нужно менять.
Неожиданный факт — программисты не хотят работать без печенек.
Сейчас де-факто это стандарт. Купить самому можно, но это надо идти в магазин: ) К тому же часто идя на кухню команда продолжает работать и обсуждать рабочие моменты и профит от этого сильно больше чем от полкило печенек за 100 рублей.
А вообще дружелюбность это просто и приятно. Вот серьёзно. Когда ты просишь человека рассказать и получаешь вежливый и мотивированный отказ это одно, а грубый и хамский это другое. Получив хамский ответ в следующий раз ты обратишься за помощью/посказкой лишь в крайнем случае, при этом упустив драгоценное время.
Можно высказывать негативную оценку, но не стоит переходить на личности. Например: «здесь можно исправить следующие вещи...», вместо «ты — редиска и весь твой плох».
А «ты херовый программер, простых вещей на знаешь, тебе зарплату платят как синьору, а ты на джуниора еле тянешь. учи матчасть, блеать!»
Это в вашей классификации на что тянет? На личности?
Критика не конструктивна. То, что человек не знает каких-то простых вещей ещё ни о чем не говорит. Он просто мог не сталкиваться с какой-то ошибкой/фреймворком/языком программирования.
Джуниор и сениор это понятия немного абстрактные. У меня был коллега, который пришёл джуном, но через месяц стал мидлом так как у него была очень молодая профессия да и сам молодой человек был очень талантливым.
Про зарплату это тоже непрофессионально упоминать, если ему платят, значит он заслужил пройдя собеседование. Если Вы считаете, что всё это незаслуженно, что работник непрофессионален, то можете обсудить это с начальством.
Всё это можно сказать гораздо более корректно.
Если этот программер, сын маминой подруги, которого не уволить, похерил работу команды за всю неделю и в ус не дует, то эти слова тоже будут не совсем неадекватны?
Ваша позиция напоминает позицию будущего родителя, который о воспитании детей читал только идеалистические советы Бенджамина Спока.
И я вас попросил провести границу между переходом на личности и критикой профессиональных качеств. Вполне конструктивной, кстати.
И я вас попросил провести границу между переходом на личности и критикой профессиональных качеств.
Мы говорим, не про критику кода, а про что-то типа ревью после полугода работы, да? Тогда про "херового программиста" надо убрать и получится без переходов на личности, пусть и грубо. Уберите "блеать" в самом конце, смените интонацию и получится критика профессиональных качеств. Ну, то есть она получится, если убрать про зарплату, а просто сказать, что уровень знаний не соотвествует должности.
Вполне конструктивной, кстати.
Для того, чтобы критика стала конструктивной, нужно перечислить простые вещи, которых не знает программист и сказать, что нужно знать, чтобы тянуть на сениора.
похерил работу команды за всю неделю и в ус не дует
Ну и конечно, если один разработчик может похерить работу команды за неделю — это красноречиво говорит о том, что процессы организованы из рук вон плохо и похоже на сениора там не тянет вообще никто.
Если этот программер, сын маминой подруги, которого не уволить, похерил работу команды за всю неделю и в ус не дует, то эти слова тоже будут не совсем неадекватны?То есть вы осознанно нанимаете джуниора под видом сеньора, даете ему сеньорские таски, а потом ему же начинаете претензии предъявлять, что он не сеньор? Божественная логика. Осталось только с позором уволить уборщицу из-за багов в продакшене, с таким-то подходом.
Опять же. Ну допустим, обматерите вы его. И что, после этого
То есть вы осознанно нанимаете джуниора под видом сеньора, даете ему сеньорские таски, а потом ему же начинаете претензии предъявлять, что он не сеньор?
Почему я? Начальство нанимает. Я — программер, работу которого он запорол.
я вообще люблю аргументированно эскалировать вплоть до владельцев бизнеса :)
я вообще люблю аргументированно эскалировать
И Вы наверняка делаете это вежливо и аргументировано а не матами, притом на всех уровнях.
Ну и перейти от нетоксичного к токсичному можно всегда, но не наоборот.
многие коллеги считают, что тратить энергию на такие вещи они не должны («я же не HR», «понабирают по объявлениям, а мне с ними сюсюкайся»), но сейчас я с таким подходом не согласен. нужно решать проблему, а не человека и в нормальном коллективе с нормальной структурой управления это всегда эффективная стратегия (из моего опыта).
в тех же коллективах, где много всего нездорового всё намного сложнее. например, если есть племянник директора, который косячит и его нельзя уволить, то да, люди начинают ругаться матом (причём часто друг на друга, а не на условного племянника — потому что он пожалуется и могут быть неприятности). и это разрушает коллектив и очень портит атмосферу. наверное, в таких случаях массовое «токсичное» поведение может быть индикатором того, что происходит какой-то кризис и нужно или срочно это фиксить или убегать. есть ещё такие варианты как стать частью этого неконструктивного процесса и уметь нахамить в ответ (очевидно, что в failed company такое сойдёт с рук) или постараться позиционировать себя как человека, к которому такое отношение недопустимо — у меня получалось.
но в здоровой компании, в здоровом коллективе — эскалация (вежливая, аргументированная) — почти всегда помогает.
Конструктив — это обмен конкретной информацией полезной для дела, помогающей достигнуть цели. «Учи матчасть» не говорит о том, какую матчать учить, почему именно эту матчасть а не другую, как применять изученное.
Если человек чего-то не знает, косячит и тормозит работу, то конструктивным поведением будет обучать его на месте работы (приставить ментора в пару, например), и, пока он не обучится, не давать ему критических задач, ставящих под угрозу весь проект. Если человек принципиально необучаемый, и при этом неприкасаемый, то вытеснить в «песочницу» где он может косячить сколько угодно, не вредя никому.
Высказывания типа «ты херовый программист» — это снобское писькомерство, потому что говорящий это неявно предполагает себя ох.ительным программистом, сидящим на вершине иерархии, откуда удобно кидаться говном, но в реальности почти всегда можно найти того, кто сидит ещё выше и может бросить говном уже в тебя.
Имхо, если это ещё и на практических примерах базируется, то это весьма уместный дружеский пинок. Потому что человек, которому сказано, явно на волоске от увольнения и начальство уже ищет ему замену. Кадровый дефицит позволяет такие ситуации, но они всё равно не длятся особо долго.
Вы почему-то решили, что приведённое выше высказывание — это способ обидеть, манипуляция и хз что ещё, но это ведь может быть чистой правдой.
А самые лучшие манипуляции состоят из правды
«ты херовый программер, простых вещей на знаешь, тебе зарплату платят как синьору, а ты на джуниора еле тянешь. учи матчасть, блеать!»
В этой фразе всё "прекрасно". А конструктива в ней ноль. Ну или предложите своё объяснение зачем тут, хотя бы, напоминание о том, какую зарплату платят? Говорящий думает, что человек не знает какую ему зарплату платят? Или, всё же, хочет вызвать чувство вины?
Просто указание на временный дисбаланс между квалификацией и оплатой. Хороший толчок, чтобы заняться профессиональным ростом, чтобы не потерять текущий уровень оплаты. Такие фразы не говорятся просто ни с того ни с сего, очевидно, что ей предшествовала какая-то ситуация из ряда вон, демонстрирующая фундаментальный провал в некой области, хорошие знания которой подразумевает занимаемая должность. Поэтому конструктивный посыл состоит в том, что знания в этой области необходимо срочно улучшить или можно оказаться без работы в ближайшем времени и без возможности найти другое место, на которое возьмут с такой же зарплатой.
Нет, не просто указание. Просто указание выглядит как-то типа "кажется мы допустили ошибку дав тебе такую большую зарплату, не проверив знаешь ли ты эти вещи. Может сможешь изучить быстро?". Правда же куда большая, чем первый вариант, не так ли?
А тут же именно толчок, удар даже по чувству вины и самооценке. не потому человек бросится учить, что обнаружились у него какие-то пробелы в знаниях, нужные на текущей позиции, а потому что ему будет стыдно что ему денег платили больше чем он заслуживает, и потому что он хочет быть хотя бы на джуна тянуть в глазах этого начальника и даже своих.
А если возникновение этих чувств не подразумевалось, зачем тогда такие выражения и оценки использовать?
Просто указание выглядит как-то типа "кажется мы допустили ошибку дав тебе такую большую зарплату, не проверив знаешь ли ты эти вещи. Может сможешь изучить быстро?". Правда же куда большая, чем первый вариант, не так ли?
Не так. Вы решили технично навесить чувство вины на руководство? Выглядит забавно, но это сюр. То, что сотруднику удалось ввести руководство в заблуждение на какое-то время, не снимает с него ответственности за самозванство. Безусловно он виноват, что пытался выдать себя за сеньора, не являясь им по факту. И если у него совесть не совсем атрофирована, то вполне естественно испытывать чувство вины при таком раскладе, причём задолго до услышанной фразы, а с самого момента трудоустройства.
А вообще я где-то пропустил, подразумевалось, что это фраза от начальника? В таком случае, куда логичнее звучала бы более конкретная формулировка:
"Если ты в ближайший месяц не подтянешь свои знания по ..., то мы вынуждены будем тебя уволить или урезать зарплату, т.к. выяснилось, что твоя квалификация не соответствует занимаемой должности."
А то исходный вариант скорее как последнее китайское предупреждение выглядит.
Ну и по-моему мнению, в индустрии мало реальных самозванцев, хотя бы потому что нет чётких критериев сеньорства и люди, подающиеся на сеньорские позиции, искренне считают себя им соответствующими. А это как раз руководство в широком смысле слова должно понять соответствует ли конкретный кандидат их конкретной позиции, на которую они приклеили ярлык «сеньор». Собеседования, тестовые, испытательный…
Ну обычно фразы о «тебе платят, а ты...» какое-то право только руководство, которое в курсе сколько и за что платят, имеет право моральное произносить.
Нет, не навесить вину на руководство, а «заставить» руководство признать ошибку, а не навешивать вину на объект этой ошибки.
А дальше то что? Сократить зарплату в 2 раза практически нереализуемо. Поэтому для руководства признать ошибку в данном случае == подписать приказ об увольнении или даже оформить процедуру увольнения за несоответствие занимаемой должности. Не самый лучший вариант для сотрудника.
Ну и по-моему мнению, в индустрии мало реальных самозванцев, хотя бы потому что нет чётких критериев сеньорства и люди, подающиеся на сеньорские позиции, искренне считают себя им соответствующими.
А Вы проводили собеседования когда-нибудь? Я бы сказал, что самозванцев в индустрии не менее 80%, ну или неадекватов (на случай, если искренне считают себя сеньорами). И как раз поскольку поток самозванцев настолько велик, есть вероятность, что допустим 5% из них проскочат через первичные фильтры. Хотя да, испытательный срок обычно не проскакивают.
Ну обычно фразы о «тебе платят, а ты...» какое-то право только руководство, которое в курсе сколько и за что платят, имеет право моральное произносить.
Ох-ты ж как завернул… Я выше уже привёл пример контекста, в котором подобную фразу мог бы сказать друг, который таким образом проявляет заботу. Но в целом вариантов разных можно придумать.
Проводил. Мне кажется, что вы сильно завышаете процент. Или сильно завышаете требования к сеньору.
Я всё-таки рассматриваю в контексте топика служебные отношения, а не дружеские.
Среди коллег тоже могут быть друзья, почему бы нет?
Мне кажется, что вы сильно завышаете процент. Или сильно завышаете требования к сеньору.
Да не, реально много людей, которые не знают совсем уж элементарных вещей, не тянут даже на мидла, но при этом пробуются на сеньорские позиции. Возможно у вас просто HR-отдел есть, который первичную фильтрацию осуществляет.
Знания, по-моему, вторичны должны быть на собеседованиях, практические навыки важнее. А HR по техническим скиллам не отсеивали. Может как-то проверяли психологическими приёмчиками верит ли сам кандидат, что подходит под требования, но не более.
Я понимаю сеньора (в числе прочего) как человека, которому может потребоваться в ходе работы решать задачи, готового решения которых не существует. Без такой возможности разве можно говорить о соответствующем уровне квалификации?
Что плохого в такой, например, критике: «Василий, ты неправильно поступил, послав десять запросов для получения данных по всем магазинам, можно было получить одним. Похоже ты не читал документацию, как будет время загляни в нашу вики, это тебе поможет решать такие задачи быстрее.»?
Василий, ты неправильно поступил, послав десять запросов для получения данных по всем магазинам, можно было получить одним
Это, в целом, нормально, хотя это можно и смягчить :)
Похоже ты не читал документацию, как будет время загляни в нашу вики, это тебе поможет решать такие задачи быстрее.Это тоже можно смягчить, но, скорее нормально. Я бы еще сказал что именно не так. Кроме того, есть вероятность, что Василий читал документацию, но в ней сказано неочевидно/непонятно и её стоит улучшить/поправить, чтобы другой Василий мог сделать правильно сразу.
Критика нужна, но она должна быть адекватной и по делу. Она может быть мягкой, нетоксичной, вежливой, но критикой.
Василий, ты неправильно поступил, послав десять запросов для получения данных по всем магазинам, можно было получить одним.
А если не 10 запросов, а 700 там, где можно обойтись 2-3?
Всегда есть граница, за которой самый конструктивный вариант критики — это "WTF?"
Василий, ты неправильно поступил, послав десять запросов для получения данных по всем магазинам, можно было получить одним. Похоже ты не читал документацию, как будет время загляни в нашу вики, это тебе поможет решать такие задачи быстрее
«Василий, неужели ты не видишь, что льешь расплавленную сталь прямо на мою ногу?»
Извините, не удержался :)
Как по мне, то не бывает. Бывают вещи с низким субъективным весом, каждая по отдельности вроде бы внимания не стоящая, но в совокупности оказывающая очень сильное влияние на решения. И даже сложно сказать, что стало последней каплей — отсутствие печенек или 23" мониторы, а не 24 как в среднем по рынку ожидал, а в идеале 27, или нелюбимая версия ОС, а может вид плохой из окна. В совокупности все такие вещи могут перевесить очередные "+500" к зарплате.
Работал раньше в офисе эконом-класса за МКАДом, там в обеденный перерыв в Перекрестке выстраивались огромные очереди из таких покупающих себе печеньки. Минимум полчаса стоять на кассе, ещё полчаса туда идти и выбирать. Я к тому, что иногда дешевле их таки централизованно закупить.
Это маленький плюс, уже ставший стандартом в отрасли. Я могу купить печенье в магазине, но если печенье есть это маленький, но всё-таки плюс, вишенка на торте. Если вакансия не очень, то никакими печенька и не завлечь. Я сомневаюсь, что когда-либо предпочту одну работу другой из-за печенья, но тем не менее это делает объявление более уютным и каким-то более добрым, что-ли.
Плюс, как я уже писал ранее, есть и другие плюсы сладкого.
Когда же, инженерная и научная деятельность превратилась в субкультуру?
Довольно давно. И я бы не сказал, что это что-то плохое.
Когда же, инженерная и научная деятельность превратилась в субкультуру?Давно была, еще до компьютеров. Научные споры и критика.
Ну, коли вы настолько широко трактуете термин субкультура, то спорить не стануНу, а что это не так? Есть разные направления в науке, это, по своему, определенные гетто, у которых свои праздники, шутки и печали.
Но возникает вопрос, если каждый имеет право на работе проявлять свою субкультурность, то как взаимодействовать и не угробить проект/компанию?Так вот здесь и возникает токсичность, когда всё по феншую катиться в тартарары, то можно посопротивляться (но тебя назовут токсичным) или же расслабится и получать удовольствие.
Токсичность же, всегда направлена на личность или коллектив. Тут и проходит граница.Умение оскорбить ближнего своего без прямого физического контакта — это высшая форма, не каждому дано. Присуща во всех слоях общества/культур/субкультур.
Никогда в известной мне практике, корректное поведение не приводило к провалам проекта.Да, когда всё хорошо, то почему бы и нет.
Но обратно, токсичное поведение часто приводило к кризисным ситуациям.Она может возникать от безысходности. Когда на твое действие выдается 3 косяка. Да, ты не виноват, но в целом всё идет ко дну и ты не хочешь всё топить, ты слишком много сил отдал. Бывает и такое. Но, токсичность ради токсичности — это уже клиника. Такие долго не живут.
Вот, помню, был в Википедии взаправдашний профессор, автор научных трудов. Но с одним недостатком — в спорах он крыл оппонентов ядрёным матом. Терпеть это не стали. И это в дремучие времена (лет 10 назад), когда ни о каких кодексах поведения в интернете никто ещё не задумывался.
А Торвальдса всё терпят… доколе?! :)
Linux's creator is stepping back from his Linux kernel work — to work instead on his behavior toward other developers.
www.zdnet.com/article/linus-torvalds-takes-a-break-from-linux
Чтобы трезво оценивать сложившуюся ситуацию, а здесь трудно не согласиться с автором, нужна все-таки холодная голова. Эмоции всегда все портят и заставляют человека бросаться из крайности в крайность. И то и другое плохо.
На самом деле проблема неприятия критики и обиды на неё довольно остра.
Недавно работала у меня в команде одна дама, писавшая дикий говнокод. Который конечно же иногда падал на проде и всех расстраивал.
На критику в процессе кодревью реагировала остро, а когда один из ее проектов я решил переписать с нуля (т.к. чем такого ребенка лечить — проще нового сделать) она обиделась окончательно и ушла в другую команду. Там стандарты, наверное, ниже :)
И если тут можно наверное всё списать на природную обидчивость женщин, то когда зрелые мужчины проявляют подобное поведение — это уже реально детский сад.
Само собой, что такое поведение свойственно и представителям мужского пола, но мой жизненный опыт подсказывает что у женщин это встречается чаще.
Возможно, что в данном случае это было связано с работой в преимущественно мужском коллективе и какой-то подсознательной необходимостью противопоставлять себя, я не знаю.
В любом случае, на мой взгляд, не таким должено быть поведение человека возрастом 30+.
Но видел пару раз крайне неприятных дам, которые совершенно не к месту употребляли «ну я же девушка», «это потому, что я женщина» и тому подобные манипуляции. Определённо, таких меньшинство, сильно меньшинство, но они есть. Как раз такие случаи задают стереотипы, не исключено что blind_oracle столкнулся именно с такой.
Да, в ИТ это пока что мой единственный негативный опыт работы с девушками.
Например, совсем недавно работал с совершенно спокойной и адекватной мадам, которая отлично писала на Си, PL/PgSQL, Go и еще всяком. И к критике относилась вполне трезво.
Но запоминаются, конечно, больше негативные персонажи к сожалению.
Ну а в целом, с этими детьми фиг угадаешь, во что они захотят играть, а во что — нет. Я играл во все подряд. Моя сестра — больше в игрушки для мальчиков. Мои дети — когда как, по мере взросления — больше в «целевые» игрушки, но это точно социальное влияние, потому что они часто приводят аргумент не «мне это не интересно», а что-то типа «не буду, потому что это для девочек». При этом, если у меня сын периодически видит, что я занимаю чем-то «для девочек» (ну там, готовка, например), ему становится «не западло» в это играть.
Но консенсус такой, что дети выбирают игрушки и цвета на базе каких-то своих интересов а не предпочтений, и социализация не причем.
Еще в тему, исследования о том что в наиболее свободных и «гендерно-справедливых» странах вроде Норвегии предпочтения по работе только усиливаются, а не наоборот, по гендерному признаку, опять же показывают что дело никак не в социализации или нечестном обществе.
Просто у разных людей разные предпочтения. И с этим нужно смириться.
с различной спецификой (например про девочек и розовый цвет)
Поясните, пожалуйста. А то есть подозрение (по опыту), что это очередные мифы про «розовый — женский, голубой — мужской», а не хотелось бы.
достаточно погуглить в современных изданиях
…
интуиция подсказывает что предпочтение цвета — не следствие процесса социализации
Вот как раз «погуглив» вы бы самостоятельно убедились, что есть конкретные озвученные мифы, это именно навязано и навязывается социумом, а это — часть процесса социализации.
Вот только про мифы «розовый-голубой» и их развенчивание я читал ещё до интернета и мало что изменилось. Но например, голубой цвет, и не только в одежде, но просто само слово, для многих (ну… фиг знает, сколько их на самом деле, но они повсюду) «мужчин» стал чуть ли не синонимом гомосексуальности.
Я ведь третий раз спрашиваю одно и то же.
«Хотя любой ответ слово, не любое слово — ответ» G-Kar, «Вавилон 5»
Ладно, буду считать это частью вашей токсичности :P.
www.sciencedaily.com/releases/2010/12/101220121109.htm
Я вот недввно сменил работу. Раньше был бесплатный кофе и печеньки, а теперь нет. И вроде бы оклад выше на треть, и работа интереснее, но всё равно обидно… заранее не спросил :(
Реклама на то и реклама, что требует броских фраз. Печеньками уже никого не удивишь, а тут скрытый месседж "они за печеньками прикрывают унылую тупую работу, а у нас типа работать интересно!". Мне вот больше всего понравилась и запомнилась такая фраза из одной вакансии 2-летней давности:
Мы не приемлем копипаст строчек вида echo something > /proc/net/…
со stackoverflow в качестве оптимизаций, а всегда стараемся докапываться до сути вещей.
А мои посты про настройку убунты — минусят
Хабр уже не тот…
Не каждый способен на здоровую конструктивную критику без перехода на личности. Чаще все выливается (каламбур :) в помои, коими надо облить конкурента (у кормушки/сердец юзеров).
Даже тут в комментах ( и лайках/дизлайках) присутствует.
Из-за этого получается, что рациональное мышление не одобряется, если оно порождает негативные эмоции. А то, что дает положительные эмоции, даже если оно не рационально — тиражируется и превозносится иной раз до небес. Если это не работает, тогда включаются государственные механизмы, которые наказывают «за недостаточную толерантность» нерыночными методами. Абсурд ситуации в том, что некоторые научные теории принимаются или не принимаются не на основе экспериментов, а на основе голосования! Причем голосование преподносится как демократия, но если гражданина N в темном переулке повстречают трое в масках и проведут «демократическое голосование среди присутствующих за перераспределение материальных благ гражданина N», то ни в тот момент, ни позже гражданин N не признает результаты голосования, хотя они были исключительно демократическими.
Некоторые специалисты иногда пытаются как-то объяснить к чем приведет выбор «А» или «Б», например — к росту энергопотребления и высоким эксплуатационным затратам, что перечеркнет любую выгоду от доступного сценария использования.
Меня то не обмануть покупкой игрового ПК за 300к руб под задачи типа «набор текста», даже для 3D моделирования это слишком избыточно во многих случаях (если предполагаемый уровень — школьные поделки). Но есть множество людей, которые ведутся и даже требуют таких же действий и от меня! А любые здравые рассуждения, что ресурсы в разы избыточны — срубаются под корень.
В дальнейшем это приводит к появлению игр, которые занимают 25-100 Гб, ничего нового не предлагают, но имеют лейбу «настоящий игроман мимо такого не пройдет» и соответствующим пренебрежительным отношением со стороны знакомых, которые стали зависимы от игр.
Если игровую индустрию можно обойти стороной, то IT уже намекает на то, что будет лезть из всех щелей со своим «интернетом вещей», когда обычная куртка будет требовать обязательно последнее ПО, которое уязвимо сильнее, чем процессоры Intel (намек на Spectre и Meltdown)
Зато у нас есть печеньки, их обновлять нам обходится куда дешевле, чем рабочии станции и стулья.
p.s. А имеет смысл в корпоративной сети сделать анонимный сайт отзывов? Фотка работника с должностью и любой раз в неделю может внести коммент. От безобидного «Как ни приду ты работаешь, ухожу вижу тебя, ты случаем не бот?» До вполне конкретного «Для любителей
Но аффект должен быть максимально исключен из рабочих отношений. Другой вопрос, что мир не совершенен. Много людей живут не своей жизнью, работают там, где не должны и заняты на специальностях, которые категорически не подходят их психическому аппарату. Все это понятно. Но в неидеальном мире как правило любое решение хуже. И нужно смотреть на то, где негативных факторов меньше. Но для насилия и психологического в том числе действует формула: чем больше насилия — тем больше насилия. В целом для компании эффективная стратегия: Тех кто не справляется дообучать. Необучаемых увольнять. (поощрять лучших и хороших не забывать бы еще) И если процесс выстроен хорошо, то каждый сотрудник сам точно знает, за что дают желтую карточку, и сколько желтых нужно набрать, что бы дали красную. В целом люди (а следовательно и компании) как и мать природа очень жадные до выдачи пряников. Поэтому норовят больше использовать кнут. Но положительное подкрепление тоже невероятно эффективно в правильных руках. И хорошо, что сегодняшняя культура и общественный консенсус в IT среде нацелен на укорот кнута.
В качестве бонуса пример из жизни — мне довелось поработать на компанию, которая делала исключительно гос заказы. Никакой борьбы с токсичностью, можно было послать менеджера матом или услышать мат от него. Попробуйте угадать как часто команде приходилось писать быдлокод или забивать на починку ошибок? При полном осознании того что делается. Более того при полном осознании что на следующей неделе сделанное придется откатывать и вываливать очередной хотфикс.
Кроме того, я приводил пример конструктивной критики. Если с ваше точки зрения это называется «вербальная атака», то «Передавайте за проезд!» стоит назвать вербальным насилием.
Я с глубоким отвращением отношусь к идее, что ко всем надо относиться как к некоему(любому!) меньшинству. Есть размытая, но достаточно общепринятая практика конструктивного общения — вежливость. Если человек требует к себе особого отношения, то пусть обоснует это и явно укажет. Эти ваши группы людей явно не норма. Обращение со здоровыми людьми как с психически нездоровыми откровенно нелепо.
В свете этого ваша теория отсутствия эмоций выглядит не особо достоверно. У вас есть некий абстрактный идеал и все должны ему следовать? Но почему? Если мне тимлид с каменным лицом скажет — пошли в переговорку, меня в пот бросит, я решу что серьёзно накосячил.
Если вам и вашему меньщинству это подходит — на здоровье. Если мы вдруг будем работать вместе, я постараюсь конкретно с вами так и общаться. Но как норму рассматривать это точно не буду.
Естественно я не разбираюсь в аутистах, что за странные укоры?
Проблема в том, что аутистов становится все больше. Особенно момент, когда изменение одного незначительного элемента сбивает всю работу, критично не только для аутистов, но и для многих взрослых людей, которые некомпетентны, но за ту з/п нужные компетенции в принципе не найти. И в случае отсутствия понимания работы могут выстраиваться ужасно сложные костыли.
И это в мире, где з/п начинается от 4 тыс руб (и я не из РФ, и не о РФ).
Проблема в том, что аутистов становится все больше.
Аутизм — это болезнь. Больных аутизмом больше не становится, это не заразно.
Существуют факторы, которые приводят к аутизму. И когда таких факторов становится больше, то и аутистов тоже может стать больше. Не забываем, что видов аутизма очень много и стать аутистом можно различными способами. Начиная от генетических проблем до психических расстройств, причем намеренно психические расстройства вызываются достаточно быстро у любого человека. Сроки — от нескольких месяцев до нескольких лет. И устойчивы только те, кто уже имеет какие-то определенные расстройства.
Причина — нейропластичность. Защита — избавиться от нейропластичности, но это является болезнью и человек перестает адаптироваться к изменению условий.
Самый элементарный способ — под действием таблеток, просто забивается мозг глюками и уже никакая разумная деятельность невозможна. Забивать придется долго — до нескольких лет.
Если мне тимлид с каменным лицом скажет — пошли в переговорку, меня в пот бросит, я решу что серьёзно накосячил.
Просто вы не привыкли к безэмоциональности. И легче ли вам будет, если мило улыбнётся перед тем как сообщить, что увольняет вас, а если кто попросит рекомендаций, то они будут крайне негативные?
Где и кем считается видимая безэмоциональность в рабочих отношениях психическим заболеванием?
Взгляд от первого лица, у человека проблемы в том числе и с эмоциями: habr.com/post/430224
Речь не об отсутствии эмоций, а об отсутствии их проявлений, негативно влияющих на рабочие процессы.
Это не вас, таких милых и хороших, пытаются загнать в резервации.
Это вы пытаетесь загнать нормальных людей в какой-то концлагерь из эквилибриума и исключить целый диапазон межчеловеческих взаимодействий из их жизни — а работа — это большая часть жизни, просто потому что у какой-то жертвы инклюзивного образования, которая не смогла подобрать себе работу с учётом своих медицинских показаний, от этого может испортиться настроение.
А ваш логический разбор аварийного действия с указанием на ошибку, как справедливо заметили ниже, у нормального человека вызовет гораздо больше паники чем старый добрый эмоциональный разнос.
И ваше предложение отрубать всем ноги по минимальному росту — гораздо более фашистское, чем старое доброе нормалфажеское прокрустово ложе, в котором можно или чуть присогнуться, или носочки вытянуть.
Если и есть какой-то уход в сторону интровертности и вот всего этого, то потому что это удобно и есть возможность, но не потому, что по-другому нельзя.
Среди признанных на мировом уровне персон тоже аутистов что-то не вижу. Взять Линуса того же. Или Гвидо. Вполне общительные люди.
Про аутистов — это всё сказки из 90-ых.
Люди, которые реально шарят в этом всём, не страдают от формы высказывания претензий к ним. Как раз потому, что шарят, понимают претензии и последствия косяков.
Измерение успешности — тут как мерять? По деньгам? Контраргумент по измерению денег: один пишет работу по криптографии, но зарабатывает посредственно, т.к. пишет ради фана, а на работе не напрягается, а другой программист делает простенькие мобильные приложения и получает солидные деньги за свою разработку.
Хотя среди себе подобных программисты легко социализируются за счет «рыбак рыбака видит издалека». Правда качество социализации зависит от отношения к одному виду, а не к разным, типа железячник с веб-дизайнером.
Но смею заметить, что современный IT мир стал настоящим прорывом в мир, к адаптации, к функциональности и успеху людей попадающих в аутичный спектр.Ну мы рады за людей которые в каком-то там спектре, но как это относится к большинству разработчиков которые ни о каких спектрах и не знают? Не думаете ли вы что они все должны как-то адаптироваться чтобы этой подгруппе safe space предоставить?
И если в самом начале еще можно говорить о каком-то благородстве, этике, воспитанности и так далее, то выше выигрывать будут совсем другие качества. Как бы отлично не работали все в отделе, место начальника одно и как бы вам не говорили, что будешь стараться — станешь выше, место все равно одно. И значит в бой пойдут далекие от рыцарских романов приемы. И чем выше, тем больше грязи. Увы, но там, где война за деньги, никто не будет думать о чем-то человеческом. «Ничего личного, просто бизнес» четко указывает где люди, а где деньги и кто из них главнее в такой модели.
Возникает ощущение по последним статьям на хабре, что выяснение отношений между обоими мирами — тема, которая волнует многих.
Любой пост на Хабре делит людей на как минимум две воинствующие группы.
Базовые — кто согласен и кто не согласен. А есть те, кому все равно или кому просто интересно встать сегодня с одной стороны, а завтра с другой стороны.
Если считаете изменение стороны — предательством, то вспомните, что у Свифта в «Гуливере» два народа воевали из-за того, что не могли определить с какой стороны яйца бить, поэтому для них любой, кто не придерживается постоянно одной стороны будет предателем-перебежчиком.
Наверно, между теми, кто уже ценит важность навыков профессионального (да и человеческого тоже) общения (читай, профессиональная этика), и теми, кто еще этого не делает. Как у сис.админов в бородатом анекдоте — "одни уже делают бэкапы, а другие еще нет". Это как с гигиеной. Мы можем сколько угодно отрицать ее важность, игнорируя правила, но, в конечном итоге, за последующие болячки все равно отвечать будем мы, т.к "не для нас эти правила писаны, ибо мы умнее".
На первой работе все были очень открыты, не стеснялись лексики, попоек после работы, вместе «дружили против начальства», устраивали дружеские, а иногда и семейные связи. При этом все очень спокойно относились к симпатиям или антипатиям, включая и комментарии «снова ты мне хойхню сформулировал вместо ТЗ, такое-то сделать нельзя, а это потребует месяцы работы!» Токсичность была, вместе с дедовщиной и ненавистью к выскочкам.
В другой фирме все были максимально вежливы и имитировали профессионализм, скрывали свои мысли и чувства. Дружеские попойки не поощрялись, 90% сотрудников общалось на «вы», и в целом все не любили всех. Это выливалось в токсичные переписки в комментариях к таскам, жалобам к начальству и вообще нездоровой атмосфере.
Третья работа была с иностранцами. Все были максимально вежливы, дружелюбны, отношения между сотрудниками отсутствовали. Не было друзей, врагов, любви или не любви, все делали одно дело и радели за его успех (поначалу). Даже намека на токсичность, вульгарность или вообще какие-то внутренние взаимоотношения не было.
Первая фирма жива и до сих пор, пусть и без намеков на рост или развитие, а людьми оттуда я поддерживаю отношения и через 15 лет после ухода. Вторая фирма совсем быстро завалилась. Третья весьма успешна и развивается.
Вердикт: не путайте токсичность, фамильярность и профессионализм.
фирма развалилась не из-за нетоксичностиВообще-то вторая фирма самая токсичная из списка.
Замечание может и справедливое, но никакого конструктива оно не несёт, а обидеть реально может. Может не надо делать таких замечаний, если по существу сказать нечего?
вместе с дедовщинойПредставил как на скрам-митинге сеньор выстраивает джуниоров и заставляет их держать мониторы в вытянутых руках, пока он рассказывает о текущем положении дел. Кто опустил раньше времени — тому «пробивают лося» клавиатурой.
Есть огромная куча других причин, по которым фирма преуспевает
Главный вопрос: что такое «токсичность отношений»? Вот когда определим границы этого термина, тогда и можно будет говорить.
Имхо, токсичность отношений — это когда общение забирает больше сил и времени, чем приносит пользы. Например, отношения с заказчиком могут быть очень тяжёлыми, но приносить хорошую прибыль. Кто-то стерпит за коврижки, кто-то пошлёт за любые деньги. Профессионализм тоже разный бывает, выше писали: программист не обязан умет терпеть закидоны, для этого есть слащавый «жополиз-продаван» (и это не отрицательная характеристика, а смысл профессии). Стороны сами решают, что есть «токсично» между ними. Высокий профессионализм в одной области может быть по-определению «токсичным» для клиента из другой области. Вся суть большой и дружной команды профессионалов не в том, чтобы подобрать группу разработчиков под каждого клиента, а в том, чтобы выстроить цепочку «преобразователей токсичности» от разработчика до клиента, например такую: разраб — тимлид — ПМ — руководитель отдела продаж — продажник — руководитель-клиент — конечный потребитель (покупатель, бухгалтер, продавец, курьер, другой разработчик и т.д.)
Относительно подковёрных интриг тоже много историй, вот одна от лично знакомого мне человека.
…
Разработчик приходит в компанию, работает три месяца, все с ним вежливы и обходительны. Через три месяца разговор с HR, в результате которого выясняется, что команда его ненавидит. После этого запой, переход в другую команду и паранойя.
А таки где здесь подковёрная интрига?
ЗАПОЙ, запоя, муж. Периодически повторяющееся болезненно непреодолимое влечение к опьянению спиртными напитками.
Вы молодец, конечно, но зачем это написали? Написать пост на хабре/фейсбуке/etc, когда что-то наболело – самый детский способ отреагировать. Типа "ой, вот так плохо, но делать я конечно ничего не буду, а просто вдоволь подраматизирую чтобы меня выслушали, а потом пошлю всех подальше". К чему приводят такие откровения? Ни к чему! К результату приводят действия.
Если у человека высокодушевные страдания и он считает что его притесняют, то пусть обращается либо в полицию либо в психиатрию.
А навязывать хрен пойми что хрен пойми откуда не надо. Если кому-то неприятно читать master/slave, то он может найти себе занятие по душе.
Доктора и режут и причиняют боль и руки у них в крови и ничто, не жалуются, если все по делу.
В мире мирных людей убивают в войнах, а тут CoC, да идите в жопу.
Если этот ответ будет в рамках закона, вообще плевать что он там ответит. Собака лает — ветер носит.
Я не знаю кто эти люди, которые двигают CoC я не знаю кто пострадал, никакой аналитики никакой экспертизы, но следовать почему-то надо.
Когда люди начинают заниматься не своим делом, начинается бардак. Потом введут организацию которая анализирует ваш код и выдает свидетельство соответствия. Остальной код станет вне закона. Такие телодвижения это популизм и попытка получить контроль, ни о какой заботе здесь речи нет, т.к. каждый преследует свои интересы.
В тебя плюнул тимлид, а ты в ответ в код нагадил (по УК и ГК не придерёшься) или баг не зарепортил, или закрыл глаза на баги в спеке (ведь валидация — не твоя обязанность) — хорошая атмосферка получается?Если мне человек плюнет в лицо, то я с него спрошу лично, если это будет публично, то это только усугубит ситуацию.
Следующий шаг это разговор с руководством, на счет того, что за быдлятник они нанимют на работу. А дальше уже будет все сильно зависеть, но люди в здравом уме так делать не будут.
В рабочем процессе переходить на личности — крайне не профессионально.
Человек может быть полным гондоном как личность, но если у него на выходе качественный продукт, значит он свою работу делает хорошо, значит он профессионал и точка.
Чтобы не гадили в код для этого должен быть процесс, который в принципе исключает попадание говнокода, по любой причине.
Я работал с военными: когда капитан послал полковника на 3 буквы на совещании. Отношения были натянутыми долго, но он его не уволил. Потому что не надо выносить личный сор из избы.
ну и тут как не вспомнить вот про это
www.g0l.ru/blog/imgs/letchik.jpg
В областях вроде авиации и автомобилестроения такое уже давно есть — гуглите стандарты DO-178, MISRA и т.п. Код чекается на соответствие автоматически и никакой тимлид уже не скажет, что код ему «пахнет» или где-то трёт — очень удобно, и уж точно лучше, чем когда какой-то мудак с бейджиком начальника самоутверждается за твой счёт.Вы не поняли, смысл проверки в выкачке денег, считайте сертификация на пустом месте.
Автор не рассмотрел две ситуации: 1) демотивация что-либо делать с позитивным (созидательным) настроем после токсичного инцидента и 2) а что делать, если токсичный вдруг ошибся, но был излишне самоуверен?
С чего это вдруг появится уважение к человеку, который игнорирует критику и советы?
Да не уважайте его, кто вас заставляет?! Просто с раздачей советов и критики прогореть можете вы.
Если вы поняли, что вас, умного, никто не любит, и вы придете к любому психологу, то с большой вероятностью он предложит вам попробовать не давать никому советов и посмотреть что будет. Вам самим то нравится, когда вам сыплют советы? Вы сами то их выполняете или игнорируете? У советов нулевая ценность, об этом есть тысяча афоризмов.
Критика имеет гораздо большее значение. Но критиковать надо еще уметь. Можно посмотреть у Зыгмантовича.
очевидный формат «Твой код плохой, я сейчас подробно изложу причины и дам советы» уже считается токсичным поведением
Да, такое поведение токсично. На Хабре уже были публикации о том, как этично делать код-ревью. Что-то вроде «Код-ревью с человеческим лицом».
Неожиданный факт — программисты не хотят работать без печенек.
Лично я предпочитаю не делать кофебрейки вообще. Заодно решается проблема с разговорами о рыбалке.
Однажды я (переписываясь с HR по поводу страховки, с оформлением которой они накосячили незадолго до моей поездки) упомянул о том, что еду на конференцию. Мой непосредственный начальник увидел это письмо и спросил у руководства, на какую такую конференцию они меня посылают. Те сказали, что ни на какую — первый раз об этом слышат. Поэтому начальник счёл, что я лжец, и был уверен в этом полтора года (но ничего мне не сказал). Пока не зашла речь о моём повышении, где он вывалил эту свою обидку как аргумент «наврал про конференцию».
Вот только конференция эта была (никак не связанная с местом работы), я на неё ездил за свой счёт во время отпуска. У меня оттуда куча фоток, и я там сдал экзамен на сертификат AWS. Об этом бы он узнал за 1 минуту, если бы спросил меня прямо. Но нет…
Я не социолог, но если это правда, то выхода кроме как принять это особо и нет.
В самом явлении я вижу как плюсы, так и перегибы, так что по мне явление достаточно неоднозначное. Плюс я сомневаюсь, что на просторах одной пятой суши умеют в дружелюбие, потому нам особо тяжело понять эти штуки.
«игреки», родившиеся в 1981 — 2000 ггУдивила такая классификация. Ведь это два поколения: люди, родившиеся в 1981, в 2000 завели своих.
Первые видели развал СССР и «лихие 90е», в юном возрасте — когда впечатления ярки. Родившиеся в 1998-2000 (в большинстве) застали только выделенные сети и мобильные у каждого.
Вы взяли такие границы «поколения Y» из какого-то источника? Хотелось бы изучить аргументацию.
Кто работал в бизнесе связанном с сезонными продажами, тот совершенно спокойно относится к кратко, четко и своевременно выраженным вслух комментариям и мыслям на великом и могучем.
Токсичное поведение же — это: неуместная критика (вместо того, чтобы поправить Главный Код ты зачем-то улучшал debug-output), это неконструктивная критика («да говно это а не код», «это выглядит как грязный прототип, а я ожидал не то, чтобы production grade, но хотя бы, чтобы это было можно читать»), это нападки на личности («ничего другого я от девушки/джуниора/фаната емакса не ожидал», «просто пойди и перечитай матчасть»).
Список на самом деле необъятен: любые усилия можно обесценить: «ну и нафига ты тут понаписал столько, если оно всё равно нафиг не сдалось?», «чем больше ты пишешь, тем больше мне потом переписывать, старайся коммитить поменьше», «да что тут делать, пол-дня максимум… это вы там сами разбирайтесь, это не моя проблема», можно оскорбить «просто пойди и прочитай что в учебниках написано», etc.
Русский архетип негативного перфекционизма подразумевает, что старший кормит младшего говном. В теории, младший, наевшись говна, должен проникнуться благодатью на начать творить шедевры (подразумевается, что в этот момент его перестают кормить говном и начинают закатывать в бронзу). Но на практике часто оказывается так, что младший, наевшись говна, через некоторое время начинает этим говном кормить тех, кого получается (младше, коллег послабее). А дальше вспоминаем анекдот про ковбоев и думаем, можем ли мы уменьшить количество говна на человека в день. Желательно до нуля.
Токсичное поведение же — это: неуместная критика (вместо того, чтобы поправить Главный Код ты зачем-то улучшал debug-output), это неконструктивная критика («да говно это а не код», «это выглядит как грязный прототип, а я ожидал не то, чтобы production grade, но хотя бы, чтобы это было можно читать»), это нападки на личности («ничего другого я от девушки/джуниора/фаната емакса не ожидал», «просто пойди и перечитай матчасть»).
А, так вот что такое эта ваша "токсичность".
Нормальный взрослый человек настроит персональный спам-фильтр и перестанет замечать эти особенности изложения мыслей. Пытаться вместо этого измерить pH словестного поноса из примеров выше и исправить кислотно-щелочной баланс — довольно глупое занятие.
Именно потому, с токсичным поведением (точнее, с отсутствием уважения) надо бороться системно, а не персонально.
RTFM — токсично?
Еще жестче — если там нет решения.
Насчёт «ограниченные возможности». Уже давно заменили на persons with special needs. Что в себя включает, внезапно, не только инвалидов, но и, например, маму с коляской (у которой special needs, ей нужен пеленальный столик и широкая парковка, чтобы ребёнка было можно достать), и человека без инвалидности, но, например, с временным нарушением двигательной функции (привет, сломанная нога).
Токсичность терминов в русском языке «master»/«slave» нулевая, в силу того, что эти слова никогда не использовались как унизительные. Замените их на «пахан» и «опущенный» (пахан отправляет сигнал опущенному и опущенный его слушается) — и вы почувствуете насколько неприятно такое читать native speaker. Хотя тому же англичанину «opuschenniy» ничего такого не скажет.
Ситуация коллективной прокрастинации — не токсична, но является проблемой.
Ситуация, когда «главный» использует некорректные слова в отношении контрибуторов банальным образом увеличивает трение в коллективе — вместо кода и проблем с ним, решаются проблемы с человеками.
Я понимаю, что вы отстаиваете право хамить. Простите, использовать любые слова какие хочется для того, чтобы уязвить другого. Простите, указать ему его место.
Весь вопрос вокруг «токсичности» совершенно не актуален для России — это проблемы первого мира. В инклюзивном обществе, в котором принято обеспечивать инвалидам 100% досягаемость общественных мест, матерям — пеленальные и широкие парковки, людям с расстройствами гендерной идентичности — возможность эти расстройства компенсировать или исправить, в таком обществе проблема токсичности — острая.
В России же есть куда более острые проблемы ксенофобии и нетерпимости, как политические, так и социальные. Так что все эти танцы с «токсичностью» выглядят примерно как «здоровое питание в котором поменьше пустых калорий и побольше овощей» для блокадника в 43 году. С жиру бесятся.
Не «барин и холоп». Это уже достаточно давно пройденная история. Что у нас тут ближайшее актуальное в культурном пространстве? ВОВ? Отлично. Фашисты и партизаны. Вот представьте себе ГОСТ, где написано «Фашисты вешают партизан, если партизан отказывается вешаться расстреливают его семью». Я верю, что лично вам это совсем и пофигу, но представьте себе реакцию прессы на такой стандарт. Объясняю в чём проблема: включение такой терминологии в стандарт приводит к нормализации этой семантики. Даже через омонимию (синонимы) — но приводит. Мы-то знаем, что «фашист» — это центральный сервер, а «партизан» — неудачный запрос, а его семья — это все смежные запросы. Но звучание всё равно не то.
(следующий вопрос)
… И чем такая прокрастинация будет отличаться от прокрастинации вида: «это говно». «это не говно, это ты мудак», «нет, это ты мудак, а твоя мать состоит в половых отношениях с тобой». «нет, это твоя мать состоит в половых отношениях со мной и с тобой».
Я не понимаю, почему вы предполагаете, что вежливость замедляет процессы. Их замедляют люди, а они их замедлят как с помощью грубости, так и без них, если захотят. И возможность грубить — в ответ ли, или первым, никаким образом процесс не ускорит.
(следующий вопрос)
По вашей аналогии — вы хотите иметь право хамить в ответ на то, что вы считаете «сношением мозга».
Это ваше право — хотеть хамить. А у других людей есть право исключить вас из списка коммитеров, прекратить с вами общаться, разорвать трудовые отношения и т.д.
Цитата: «Я заявляю, что это отравляет процессы,». и ещё цитата с сокращениями: " Либо давайте… научные работы в которых явно доказан вред этого.".
Линус сам признал, что перегибает палку и взял таймаут остыть. Вместе с этим прилетел code of conduct, так что я не до конца понимаю, почему вы эту фигуру в свою пользу трактуете.
По поводу проблем с дискриминацией в США — вы совершенно правы, она во все поля. Вот в рамках борьбы с этой дискриминацией и оскорблениями (в т.ч. по рассовому признаку) и придуманы правила поведения. Чтобы все могли спокойно и безболезненно сосуществовать.
У меня есть гипотеза. Вы почему-то считаете, что наличие code of conduct и запрет токсичного поведения отменяет меритократию.
Он не отменяет, он дополняет. Так же как запрет на убийство совершенно не отменяет меритократию при рассмотрении PR.
К сожалению (разумеется, это фигура речи), у меня в биографии нет подходящих угнетённых родственников. Но, скажем, я не вижу ничего оскорбительного в шутках про рак, от которого у меня умерла бабушка. Про алкоголизм, от которого страдали оба моих деда. Про лишний вес, который есть у меня. Про развод родителей. Про смерть любимых домашних питомцев. Нет, в принципе, если долго, точно и зло шутить на эти темы, я думаю, меня можно вывести из равновесия. Но чтобы у меня бомбило из-за того, что где-то какой-то термин как бы намекает на что-то… Это нужен какой-то инопланетянский склад ума, который я в принципе не могу понять.
Да, мне очень хочется приложить эту картинку. Понимаю, что здесь не двач, но, надеюсь, вы простите мне лёгкое понижение культуры дискуссии.
PS Многих чувствительные вопросы задевают, и ситуация, когда хорошему разработчику некомфортно из-за комфорта другого говорить обидные слова, это не очень хорошо.
Да, тут сталкиваются две свободы: говорить что хочешь и иметь свободу от нападок и (всего того, что включают в токсичные проявления). Разные компании и организации проводят линию в разных местах. Где-то послать в три этажа — норма строительной жизни и ничего такого. Где-то использовать в терминологии оскорбительные или травматичные слова — уже вопиющий проступок.
На всякий случай, в мире опенсорса, всегда есть отличное право: форкните и создавайте своё комьюнити. С блэкджеком и оскорблениями.
Если вы такой не чувствительный, то как насчёт code of conduct? Почему оно вас тогда так задевает?Потому что всё идёт к тому, что половину языка объявят hate speech, и чтобы её заместить, придётся учить целый новояз.
Когда я говорю, я хочу думать о том, как точнее выразить мою мысль, а не о том, не оскорбят ли мои слова какой-то из 732 гендеров.
Право не слышать нехороших слов можно отнести к праву на достоинство личности.
Ну так ради бога, никто не запрещает Вам заткнуть уши. (Права затыкать чей-либо рот, Вам, к счастью, никто не давал).
Один человек сделал доброе дело волщебнику.
— Просим у меня что хочешь! — сказал волшебник.
— Я хочу, чтобы у меня XXX был до земли.
Волшебник взмахнул палочкой, и у человека сильно укоротились ноги.
Так выпьем же за то, чтобы всегда правильно формулировать задание на разработку конструкторской документации!
Вот и Вы — поаккуратнее с формулировочками. Вы просили «права не слышать» — я сказал Вам, как легче всего не слышать. Про «чтобы никто и никогда про меня меня что-то нехорошее говорил» Вы уже потом вспомнили.
Кстати, вот ещё на ту же тему анекдот:
Идут Винни-Пух с Пятачком по лесу. Молчат, каждый о своём думает. Вдруг Винни-Пух с разворота залепляет Пятачку в рыло.
— Винни, за что?!?!?
— За то, что идёшь тут, свинья, молчишь, думаешь про меня всякое...
Как право на жизнь заключается не в праве увернуться от пули, а в праве на то, что пуля не должна быть выпущена.
А право человека с ружьём заключается в том, что на стрельбище он может палить по произвольным целям, а если в этот момент Вы там грибы собирали и впёрлись на линию огня, то это уже Ваши проблемы.
А право человека с ружьём заключается в том, что на стрельбище он может палить по произвольным целям, а если в этот момент Вы там грибы собирали и впёрлись на линию огня, то это уже Ваши проблемы.
Интересно, про «Ваши проблемы» относится также к инструкторам и другим посетителям стрельбища, которые не «впирались» на линию огня, но попадают под определение «произвольная цель» (так как находятся на стрельбище)?
«Поаккуратнее с формулировочками» (С)
При проведении стрельб на стрельбище (полигоне) назначается оцепление, показчики мишеней, а также другие лица, обслуживающие стрельбы.
Границы стрельбища открытого типа обозначаются на местности надписями: «Стрельбище», «Стой, стреляют», «Проход и проезд запрещен», которые устанавливаются в пределах хорошей видимости, а также в местах пересечения троп и дорог, ведущих на территорию стрельбища. При необходимости границы стрельбища (тира) могут окапываться траншеями. Все дороги и пешеходные тропы перекрываются шлагбаумами или другими заграждениями. Кроме того, в ближайших к стрельбищу (тиру) населенных пунктах вывешиваются объявления на русском и местном (национальном) языках о запрещении входить, въезжать на территорию стрельбища (тира) во время стрельбы.
Вот список того, чего на ресурсе делать не следует
…
— Оскорблять других пользователей, не следить за эмоциями
Мат, оскорбления, переходы на личности, эвфемизмы, троллинг — хорошие способы быстро и надежно сменить текущий статус аккаунта на ReadOnly.
А я слежу за эмоциями. И абсолютно безэмоционально констатирую, что Барака Обама — негр. А он почему-то обижается и карму сливает.
P.S. Если непонятен мой посыл: я озвучил неперложный факт: Барак Обама — представитель негроидной расы (любой обладатель телевизора может лично проверить этот факт). Но в силу различных сдвижек в мозгах отдельных индивидумов возникает ситуация из известного анекдота "мама, он меня сукой обозвал!"
В целом, спор на самом деле не про свободу слова, а про обязательность уважения. Вам говорят «вы обязаны уважать», а вы в ответ «имею право не уважать».
Впрочем, с вами-то, конечно, такого не случится.
Вам просто не нравится, что вас заставляют быть вежливым там, где вы не хотите быть вежливым.
Таким образом мудаком меня ещё не называли.
Более того, я даже затрудняюсь сказать, что будет более неуважительным и невежливым, сказать, что я мудак, или воспроизвести ваше высказывание.
Мысль, которую я хочу донести: «право говорить человеку что хочешь, даже если он не хочет этого слылшать», которое вы отстаиваете, это право на хамство/грубость/etc. В целом, по жизни, у вас это право отнять никто не может, однако, в отдельных коллективах его ограничивают. Аналогично дресс-коду, например. По жизни вы можете ходить в гавайской рубашке — а в офисе только в костюме.
Вот так же и с code of conduct. Договорились — соблюдаем.
Подрезать можно до тех пор, пока оскорблённый не потащит вас в суд… Не очень уютная обстановка на дороге будет.
(Кстати, именно это для меня сильнее всего отличает Кипр от РФ — тут (Кипр) водят довольно плохо, но никто никогда не подрезает никого, чтобы «наказать», никто не пытается объехать тебя по полосе на поворот и втистнуться перед тобой — на дороге просто нет злобы и раздражения. Очень легко пропускают.
Вот такого же я ожидаю и от сообществ в opensource. А не как в Питере в пробке на въезде в город (где стоишь уныло, а по обочине прям десятками прут).
И «мы» не навязываем среду и прочее, «мы» или выталкиваем инородное из своей среды, или выходим из чужой. Классическое «не вписался коллектив».
Это не суды линча, это выбор свободных людей не общаться с токсичным человеком.
Ну так пусть не общаются — если не хотят. Проблема в том, что они не дают другим людям общаться с человеком, которого сами считают токсичным. Вы правда-правда не видите тут ничего неправильного? Или, по-Вашему, "есть две точки зрения — моя и неправильная"?
… Сервис может начать дискриминировать по, например, половому или национальному признаку, и тут мы как раз погрузимся в дискуссию об инклюзивности.
Т.е. я как раз не понимаю к чему этот пример. Я тоже использую рейтинги других пользователей для выбора исполнителей.
… Я как потребитель имею право использовать любые критерии выбора поставщика услуг. Начиная с «лояльности бренду» и заканчивая высказываниями их CEO относительно ананасов на пицце.
Если же он едет так «из принципа» — он нарушает code of conduct на дороге.
Что, в общем-то, не дает абсолютно никакого права другим участникам ДД каким-то образом его «ущемлять», «учить» и любыми другими путями принуждать к соблюдению некоего Code of Conduct (существующего исключительно в головах некоторых водителей на этой дороге).
code of conduct на дороге называется ПДД.
Это, конечно, не так.
ПДД есть Правила Дорожного Движения, имеющие силу закона, а не сборник рекомендаций хорошего тона для участников ДД.
Кроме того, в ПДД нет определения ни понятию «помеха», ни, тем более «слишком малой скорости», соответственно, водитель может ехать хоть 10 км/ч, и если кто-то из других водителей подумает, что это нарушение какого-то там Code of Conduct — ну что ж, это его проблемы.
code of conduct так же имеет силу «правил сообщества» (примерно такими же будут «правила поведения в клубе» в каком-то заведении).
Определения может и нет, а текст я из ПДД цитировал.
Это классическая «дыра» в ПДД. Да, де-юре ехать слишком медленно нельзя. А вот сколько это «слишком медленно» — написать забыли. И что такое помеха — тоже не написано. Поэтому апеллировать к этому пункту — ну такое себе.
code of conduct так же имеет силу «правил сообщества»
Только в одном-единственном случае — если некто считает себя участником сообщества.
(примерно такими же будут «правила поведения в клубе» в каком-то заведении).
Это, конечно, не так.
Если кто-то нарушает правила поведения в клубе — его выведут.
С дороги вас никто не имеет права вывести, если вы не нарушаете ПДД, а просто едете медленнее некоторых.
И что такое помеха — тоже не написано.Написано.
«Уступить дорогу (не создавать помех)» — требование, означающее, что участник дорожного движения не должен начинать, возобновлять или продолжать движение, осуществлять какой-либо маневр, если это может вынудить других участников движения, имеющих по отношению к нему преимущество, изменить направление движения или скорость.И тут то как раз коллизия и возникает. Если у остальных участников движения преимущества нет, то и помеху им двигающийся медленно автомобиль создать не может.
Написано.
Ну на самом деле это описание «не создавать помех», но можно попробовать применить, согласен.
Если у остальных участников движения преимущества нет
Ну если взять обычный поток из обычных водителей (про спецслужбы-мигалки — все и так понятно) какие могут быть преимущества? По-моему, никаких, все равноправны в данном случае. Если ошибаюсь — давайте аргументы :)
Вы её (возможность аппеляции к здравому смыслу) отрицаете и хотите жёсткой кодификации всего.
Я знаю, что так быть не может
Так быть может. Если есть «ряд тезисов с неопределенностью» — берем эти тезисы, улучшаем, вводим новые понятия и максимально добавляем определения, чтобы исключить разночтения. Да, это несколько… утопично, но — не невозможно.
Вы её (возможность аппеляции к здравому смыслу) отрицаете и хотите жёсткой кодификации всего.
Жесткая кодификация всего, что касается источников повышенной опасности (а автомобиль как раз оно) — это замечательно, поверьте.
А что касается «здравого смысла», так это все субъективно.
Вы её (возможность аппеляции к здравому смыслу) отрицаете и хотите жёсткой кодификации всего.
И это говорит человек, который незадолго до этого утверждал, что аппеляция к здравому смыслу невозможна, и что кодификация межчеловеческого общения — это необходимо, круто и классно.
Знаете, это уже не пушка, а целая батарея береговой обороны.
Лично у меня сложилось устойчивое впечатление о том, что вы считаете, что апеляции к здравому смыслу в общении между людьми недостаточно, и что без наличия кодифицированых правил этого самого общения, все сразу же скатятся к обкладыванию друг друга #@! ми.
Прошу меня извинить, если это не так.
Мой комментарий был о том, чем токсичное поведение отличается от конструктивной критики.
Зачем в обществе code of conduct? Чтобы если кто-то начинает вести себя некомфортно для окружающих, ему можно было бы указать на правила.
Правила уровня code of conduct пишутся не как легальные документы, со строгими определениями, а как набор идей о том, как должно быть устроено общество. Безусловно предполагается, что люди (в т.ч. человек, которого отправили читать Code of Conduct) действуют из лучших побуждений, но их модель поведения отличается от принятой в сообществе. Предполагается, что человек прочтёт и учтёт. Если человек пришёл с плохими намерениями или использует общение с сокоммитерами как отдушку (сказать им всё, что я оних думаю), то никакой code of conduct ему не поможет.
У code of conduct есть ещё одно применение: если возникает резкий конфликт между участниками, окружающие могут (самостоятельно!) прийти к выводу о том, чьё поведение стало/является причиной этого конфликта.
В зависимости от governance-модели финальное решение (об экскоммуникации) принимается либо специальным человеком модератор/координатор/лидер проекта/человек с админскими правами в git'е, либо группой лиц (например, Technical Committee в Debian). Которые так же используют своё суждение о том, насколько поведение человека соответствует CoC.
Всё это базируется на здравом смысле и предположении добрых намерений. На самом деле лучше всего это описано в правилах Википедии:
ru.wikipedia.org/wiki/%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F:%D0%AD%D1%82%D0%B8%D1%87%D0%BD%D0%BE%D0%B5_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5
Плюс вот это:
ru.wikipedia.org/wiki/%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F:%D0%9F%D1%80%D0%B5%D0%B4%D0%BF%D0%BE%D0%BB%D0%B0%D0%B3%D0%B0%D0%B9%D1%82%D0%B5_%D0%B4%D0%BE%D0%B1%D1%80%D1%8B%D0%B5_%D0%BD%D0%B0%D0%BC%D0%B5%D1%80%D0%B5%D0%BD%D0%B8%D1%8F
(ссылки как всегда кривые — копипаст надо делать, ибо двоеточие).
Какая часть выражения "без необходимости" Вам непонятна? А необходимостемометр у Вас в кармане, или на глазок прикидывать будете?
Что, в общем-то, не дает абсолютно никакого права другим участникам ДД каким-то образом его «ущемлять», «учить» и любыми другими путями принуждать к соблюдению некоего Code of Conduct (существующего исключительно в головах некоторых водителей на этой дороге).
Ну вот это очень спорное утверждение. Мне бы как водителю такое не понравилось. Вам, я думаю, тоже.
Мне бы как водителю такое не понравилось. Вам, я думаю, тоже.
Это дает право на вышеперечисленные мной действия? Конечно же, нет.
Какие действия?
каким-то образом его «ущемлять», «учить» и любыми другими путями принуждать к соблюдению некоего Code of Conduct
У вас есть ещё варианты, как можно его научить?
Вариантов, как его «научить» нету по определению, ибо ни у кого нет права на дороге «учить».
А плестись медленно и тормозить весь поток значит можно?
Выше установили, что в ПДД нет точного определения, что такое «медленно».
явное неуважение к остальным участникам
Понятия «неуважение» в ПДД тоже нет. Человек едет по правилам = никто не вправе ему ничего предъявлять или, тем более, «учить».
На самом деле корень проблемы-то глубже, мы с вами частность обсуждаем, а если потянуть за этот корень, можно вытянуть такие омерзительные вещи, как «езжу по уму, а не по правилам» или даже еще хуже.
Выше установили, что в ПДД нет точного определения, что такое «медленно»
В ПДД может и нет, а с точки зрения здравого смысла — сформулировать без проблем.
Медленно — это значит существенно медленнее скоростного лимита (например, вдвое). При этом это не относится к тем, кто едет по правой полосе в случае двух или трёхполосной дороги, а также к фурам, которые физически или из соображений безопасности не могут быстрее, и к автобусам.
То есть к тем, кого нельзя обогнать, и кто сильно «режет» лимит, разрешённый на данной дороге по правилам (то есть заставляет всех тащиться намного медленнее, чем они могли бы ехать).
Да, этого нет в правилах, но это же и так для всех очевидно совершенно.
езжу по уму, а не по правилам
Вы полагаете, что «по уму» — это самое худшее? По-моему, неуважение к тем, кто рядом с тобой на дороге — куда хуже.
Вы полагаете, что «по уму» — это самое худшее?
Не самое, это частный случай некоей более абстрактной модели. Но да, ничего хорошего в этом нет, ибо ПДД имеют силу закона, и ездить не по ним = нарушать закон, такие дела.
неуважение к тем, кто рядом с тобой на дороге -куда хуже.
Да опять уважение, что ж делать-то. Ну вот допустим узнал я, что кто-то из потока меня, о ужас, прямо сейчас не уважает, дальше что?
ибо ПДД имеют силу закона, и ездить не по ним = нарушать закон, такие дела
Я и не говорю, что нужно их нарушать, я за соблюдение. Просто мне лично проще простить другому участнику нарушение правил, если это не было явным неуважением к другим (да-да, опять возвращаемся к тому же), и кроме того не несло существенного риска для меня и для остальных :)
Скорость должна обеспечивать водителю возможность постоянного контроля за движением транспортного средства для выполнения требований ПравилЗначит, если разрешены 90км/ч, а водитель считает, что уверенно контролирует автомобиль только на 45км/ч, то именно на этих 45км/ч он и должен двигаться.
Мне кто-то из знакомых говорил, что мол на ретро-автомобиле не разрешает ездить, поскольку он не соответствует нормам — в частности, по максимальной скорости, разгону и торможению. И что человек, который будет ездить на таком, будет мешать всем. Это мне правильно сказали, или выдумки?
На самом деле корень проблемы-то глубже, мы с вами частность обсуждаем, а если потянуть за этот корень, можно вытянуть такие омерзительные вещи, как «езжу по уму, а не по правилам» или даже еще хуже.
Притом этот корень влияет не только на поведение на дороге, но и на поведение в любой сфере нашей жизни. В итоге получаются перегибы из разряда «жизнь по понятиям» и куда менее заметные огрехи в виде «строгость законов компенсируется необязательностью их исполнения».
Вот только, каким образом можно это сознание перебороть, как изменить? Есть идеи, предположения?
И сидя на берегу реки ехидно потирать руки, когда все, кто это счастье строил, приближал и поддерживал будут спрашивать «А нас то за что».
«право говорить человеку что хочешь, даже если он не хочет этого слылшать»,
Брек, господа, брек!
Не путайте "право говорить (конкретному) человеку что хочешь, даже если он не хочет этого слышать" и "право говорить слушателям что хочешь, даже если среди них окажется один, который не хочет этого слышать"! Это весьма отличающиеся вещи. А то один про Фому, а другой про Ерёму.
И вы возмущены тем, что кто-то не хочет уважать ваше право не уважать других. ┐(´•_•`)┌
Или уважать право на свободу слова, или уважать тот факт, что кто угодно может объявить всё, что вы скажете, оскорбляющим его чувства.
Или создавать привелигированые меньшинства, которым даровано право оскорбляться.
Вот только проблема-то в том, что если сегодня вам запрещают говорить Васе, что он мудак, то, как показывает история, завтра вам просто непременно запретят говорить, что от деятельности Васи одни проблемы и разорение, потому что «Ты что, хочешь сказать что он мудак? Ах ты морда токсичная».
А привилегированые меньшинства начнут оттягиваться по полной. Просто потому что проверять границы допустимого — в свойствах абсолютного большинства человек.
Ну и в конце концов, если это общество считает меня достаточно зрелым, чтобы доверить мне управление источником повышеной опасности, воспитание подрастающего поколения, употребление наркотических средств, участие в избрании тех, кто будет этим обществом управлять и даже владение огнестрельным оружием — то какого, пардоньте, рожна оно не доверяет мне высказывать то что я считаю необходимым, тем, кому я считаю необходимым это высказать?
Тогда у меня есть два варианта: или несмотря на то, что всё вышесказанное мне доверяют, вы всё же считаете меня способным высказывать своё отрицательное мнение, выработанное без какого-либо весомого повода и непоощряемым в обществе методом, т. е. держите за несоцализированного идиота. Чем уже сами по себе меня, как человека более-менее разумного, просто катастрофически оскорбляете.
Или вы просто хотите заткнуть мне рот и оттяпать себе побольше общественных благ под тем или иным поводом. И тогда чем вы отличаетесь от вора, мошенника или коррупционера?
В целом, каждый из этих вариантов уже стоит того чтобы дефинировать вас таким образом, который воспроизводить публично мне образование не позволяет.
Если Х не уважает моё право не уважать его, то этим самым он реализует своё право не уважать меня.
Причём, заметьте, я-то отстаивал только наличие уменя такого права, в то время как ваш вежливый, цивильный и борющийся с моим правом его не уважать Х повёл себя как последний мудак, которым он и является, и напрямую реализовал в отношении меня то право, которое он пытается у меня отнять.
Так что или Х уважает моё право его не уважать, или он лицемерная редиска. Как-то так.
Свобода одного заканчивается там, где начинается свобода другого. Сообщества с открытым исходным текстом имеют полную свободу принимать или не принимать code of conduct. Если вам кажется, что там сплошные «мудаки», вы можете сделать свой форк этого ПО, в котором все могут называть друг друга мудаками, не рискуя при этом ни чем, кроме как получить «мудак» в ответ. И вот в этой волшебной атмосфере вы и можете свободно программировать… или называть других «мудаками», это уж что вашей душе больше по нраву.
В какой момент в нашей дискуссии возникло слово «мудак»?
В тот самый момент, когда кто-то вздумал расширять свою свободу не слышать неприятных вещей за счёт свободы кого-то другого говорить то, что тот считает необходимым сказать?
Сообщества с открытым исходным текстом имеют полную свободу принимать или не принимать code of conduct.
Это очень отдельная тема для очень отдельного долгого обсуждения: имеют ли сообщества какую-либо вообще свободу, и насколько свободно принятие этим сообществом той или иной вещи.
Ну и да, превращать дискуссию в полемику, прыгая с темы свободы слова, как одного из столпов свободного общества на конкретные примеры и передёргивая по чёрному — это определённо нетоксично и достойно борца с токсичностью.
Примерно настолько же, насколько нетоксичны требования исключения человека из проекта за высказывания семилетней давности.
Я не понимаю, правда, почему наличие языкового дрейфа вы используете как аргумент в этой дискуссии.
… Кстати, в Фидо вообще-то говоря, code of conduct был всегда, и составлял немалую часть полиси.
В англоязычной среде проблему решили очень просто — thou больше не используется. Все всегда на «вы».
И да, такой вариант лично мне по душе куда больше, чем если бы он нахмурился и сказал «ты чё мне тут указываешь (с прилагающимся трёхэтажным направлением)». Сохранив вежливость в момент отказа (хотя сообщение было предельно ясным «мне ваши советы тут нафиг не сдались») он позволил и мне аккуратно завершить дискуссию, и ему не ввязываться в обмен грубостями.
Кстати, о языковом дрейфе — слышал, что эмигранты в Нью-Йорке, разговаривая по-русски, называют чернокожих "баклажанами", дабы не произносить слово "негр".
…
Это было на тему: «юному бородачу, который плачет от шуток про ориентацию»
А теперь расскажите мне, как отлично я раскритиковал вашу статью и сделал её и вас лучше… вы ведь именно это пытаетесь донести, правда?
Если кто-то не может исправить ошибки раз за разом, как ему поможет ваша токсичность? Ровно наоборот он скажет — да этот чел просто мудак и даже не будет пытаться что-то изменить. Что мешает высказать что-то вроде: «На этой позиции нам необходим тщательный человек, с большим вниманием к деталям, попробуй сосредоточиться на подобных моментах, наверняка у тебя получится (если и правда когда-то получилось, стоит об этом упомянуть). Если нет, вероятно придется подумать о поиске другой позиции.» Если и после этого не дойдет — тогда уже увольнять или переводить где попроще, в зависимости от того, совсем человек долбоеб или где-то может от него толк быть. Профессионализм\эффективность с токсичностью не совместим, а к ним стоит стремится.
То пойдешь в айтишный детский сад (С).
Мне казалось, что физмат дает очень хорошую фундаментальную базу, что в купе с выработанной аккуратностью и собранностью и т.д. делает из человека хорошего программиста (сужу со стороны, сам я филолог). Конечно, наверное, в понимании физика уход из физики в чистое программирование — это движение вниз.
vasilenkos пришёл на Хабр?
Где вам приятнее задать технический вопрос и где вам скорее всего ответят по делу, на linux.org.ru или stackoverflow.com?
Да и профессионализм и вежливость это перпендикулярные шкалы. Обычно за высокомерностью и пренебрежением скрываются весьма неглубокие знания.
Профессионал во-первых не стесняется сказать, что он чего-то не знает, во-вторых тоже постоянно учится. И ему не страшно «потерять лицо», если он вдруг не помнит подробности какого-то протокола, т.к. всем очевидно, что кроме этого ему есть чем похвастаться.
Те же, кто позавчера в первый раз открыл конфигурационный файл, как раз часто и пишут все эти «man ssh» и «RTFM»
Например, я читал рассказ про то, как А толкнул Б и Б извинился перед А за то, что Б неудачно подвернулся под руку А. И только в этом случае Б считался вежливым, иначе представлял угрозу для общества за свое токсичное поведение и после нескольких таких проступков его могли казнить.
Думал, что это фантастика, но все больше мест вижу, где это становится реальностью.
Топикстартер задал вопрос о том, как сделать X. Я вкартце написал нужные для выполнения задачи шаги и инструменты. Зайдя на первые попавшиеся страницы документации данных инструментов и прочитав пару абацев автор с легкостью бы решил свою проблему. Но, насколько я понимаю, топикстартер даже не потрудился почитать что-то самостоятельно и попросил меня ответить ещё подробнее, что фактически равносильно написанию за него всего скрипта (о чём я и написал).
Следующий отвечающий сделал за автора всю работу двумя (!) разными способами, получил галку за принятый ответ, а в комментариях он и топикстартер исключительно вежливо обсудили, какие нынче злые люди на SO, приходиться постоянно «держать оборону» и как хорошо, что есть всё же понимающие, интеллигентые люди (не то что я, видать).
Про «написать скрипт за вас» — если его воспринимать как живой аналог leetcode, то почему бы и не написать решение, если есть желание помочь?
Про «написать скрипт за вас» — если его воспринимать как живой аналог leetcode, то почему бы и не написать решение, если есть желание помочь?
Если я правильно понял о чём Вы, то я на тот момент каждый день с такими скриптами возился, поэтому ещё один точно такой же мне не показался интересной задачей.
А желание помочь действительно, если честно, исчезло после ответа автора. Наверно, в этом и была основная проблема для меня.
Не вижу никакой токсичности в вашем ответе. Равно как и не вижу каким образом обсуждение под принятым ответом касается вас — зря вы приняли это на свой счет.
И если подумать, отправка читать документацию (типа «MSDN тебе в помощь») может быть токсичной для восприятия некоторыми людьми. Человек может решить что ответивший намекает что это вещь простая и он тупой если этого не знает и вообще ему нечего заниматься программированием раз такие вопросы задает, за такое спасибо не скажешь.
типа «MSDN тебе в помощь»
Может, конечно, за годы, прошедшие с того времени, как я туда последний раз лазил, многое изменилось, и там больше не пишут на 10 страницах ни о чем, но зато с картинками, и с помощью встроенной в него навигации теперь реально что-то найти… Но, по-моему, отправлять людей на поиски решения именно в MSDN — неприкрытое издевательство.
Попытайтесь там отвечать на вопросы — значительно больше трети заданных вопросов представляют собой чью-нибудь лабораторку, скопированную прямо из IDE, и подпись снизу: «вот, не работает».
Часть вопросов действительно выглядят как вопросы, но при этом являются прямыми дубликатами отвеченных вопросов, и разрешаются чуть ли не поиском названия самого вопроса в Гугле (на первых строках выдачи будет либо тот самый отвеченный вопрос, либо параграф из документации, описывающий как проблема решается). Итого, по крайней мере две трети (по оценкам на основе моего опыта в сообществе) вопросов задаются вообще без предварительной подготовки.
Оставшийся процент вопросов правда задан после ознакомления с большим количеством доступных ресурсов на эту тему, сформулирован с уважением ко времени людей, которые будут отвечать… и немалая доля из них погребены под лавиной остальных вопросов.
Я то отвечаю, но приблизительно 70% моих ответов не проживают и года, по причинам от «вопрос надо бы перенести в другой раздел» до «много ссылок на внешние ресурсы»,
А еще 20% редактируются индусами ибо «вот так лучше вроде бы сказать(замена одного слова» до полной невозможности понять ответ.
Ибо за редактирование постов и удаление SO дает плюшки, а за правильные непринятые ответы — нет(а непринятых ответов — 95%).
Люди принимающие решения о том, удалять или нет, редактировать или нет — с узкой областью незнакомы вообще.
В результате люди задают те же вопросы по кругу, ибо ответов, которые ты давал год назад — уже нет.
Я раньше считала по другому, пока один человек мне прямо на примерах не показал (я делала перевод его статьи на Хабре), что только серьезные и суровые IT-ки могут делать хорошие вещи. Не грубые, а именно суровые, которые не боятся программировать по 16 часов подряд, но которые могут в глаза сказать что вот тут и тут плохо и почему.
А сейчас что? «Школы для программистов»… еще бы «ясли для программистов» сделали, вот тогда вообще полный аврал был бы!
Вы сами понаблюдайте на любой конференции, особенно международной и сразу увидите кто пришел «со школы программистов», а кто реально крутой спец.
Я не против учить, даже надо, но я считаю (это только мое мнение), что учить надо только тех, кто сам этого хочет, кто сам нашел информацию по какому-то языку программирования и что-то пишет. Вот таким надо помогать. Но если принудительно, в школе, учить «программированию» то… мы получим толпы «синьеров», которые по факту ничего не могут, но будут свято уверены, что именно они являются «профи».
не боятся программировать по 16 часов подряд, но которые могут в глаза сказать что вот тут и тут плохо и почему
иногда случается и у
«синьеров», которые по факту ничего не могут, но будут свято уверены, что именно они являются «профи».
Как такое возможно? Писать костыльно-прикладными методами. На то, чтобы увидеть, что он не профи, требуется потратить очень много времени и усилий.
А есть иногда вынужденные варианты, когда человек знает и умеет как правильно, но финансовый, временные и прочие ограничения приводят лишь к использованию костыльно-прикладных методов. Особенно это касается Legacy.
И да — в школах, даже с лейбом, не всегда научат сразу и правильно. Чаще всего там начинают с азов и предлагают писать неправильно. Примеры — отступы, шаблоны проектирования, рефакторинг, комментирование. Хорошо, если хотя бы отступам и комментированию научат. В некоторых языках вообще приняты извращения, которые дают производительность, но сводят на нет читабельность кода, особенно для новичков.
И как бы вопрос к автору — если активно корежить эти «этические нормы», если не воздействовать на таких мудаков — что тогда делать? Тоже без особых зазрений его нах слать? «Сделай эндпоинт» «таски нет» «п… ответ! делай с… б..., и меня н...» — это типа здоровые рабочие отношения?
Встречный вопрос — а почему вы работали с мудаками? Что вам мешало сказать — Антон полнейший мудак, с ним невозможно работать?
Почему каждый недовольный статьёй обязательно имеет своё альтернативное прочтение явно изложенных мыслей? Я вполне однозначно говорю, что оскорбления в рабочих отношениях недопустимы.
Например, мне нужно убрать документацию в сейф, а ключи от сейфа у охраны и охрана ключи может отдать только старшему менеджеру. Причем в этот момент сейф абсолютно пуст, старшего менеджера нет (у него была другая смена), охрана стоит на своем. В итоге имеем документацию, которая должна быть в сейфе, но находится у меня «в наследство» от другого отдела, у которого документация была на обработке.
Хорошо, что меня в тот момент спасла камера наблюдения. Охрана у себя на посту глянула и увидел папки с соответствующим грифом на столе в виде нескольких больших стопок.
Это был единичный случай, но вот ситуации типа «ксерокс под замком» были каждый день. Ключи у охраны, а я должен не раньше чем через 3 месяца пройти сертифицированное обучение на пользование этим ксероксом и только тогда имею право получить ключ, а до тех пор вынужден просить старших по каждой мелочи, изрядно их доставая, хотя в моей работе тот аппарат был очень важен и требовался очень часто.
Как ни странно — та фирма существует и работает до сих пор, сфера — торговля. А я месяц там был и позже ушел оттуда. В отделе кадров сказали, что жуткая текучка кадров, а я даже не был удивлен.
Думал — то единичный случай. И вообще, я тупой и мне образования не хватает. Поступаю в университет, учусь и на лекции по менеджменту (в т.ч. по управлению предприятием) рассказывают, что существует «микроменеджмент», т.е. расписываются задания для каждого работника, но таким нерационально заниматься и планирование должно быть только на уровне отделов — кто и чем занимается. А работник как-нибудь сам решит поставленную задачу, думать о таком не надо.
И тут я понял — рассмотренная выше ситуация является системной! Т.е. от нее нельзя избавится просто на уровне предприятия, т.к. придут новые молодые специалисты и сделают все как было, их этому и учили. В лучшем случае. Ладно, такие «специалисты» могут и не дойти, т.к. на производственной практике такой «специалист» наорал на своего непосредственного руководителя на предприятии, «что поставленная задача сбора данных должна быть выполнена руководителем, а не молодым специалистом», а уже молодой специалист обработает данные как надо, в смысле — посчитает сумму и среднее арифметическое. Естественно, предприятие разрывает договор о взятии на практику и больше никого не брали (уже два года), даже с других специальностей и при отсутствии от остальных косяков.
tema_sun чуть ниже в своем комментарии написал, что «не надо на них воздействовать». Но когда все больше специальностей будет выпускать таких особей, тут уже никуда и никому не сбежать. И проступает намеками, что скоро даже в школе такое будет поставлено на поток, при условии, что соседние страны (Украина и РФ) уже внедрили или идут по пути внедрения.
«Все пропало!» — звучит слишком оптимистично, а бы сказал — даже очень жизнерадостно!
Это довольно неплохое правило жизни.
Code review по-человечески (часть 2)
На практике-то — хочешь брутальности — делай. Если ты руководитель — создавай в компании такую обстановку, не принимай на работу тех, кого эта обстановка не устраивает.
Если ты линейный сотрудник — не ходи работать в те места, где создана не та обстановка, которая тебе нравится.
Естественный отбор сам подтвердит или опровергнет твою позицию.
Как я и говорил ранее, естественный отбор покажет, правильна ли позиция автора. Если автор будет жить в соответствии с декларируемыми принципами и не работать в компаниях, которые хотят от него, по его мнению, «инфантилизма и безграмотности» (хотя, конечно, по их мнению они хотят вовсе не этого).
Довольно интересно, что все критические комментарии не оспаривают ничего сказанного в статье. Они лишь пытаются с разной степенью изяшности меня унизить а то и откровенно оскорбить.
Можно было бы сказать совсем иначе. Как-то так:
Я никогда не видел автора и, соответственно, у меня не может быть к нему каких-то чувств. Статья мне не нравится потому, что идёт в разрез с моим жизненным опытом.
Вы продолжаете упорствовать, что ваше состояние разума должно быть эталоном для окружающего общества.
Разница между мной и топикстартером в том, что он говорит «если я не знаю какого-то слова и кто-то из-за этого оскорбился — этот кто-то сам виноват». А я говорю «если я не знаю какого-то слова и кто-то из-за этого оскорбился — я лучше узнаю это слово и впредь не буду допускать подобных ошибок».
Ошибиться по незнанию может каждый и в этом ничего страшного нет. Топикстартер настаивает, что он не должен корректировать своё поведение после того, как ему укажут на такую ошибку.
А про коннотативный шлейф слов и выражений лингвисты диссертации пишут, поэтому даже для грамотных людей в некоторых ситуациях какие-то смыслы непонятны и могут приводить к недопониманиям. Тем более, что иногда этот коннотат схлопывается до чрезвычайно компактных социумов, типа для пары людей, разделивших общий опыт.
А «крайний-последний» — это не о том. Это личные заморочки каждого, имеют право, пока не начинают поправлять других.
Это пример самых простых и самых распространенных личных заморочек, на которые взрослые серьезные дяди всерьез начинают обижаться.
Считать всерьез обижающихся на эти заморочки взрослыми и уж тем более серьезными несколько… затруднительно.
Считать других какими-то не такими только из-за профсуеверий и профдеформаций?
Я не считаю их "не такими", с чего вы взяли? Просто это такой своеобразный маркер. И да, когда начинают навязывать вот это «крайний-последний», это бесит.
Хм, а как давно все местные пользователи дружно перестали обижаться на «Ты ж программист» и «Ты ж компьютерщик»?
Я на такое никогда не обижался. Чего обижаться, я и правда «компьютерщик», точно так же, как для людей не из медицины ЛОР, гинеколог, хирург, стоматолог — это все «врач».
Вы продолжаете упорствовать, что ваше состояние разума должно быть эталоном для окружающего общества.Я вижу в этом отсылку к Локку, вы намекаете на то, что я профан. Как токсично! Немедленно идити на курсы управления гневом!
То есть каждый человек должен знать, все говоры и жаргоны, не говоря уже о специфичных культурных отсылках?
Отнюдь. Каждый человек, по незнанию оскорбивший другого, должен извиниться и больше так не делать. А не вставать в позу «мне ваши культурные традиции неизвестны, поэтому я буду продолжать называть вас жидами и педерастами». Как альтернатива — перестать общаться с теми людьми, которые оскорбляются от его общения. Но этот выход доступен в основном вне рабочих обязанностей — вряд ли вы настолько ценный специалист, чтобы вся компания перестроила бизнес-процессы только ради того, чтобы избавить окружающих от вашей агрессии.
Я вижу в этом отсылку к Локку, вы намекаете на то, что я профан. Как токсично! Немедленно идити на курсы управления гневом!
Проверил и, к моему глубочайшему облегчению, я с вами вместе не работаю, поэтому могу и нахер послать без малейших угрызений совести.
Ровно наоборот — твоя корректность явно недостаточна, если ты постоянно непроизвольно обижаешь людей своей культуры.
А то что на самом деле думают — все равно.
И да, в интригах участвовать не надо.
В идеальном случае ничего про них не знать :-)
Подпишусь под каждым словом.
Ограничение свободы всегда мерзко, но ограничение свободы во имя "политкорректности" или "борьбы с хамством" — мерзко вдвойне.
Так что ли?
Не надо подменять понятия. "Ударить" — это не свобода. А вот ГОВОРИТЬ/ПИСАТЬ все, что угодно — без этого свободы нет. Слова — не насилие.
можно заменить "ударить" на "оскорбить" или "обматерить", суть не изменится.
Хотя я согласен что слова не насилие.
Суть как раз меняется принципиально.
Слова сами по себе ничто. Эмоциональный окрас им придает лишь субъективная интерпретация читающего/слушающего. Самодостаточного человека, которому вообще безразлично "а что обо мне думают/говорят", словестно задеть невозможно в принципе.
А вот те, кто от чужого мнения зависят — пусть себе страдают. Им, опять же, никто не мешает создавать свои собственные закрытые группы, но вот запрещать мат/оскорбления ВСЕМ ПОДРЯД — это перебор.
Элеонора Рузвельт говорила
Великие умы обсуждают идеи. Средние умы обсуждают события. Мелкие умы обсуждают людей.
Код — это материализованные идеи, его и нужно обсуждать, а вовсе не программистов его написавших.
Разные. И цели у них могут быть разными. Люди вполне могут быть соперниками/конкурентами, и вывести соперника из равновесия словами — зачастую полезный прием. Дающий массу преимуществ расчетливым и эмоционально непробиваемым.
Вообще, практически в любом сообществе "срач" — время от времени случается. И это нормально.
Даже "это код — плохой" на грани фола, по-моему.
Прежде всего эмоциональный окрас и цель задеть придаёт словам цель говорящий/пишущий. Даже если слушающего/читающего не удалось задеть, то цель-то была. А даже если вроде цели не было, но тебе объясняют, что эти слова задевают большинство людей в команде/компании/стране, а ты продолжаешь их использовать, то нечего удивляться, что команда/компания/страна объявляет себя своей собственной закрытой группой, где маты/оскорбления запрещены, а тебя из этой группы отторгают. Никакого запрета всем подряд, только участникам группы. Идите туда, где это терпят или вообще не обращают внимания, и там свободно материтесь.
Повторяю. Если читающему пофиг — его словами не задеть. Никак.
И никто не обязан ограничивать себя во имя хотелок большинства. Трогать чужое — права нет. Уважать чужие слабости/глупости — никто не обязан. Это личное дело каждого.
Ну а "слабые и неудачники должны погибнуть — таково первое положение нашей любви к человеку" (с) классик.
В целом всё-таки обязан. УК, например, об этом, в том числе есть статьи объективная сторона которых заключается только в словах.
"Трогать чужое — права нет" — хорошая фраза. И никто не имеет права трогать в том числе чужое достоинство оскорбления, уничижительными характеристиками и т. п.
Чужое = чужое имущество. Объективно существующие предметы.
А вот всякая субъективная дурь типа "достоинства", "чести", "настроения" etc — никого волновать не обязана.
Ну а любой закон, преследующий за слова — есть мерзость, подлежащая отмене. Желательно, вместе с отменой государства, эту мерзость принявшего.
То есть организаторов преступлений надо амнистировать? Гитлер или Сталин — нормальные ребята, потому что только говорили и это их право, говорить что угодно?
Хватит подменять понятия. Гитлер и Сталин не просто говорили — они приказывали убивать. Совершать ДЕЙСТВИЯ. А не просто глумиться над чьими-то там "чувствами".
Приказ — это слова, подмножество всех слов. Просто слова убедительные. А половина примеров тут если не больше потенциально токсичных фраз имеют целью убедить человека поступать так, как хочет говорящий.
Снова неверно. Приказ — подразумевает вполне реальные санкции (включая применение силы) за игнорирование.
Манипуляция же эмоциями — применением силы никак не подкреплена, и потому легко может игнорироваться.
И командир может манипулировать эмоциями вдобавок к санкциям, ну типа "Вы мужики или бабы?! Выполнять!" И какой-то ПМ или ТЛ может санкции наложить за неисполнение, когда его "просьба" исправить говнокод будет проигнорирована.
Но всё-таки вы согласны, что слова словам рознь и за некоторые слова можно и нужно карать?
Командир является таковым лишь потому, что его команды подкреплены силой — и проигнорировать его не получится.
Нет, не согласен. Карать нужно за насильственные ДЕЙСТВИЯ, а слова — могут быть какими угодно.
Ваше мнение, как минимум, непопулярно.
Это должен быть матёрый сисадмин со стальными яйцами, десятилетиями опыта и виртуализацией профессиональных навыков в отдельном левополушарном контейнере, куда нет доступа эмоциямдо конца не дочитал пока, но вот это огонь абстракция :)!!!
Сейчас с печеньками, смузи, непрокуренным офисом с дизайнерским ремонтом, и уважительным отношением друг к другу мне нравится больше.
Воспитание — это внутренняя несвобода. От которой лучше таки избавляться.
В жизни куда как разумнее подход адаптивный, априорно не исключающий никаких вариантов действий (включая и "злые", "токсичные" etc). В частности, с тем или иным человеком стоит общаться на том языке, который конкретно до него доходит лучше всего. Кому-то вежливо сказать. А кого-то — грубо послать. А вот когда второй вариант пытаются запретить — получается полная хрень.
Проблема токсичности, по-моему, не столько в том кому что говорить, а при ком говорить.
Да какая разница при ком? Кто там как воспринимает некий набор сотрясений воздуха или черточек на экране — это личные проблемы воспринимающего.
И уж лучше время от времени случающийся срач, чем постоянно слащаво-мерзостное "ребята, давайте жить дружно". Переходящее потом "не будем кушать свинину, вдруг обидится мусульманин Ахмет", "не будем называть черных неграми" и прочую сверх-мерзость "политкорректности".
Это перестаёт быть личными проблемами воспринимающих, когда это начинает влиять на других в целом, и на бизнес в частности. С большой вероятностью из команды в десяток человек примерно равных о деловым качествам будет уволен тот из них, кто свои устным, даже безадресным возмущением о "плохом" коде типа "какой чудак на букву "м" это написал?! понабирают студентов, руки бы пооткручивал" блокирует работу команды на полчаса, а не те, кто не могут полчаса сосредоточиться на фоне мыслей "я не мой ли код он смотрит сейчас?"
Нет, не перестает. Владелец бизнеса — да, вправе уволить тех, чьи действия его не устраивают. Причем, с немалой вероятностью, это будет как раз не "токсичный" спец, а тот обладатель "тонкой душевной организации", которого он обложил.
Но вот запрещать "оскорбления" и глум — не вправе никто. И нигде.
А почему в кавычках? Ну и как это никто и нигде? Я не могу в своем доме запретить кому-то выражаться грубо?
Потому и в кавычках, что "токсичность" — не более чем идиотский термин, придуманный эмоционально слабыми.
Запретить выражаться — нельзя. Можно лишь выгнать из своего дома тех, чьи действия чем-то не устраивают. И пусть дальше выражаются, только уже на своей или нейтральной территории, имеют полное право.
В целом так законы действуют, например на одних территориях запрещены лёгкие наркотики, а на других нет.
А почему в кавычках?Патамушта:
«Не тебя оскорбляют, ты оскорбляешься!»
«Оскорбления оскорбительны, только если на них оскорбляешься.»
«Если ты не оскорбляешься, тебя невозможно оскорбить.»
и тыды
Ничего не получится. В один промежуток времени можно делать только ОДНО дело качествено.
Именно поэтому людям предлагают печеньки и создают ультракомфортные условия.
Работа — это место, где должно быть уютно.
И уют нужен в первую очередь эмоциональный.
Если на стройке можно смело носить цемент с плохим настроением, то выполнять умственные труд с таким настроением не получится.
К автору поста:
Идите-ка вы в жопу с вашей «токсичностью»!
То, что вы называете критикой, это желание унизить и оскорбить другого человека. А если вы этого не понимаете, то «токсичный» человек, это именно вы. И вы отравляете людям жизнь.
P.S. Желаю всем побольше печенек, и поменьше токсичных людей в окружении
так, а что дальше? Разрешать проблемы «по понятиям»?
Токсичное поведение это неконструктивная критика, наезды, оскорбления, интриги и тп. Автор говорит о том, что похоже (и я в этом с ним согласен) некоторые личности в угоду себе извратили эти понятия и записали любую, даже конструктивную, критику в разряд токсичного поведения.
Пример: невозможность корректно выйти из ситуации при постановке задачи «сделайте нам налог shazam» программистам без серьёзной математической и физической базы. Ошибка уже совершена, поставлена задача тому кто её не сделает, но допустим менеджмент этого не понимает. Человек не обладает нужными знаниями, и для такой простой задачи как «узнать песенку», нужно годами учится и очень много чего пробовать и исследовать. Это нельзя прочитать на stackOverflow. И если человек не понимает собственных границ компетентности, то ему надо об этом сказать. А типа нельзя, ибо токсично. В таком варианте это именно критика человека а не решения, потому что не решит он эту задачу, ну никак. И надо этого человека с этой задачи снимать.
Так вот автор, вроде как, призывает к профессионализму и к открытой возможности высказать конструктивную критику. Ибо подход некоторых художников с «я так вижу» в программировании уместен гораздо меньше. И идея давай вообще критику отменим, ибо можно ей обидеть выглядит как идея давайте отменим ножи, ибо ими можно зарезать кого-то.
Electrohedgehog так?
Что интересно дальше автор приводит «реальный» пример из жизни, когда «суровый» мужик, а я как понял с другими автор попросту не общается, применяет эффективный в любых ситуациях «суровый» подход — «забухать», и в добавок начать всех подозревать. Вот это деловой подход. Правда чем этот случай отличается от «бородатого плачущего мальчика» величайшая загадка человечества.
Вместо этого он требует разрешения на посылание всех направо и налево, а так же прямо и назад, и чтобы ему за это ничего не было, потому что он умнее и сильнее.
Статья между строк читается так:
Вот уж че удумали, запрещать унижать джунов. Это же так полезно и развивающе! Ведь если я выскажу ему все, что я думаю о его личности, то это сразу улучшит его скилл! А токсичность это выдумки, потому что я это пережил, и других заставлю!
А когда находит — начинает раздувать из этого слона.
И даже после извинений и пояснений что ты ничего такого, чего он себе надумал, не имел в виду — всё равно называет тебя мудаком и фашистом.
Хотя по хорошему, вместо полушуточной претензии, высказанной тет-а-тет, ты имел полное право его абсолютно формально и будучи абсолютно в формальном праве отмудохать как бог черепаху с крайне далеко идущими последствиями.
Ещё хуже, когда это не мега-тонкая душевная организация, а рассчитаная манипуляция. Шкура у таких толще чем у нас с Вами вместе взятых, но это не мешает поднимать вой о том, что в комменте написали fuck — для привлечения внимания или для того, чтобы возглавить боротьбу и набрать авторитета.
Посылать и нужно любого, кого есть желание послать.
А всяким обладателям "тонкой душевной организации", которые, будучи "посланными", начинают ныть и жаловаться — стоит напоминать про такой способ решения всех их проблем, как "убиться о стену".
«Как вам такой расклад — получить отрицательный фидбэк от коллег без явных причин? И нет, вы не выясните подробностей» — зато последствия явные, менеджеры эффективничают напропалую, принимая решения и требуя «изменений в поведении». И нет, никаких деталей не предоставим, расследования не будет, кто обвиняет — не сообщим.
У тебя по публичным пять звезд и круто, а какая-то сволочь написала в частном про тебя что-то плохое, и твой рейтинг низкий. И возможно ты с ним продолжаешь работать на других проектах, он тебе улыбается.
И ничего не узнать.
С одной стороны, полезно, с другой — сильно раздражает, говоря культурно.
Я как разработчик (Senior Android и iOS) девушка с этим сталкиваюсь. Бывает, задашь вопрос в рабочей беседе, не замечание, корректно и не задевая ничью личность, даже если кто-то что-то не доделал (бекенд), сделал не то (дизайнер) или накосячил (джун), а тебе в ответ уже личные оскорбления, потому что человек вообще критики или намека на критику не приемлет в свой адрес. Еще и ПМ придет и тебя же обвинит в провоцировании человека с крайне чувствительной нервной системой. И минус тебе в рабочую карму и репутацию. И только потому, что ты девушка, а значит, источник скандала априори. И с принятием новых правил по безопасному психологическому климату такие случаи становятся чаще.
Программист уже не тот..
Кстати, небольшая случайно замеченная статистика по плюсикам-минусикам к самому первому комменту к данной статье.
Сразу поехали минусы, ушло в -5 — это те, кто мониторят Хабр онлайн. Чтобы не пропустить самое модное.
Потом начало выправляться, ± 2
И за ночь (по МСК): -1/+16
Вот когда настоящие программеры вылазят на Хабр!
(Ну или живут они в восточной части страны)
когда ему раз в полчаса пишет директор и спрашивает «Ну как? Готово?».
Намного интереснее, когда раз в полчаса в серверную\кабинет врывается один из топов и орёт о том сколько миллионов компания потеряла из-за нашей ошибки на данных момент и сколько потеряет за следующие полчаса, если мы не будем шевелиться резче. Веселее только учредитель рассказывающий байки о том, как начинал бизнес в 90-х, ненавязчиво намекая на возможность поездки в лес уже сегодня ночью.
Сам я работаю достаточно давно в устоявшемся IT-коллективе, и как бы не вижу ничего общего с упомянутыми ситуациями.
И да, у нас есть
«Что мы делаем не так?» (вопрос риторический, если что)
Какой нежный программист нынче прошел, не может выжить в карамельных берегах. и еще на хипстеров кивает при этом
Есть ненулевая вероятность, что автор — такой прямолинейный бунтарь только в одну сторону )
И ещё, что человечьи ритуалы — как ПДД. Не всем в них все нравится, зато заложенные ограничения позволяют ездить даже тормозам и слегка отсталым :)
Их полный список есть в политике конкретной компании. Тут уж я не знаю как принято у вас.
Вот последнее и плохо. Не работает естественный отбор.
Любопытная статья, но у меня по поводу этого в мозгу появился откровенно провокационный вопрос: указанная недопустимость смягчения критики и грубость она действует во все стороны по вертикалям власти или только с нижеподчинёнными и равными? В смысле — к начальнику тоже приходите и с такой хамоватой улыбочкой: "слышь, Михалыч, ты тут херню спорол! Совсем офигел? Ну ка вали и чтобы пока не переделаешь из офиса ни ногой". Потому что если не так то от статьи как-то лицемерием попахивает.
Ну и в целом я считаю, что в любой ситуации нужно оставаться человеком, а не превращаться в говно, "которого все ненавидят".
Зачем выводить людей на эмоции, если хотите получить результат? У Ст. Даймонда есть отличная книга про переговоры, он там хорошо рассказывает об эмоциональной составляющей и чем она вредна. У всех людей разная психика и разный предел прочности, зачем именно в этом направлении работать с ними?
Потом, программистами идут работать ради хорошей жизни, а не живут хорошо ради работы программистом. Почему хорошие условия тогда не должны быть приоритетом у них? Разве это не логично, не просто тупо харкодить, но еще и делать это в комфорте как физиологическом так и эмоциональном?
Я бы вообще убрал понятие «критика». Считаю, что должно быть конструктивное обсуждение тех или иных моментов. Критика — это часто эмоциональное самоутверждение и обозначение своего доминирования, пытающаяся через эмоции заставить человека следовать своим целям. Она как правило не направленна на улучшение ситуации, может быть поможет в единичном случае, но постоянной критикой вы просто будете «иметь» человека психологически. И тут с вами останутся на самом деле не сильные личности, а наоборот, слабые, кто не обращает внимание на чсв.
Кийосаки пишет про то, что нужно нанимать профессионалов. Неужели, вы не можете разговаривать с ними по существу, не прибегая к эмоциям? Тогда вопрос к вашему умению управлять людьми, насколько вы готовы видеть в них личности и именно профессионалов? Если нет, то да, выход — критика.
Программисты, конечно, взрослые люди.
Но.
Если и другая сторона описываемой тобой проблемы.
Коллеги могут оказаться троллями. Или мудаками.
Код ревью может повторяться вокруг одной ошибки только потому, что ревьювер «слишком гордый» и не в состоянии чётко сформулировать, что в коде не так. (В древности в интернете шутили, что RTFM как-то незаметно мутировало от read the following manual до read this fucking manual без указания конкретики).
«Что за бред — доверять управление сервером банка юному бородачу, который плачет от шуток про ориентацию? Это должен быть матёрый сисадмин со стальными яйцами» — ты не поверишь. Но чтобы вырастить матёрого сисадмина надо сначала взять юного бородача и гладить его по головке. Потому что если его каждый день п#здить, то очень скоро он забъёт болт на работу и уйдёт в дворники. И хорошо, если не повесится. (Другой вопрос, должен ли он в это время работать в банке ;))
Мне порой кажется, что самопровозглашённым пропагандистам надо по ночам читать книжки по воспитанию детей. Там всё очень хорошо описано. Глядишь, и мир станет чуточку спокойней.
Почитай про выученную беспомощность.
Она именно так и образуется. Берём человека, на каждое его действие даём пинка. Вуаля. Через годик он не может делать вообще ничего.
Положительное подкрепление тоже должно быть. Но почему-то все пишут только про пинки (== отрицательное подкрепление).
Присоединюсь ко мнению если на каждый косяк с "младенчества" давать пендель — то получим полное отсутствие инициативы в перспективе. Человек, который так "вырастет" мало того, что будет тупо бояться хоть что-то менять без 20-ти справок с печатями от менеджмента и 10-ти от юриста, так ещё и в стрессовых ситуациях, когда надо быть решительным замкнётся в раковине (читай запрётся в подсобке) и фиг ты от него получишь хоть какую-то эффективность.
Человек, который так «вырастет» мало того, что будет тупо бояться
Поддерживаю. Я лично знаком с парнягой, которому тупо не повезло с самым первым местом работы. За любой малейший косяк матом орали так, что стены трещали. Знаете, чем это кончилось? Прошло 20 (двадцать, Карл!) лет, человек до сих пор перепроверяет по несколько раз все изменения, которые он внес в системы, не накосячил ли он. Несколько в данном случае означает, например, в рамках ночных работ поправить несколько строчек в конфигурационных файлах, когда закончил править последний — открыть все, начиная с первого, проверить еще раз, а потом все еще раз — с последнего, пойти спать, поворочаться, встать, запустить терминалы и проверить все файлы и строчки ЕЩЕ раз. А утром, несмотря на то, что лег в четыре, в девять утра набрать коллег с работы и спросить — «ну чо там, ничего не отвалилось»? А то и приехать красноглазым на работу и хлестать кофе весь день.
Я не шучу ни капли. Деформация, как она есть. Я с ним говорил, мол, чего ж ты так, ты работаешь в нормальной конторе, никто на тебя орать не будет — а он отвечает «я все время думаю о том, что если упорю косяк, пострадают клиенты, пострадает компания, потеряет деньги, а я потеряю отношение начальства, меня будут считать некомпетентным.»
И вот что ему делать, жертве «токсичности»?
Правильно говорят — сродни воспитанию ребёнка. Обе крайности дадут крайне неадекватную личность на выходе.
В древности в интернете шутили, что RTFM как-то незаметно мутировало от read the following manual до read this fucking manual без указания конкретики
RTFM — Read this FAQing manual!
Другое дело в том, что люля должны быть
1) Обосноваными. Т. е. иметь основанием реальный весомый косяк. При нормальном рабочем процессе выдача люлей чаще чем раз в месяц — это повод задуматься, так ли косяки косячны, или насколько осмысленно продолжение контакта с автором косяков.
2) Иметь в себе разбор того самого косяка и пояснение, почему косяк является таковым (И почему он достоин люлей).
3) Иметь итогом признание акцептором люлей факта совершения косяка, проведение (возможно, совместно с донором люлей) разбора причин косяка, и наконец, выработку мер для предотвращения повторений косяка.
В таком случае, люля превращаются в довольно мощный обучающий фактор.
Хотя да, юнные бородачи с слишком нежной организацией психики при таком процессе испытывают моральные страдания. Ну так для них существует множество рабочих мест, на которых количество возможных косяков, как и возможных люлей — гораздо меньше. Правда почему-то на них никто не стремится.
Но это все мелочи и не суть важны.
Самое главное — что вы может понимаете, а может и нет — это то, что вся культура (или субкультура по-вашему) пришла из Америки. Там появились все эти бородатые админы. И Линус Торвальдс в итоге в Америку приехал работать. Именно американские технари задают тон и определяют культуру программистов. И вот сейчас они решили, что она будет такая. И вы ничего с этим не можете поделать. Бородатые админы больше не в моде. На самом деле бородатые админы теперь сами стали такими «неженками». Почитайте твиттеры основателя StackOverflow или DHH и вы сами в этом убедитесь.
Просто вы пришли в эту культуру, когда она была такой какой вы ее описали, но теперь она меняется. А вам останется либо ассимилироваться, либо стать динозавром и ретроградом, которого никто уже слушать не будет.
Другое дело, что говорить такое публично пожалуй не стоило.
Обычно этот м*дак считает себя ну ооочень умным, и гораздо реже действительно бывает таковым (я не встречал ни одного, хотя верю что такие есть).
М*даков, без сомнения, надо ставить на место, в том числе путем увольнения, т.к. в противном случае он подтолкнет к увольнению пачку других специалистов.
Тема хорошая, но к каждому нужно находить подход и не обязательно с грубостей начинать
Иди-ка ты на !@# со своей «токсичностью»
Где логика (с)
;)
Не стесняясь в выражениях (за что ты и ратуешь) я пишу о том, что вижу: статья не зашла многим читателямОна не зашла на столько, что на 1-м месте в рейтинге за неделю и на 4-м за месяц и счетчик капает только на увеличение, несмотря на множество минусов. Статья резонансная — это уж точно.
Проблема же, как мне кажется (особенно в России) в том, что тим-лиды хотят сразу готовых идеальных специалистов. «Выращивать» кадры – выше их достоинства. Долговременное планирование развития отдела – не в их компетенции. Выстраивать отношения с подчинёнными – «а что это? Я ведь умею писать программы, разве этого недостаточно для должности тим-лида?»
Автор, ответьте все-таки на мой вопрос. Токсичность личности существует или нет?
Если так, то вы отвратительны.
1) Сначала вы подкалываете меня про 5 по литературе
2) Потом называете меня отвратительным. (Видимо вы додумали, что я верю в какую-то религию)
3) И под конец указываете, чтобы я читал внимательно?
Я все внимательно прочитал и сделал выводы. Вам не зря так часто повторяют про токсичность, люди пытаются вам что-то донести. А вы можете продолжать делать вид, что ничего такого не существует, это дело ваше.
Закончим на этом разговор.
Я работал в крупной компании, где один токсичный программист довёл ситуацию до того, что даже product manager не мог общаться с ним напрямую (что уж говорить об остальных). В результате работа нескольких отделов затормаживалась из-за того, что никто просто не хотел связываться и вступать в какой-либо контакт с этим человеком.
Можно, конечно, сказать, что он один прав, а все остальные «строят из себя обиженных» и «манипулируют толерантностью». Вся рота идёт не в ногу, один он в ногу…
Токсичность это свойство чего-либо вызывать отравление. Она определённо существует. Например, токсичен медный купорос.
Токсичность личности меня не устраивает как определение. Это попытка вывести совокупность отрицательных качеств, но она провальна из за отсутствия чёткого деления этих самых качеств на положительные и отрицательные.
Например, скурпулёзность может быть расцена и как токсичное поведение и как высший профессионализм, причём в одной и той же ситуации. То же самое относится к строгому следованию инструкциям, проявлению инициативы и массе других вещей.
Как я уже не раз писал в комментариях, основная проблема в том, что это слово не имеет точного значения и к нему пытаются подвести любое не устраивающее кого-то поведение. Мне такой подход кажется контрпродуктивным, так как позволяет назвать любого неудобного человека токсичным и начать его травить.
Мне кажется, что стоит применять какие-то более подходящие к случаю слова — гневливость, занудство, невнимательность, грубость и так далее.
Вы это хотели услышать?
И, выходит, что вы не знаете что именно они имели ввиду, но сами обиделись и целую статью написали об этом. А почему вы не узнали у них, что именно под этим подразумевается?
Я вот считаю, что человека, который посылает других людей, можно считать отравляющим. Посылы куда-либо отношений не улучшают, а только ухудшают. И ваша статья — медный купорос.
А если называть токсичностью не набор качеств человека, а влияние, которое человек оказывает на рабочие процессы?
Меня зацепила эта ситуация, люди пихают в понятие токсичность всё, что захотят, не понимая сути термина. Возможно на выходных напишу краткое изложение статьи.
И не стоит клеймить «толерантность»: именно благодаря толерантности в коллективе какое-то время терпят токсичных сотрудников. Не будь толерантности, люди всегда бы следовали девизу «не работайте с му**ками» и отторгали бы токсичных людей из общества.
Причины могут быть разные: от сугубо рациональных (действия строго по инструкции, неукоснительное следование субординации, извлечение выгоды) до сугубо иррациональных (эмоциональная неустойчивость, психические отклонения, неадекватное воспитание). Под «токсичностью» подразумевают не причины, а симптомы: поведение, которое разрушает дружелюбную среду в коллективе.
Похоже Вы не работали на производстве, где именно неукоснительное исполнение инструкций и является тем, что приводит к результату сохраняя жизни, здоровье людей или их среду обитания (инфраструктуру).
Ядерная электростанция: дружбан, пойдем ка бухнем! А не хочешь по инструкции? Фу… токсичный ты что-то
Хирургия: прикиньте пацаны, Петрович забыл зажим в пациенте. Но он же ой друг, я и не сказал главврачу. А что пациент сдохнет — ну и фиг с ним… «токсичный» оказался, все время жаловался что в животе колет и болит зараза, кровью истекал и пачкал простыни…
Как то дороговата цена «дружелюбности», не находите?
Контекст был таким: «неспособность проявлять эмпатию».
Например, коллега просит отпустить его пораньше (семейные обстоятельства) или наоборот просит вас задержаться подольше (помочь с работой). Строго по инструкции рабочий день длится ровно 8 часов и вы должны ему отказать.
Это, что вы делаете «эмпатия что бы помочь коллеге иначе ты токсичный», называтся манипулирование «для идиотов». Скрытая угроза :). Я как-то вырос из этих штанишек.
Могу сказать что, практически прожив два года в офисе и напроявляв эмпати, расстойство сна и головые боли я лечил один пару лет после. Счета врачам — отличное лекарство от такой «эмпатии». Лучше я буду живой «токсичной скотиной», чем в 45 с инсультом от перенапряжения «классным эмпатичным овощем» не способным сам себе вытереть задницу.
Хочешь что бы я решил твои проблемы? Не вопрос! Реши мои проблемы в зачет, кроме здоровья:)
А главное, не стоит забывать, что ваш профессионализм, прежде всего, — это взаимовыгодные отношения с работодателем. Быть токсичным — значит тратить свои, прежде всего, нервные клетки, за которые вам никто не заплатит. Если в компании не налажены бизнес-процессы, то не нужно посылать всех куда-то, даже если они это заслуживают.
Вы зарплату получаете? Вот и получайте. Ешьте спокойно печеньки, читайте хабр. Если менеджмент некомпетентен, проект все-равно закроется. Ну а если вы честны и профессиональны — просто найдите себе новую работу. Без токсичности.
В подавляющем большинстве случаев, с которыми мне приходилось сталкиваться, IT — это именно детский садик. Как и любое другое проявление коллективной человеческой деятельности. И уж пусть лучше остается детским садиком с плюшевыми мишками, чем превращается во что-то подобное армии со всеми ее уставными и неуставными отношениями. Когда говорят о токсичном поведении в коллективе — чаще всего говорят о мудаках. А мудаки пусть сами катятся туда, куда автор там написал в заголовке. Нравится BSDM? Вступайте в соответсвующий клуб, нефиг свой негатив и жажду доминирования тащить на работу.
habr.com/company/ruvds/blog/432402 («Эй, HR, где моя сувенирка?»)
Ну и противникам борцунов с токсичностью желаю таки поработать сперва в
токсичном коллективе (где токсичность исходит не от вас) ^^
Есть мнение, что токсичность идут рука об руку с некомпетентностью.Да, некомпетентность в том, чтоб смотреть на всё с улыбкой и пофигизмом.
— Бугога, какого *** ты эту фичу так через *** реализовал?
— Да, ***, этот *** клиент именно так и требовал!
— И чо, ***, ты не мог как-нибудь его на *** послать?
— ПМ не дал, бугога!
У «нежной девочки-тестировщицы» уши бы в трубочку свернулись, да не было таких в кабинете. Всем весело, все работают, процесс идёт, код пишется, клиент доволен.
Авторы модных сейчас CoC, наверное, были бы в ужасе.
Есть ли тут токсичность, или вообще какая-то проблема? По-моему, нет. Ну, по крайней мере, если эти товарищи понимают, что если в кабинет вдруг заглядывает «нежная девочка», надо несколько менять лексику.
И в истории с Линусом, по-моему, он подобен вот этим дядькам-матершинникам. И всё хорошо ровно до тех пор, пока в списке рассылки не берутся откуда-то девочки-тестировщицы, почему-то с полномочиями писать CoC-и.
Можно поспорить в следующем направлении: вероятно, ошибка Линуса (и подобных ему) состоит в том, что он переносит паттерны общения с узкого междусобойчика хорошо лично знакомых людей (мейнтейнеров подсистем) на широкое сообщество читателей списка рассылки. Но, с другой стороны, в список рассылки никого «насильно» не тянут (и для многих это даже не работа, за чтение этих матюков денег не платят); не нравится — не читай.
1) от недостаточно опытного в работе с Ядром программиста
2) от сотрудника корпорации, которая на интересы сообщества плевать хотела
Если код удовлетворительного качества — то и новичёк и корпорация остаются целы и невредимы. Надо серьёзно наговнокодить или значительно затронуть интересы сообщества и пользователей, чтобы на тебя обрушился Линус. Он может быть не прав (как, имхо, в случае с adobe и memmove) но он не докапывается по пустякам, рутинно.
Я всегда был за подход: Если тебе не сказали, что ты де… л, значит так не считают. Но и ты точно также веди себя. Если человек де… л, скажи ему об этом прямо и аргументируй.
Это избавляет от многих вопросов «А что подумают?» или еще хуже «А вдруг он сказал одно, а имел ввиду другое?». Проще надо быть.
Получив обратную связь, пусть даже и матом не стоит принимать все близко к сердцу. Очень часто человек говорит не про тебя лично, а про твой конкретный навык! Ты можешь хорошо писать код в компоненте1 или компоненте2, иметь навык1, навык2, но когда ты применяешь навык3 и правишь баги в компоненте3 ты почему-то постоянно допускаешь ошибки. Вот коллега и доносит обратную связь. Не следует паниковать. Нужно просто спросить его «В чем твои аргументы?». В результате его аргументации может быть ты все-таки верно решил и это коллега много чего не учел и не учел 100500 костылей из-за 100500 прошлых баг-фиксов. Тогда обсудив сможешь поставить его в еще более худшую ситуацию «Кажется я зря его назвал де… лом и это я сам не очень, т.к. не разобрался». Но чтоб к такому придти нужна стрессоустойчивость и умение не принимать близко к сердцу.
Вообще, хотелось бы упомянуть о таком понятии, как ассертивность.
Вот как должны работать отношения между коллегами.
В противоположность могу поставить спортсменов, приходит новичек в спорт-зал, и никто ему не начинает с порога кричать что он дно, что ему тут не место и что у него мышц нет и нечего ему тут делать. В бОльшинстве случаев если увидят что делает не так, подойдут помогут, подскажут, объяснят. Скорее претензии будут не когда он что то делает не так, а когда он приходит и ничего не делает.
Так откуда же в «элите» столько токсичности? Вроде взрослые люди, а вести по взрослому себя не могут. Вся эта токсичность и есть детский сад.
. В бОльшинстве случаев если увидят что делает не так, подойдут помогут, подскажут, объяснят.Ох, есть разные залы. Есть такие которые снимают и выкладывают на ютуб, как разные снаряды и тренажеры используют не по назначению. А инструктора будут смотреть в твою сторону, когда будешь оплачивать персональные занятия. Был случай, когда одна барышня так увлеклась бегом на дорожке, что аж позеленела. Я такого ни разу не видел. Но всем вокруг было ок, ибо так и нужно.
Есть такие которые снимают и выкладывают на ютубЭто делают конкретные личности. Да, встречал. В коментах достаточно мало людей разделяло мнение что это «прикольно». Ну у меня выборка тут уже будет не такая большая. Но среди людей занимающихся каким либо видом спорта, крайне редко можно встретить токсичное поведение. Обычно занятие тем или иным видом спорта наоборот, позволяет лучше найти общий язык.
Обычно занятие тем или иным видом спорта наоборот, позволяет лучше найти общий язык.Не играли ни разу… там… в баскетбол или футбол во дворе?
И да, я сейчас много пересекаюсь как с легоатлетами любителями, так и профессиональными, футболисты, билдеры и тд тоже там есть. — это одни из самых доброжелательных, общительных и отзывчивых людей, особенно в сравнении с представителями нашей профессии. Там морально прям отдыхаешь.
А зачем вы сравниваете совсем разные состояния?
как бы…
Обычно занятие тем или иным видом спорта
футбол — входит список иных видов спорта, это уже сейчас у вас уточнения.
И да, я сейчас много пересекаюсь как с легоатлетами любителями, так и профессиональными, футболисты, билдеры и тд тоже там есть.Если в целом, то да. Ибо были и есть общие темы для понимания достижения тех или иных успехов или же получения травм. Это такая же аналогия, если бы встретились любители *подставить нужное* и обсуждают общую тему.
футбол — входит список иных видов спорта, это уже сейчас у вас уточнения.
вид спорта да, но выбрали не в целом футбол, а только одну из его составляющих. Да и высказанное в азарте во время матча, это все равно не то же самое, что поведение которое можно встретить в поднимаемых вопросах в статье :)
В среднем, мне кажется, 2 произвольных программиста куда хуже находят общий язык, чем 2 произвольных спортсмена.
это одни из самых доброжелательных, общительных и отзывчивых людей, особенно в сравнении с представителями нашей профессии.
Так, может, это они по отношению к программистам такие доброжелательные… Я вот не разу не слышал, чтобы программист обижал, ну, не знаю, ветеринара… Кстати, те же самые врачи очень даже любят проехаться на тему «что за ерунду вам назначили». Вообще, думается мне, профессия ни при чем. В любом деле, когда заходит речь о раздаче лычек, особенно если эти лычки как-то влияют на деньги/славу/уважение, велик риск начала брожений на тему «чьи результаты деятельности большее говно».
Так, может, это они по отношению к программистам такие доброжелательные…
Простите что? Дело не в обижал не обижал. (это уже следствия). Суть то в том, что ты пришел, что то делаешь. И реакция просто разная. Новичек начавший программировать, и задавший вопрос на форуме — с огромной вероятностью получит ответ «не пиши больше никогд», «тебе не быть программистом» (утрирую конечно сейчас). А не критику кода. т.е. сразу переход на личности.
Новичек пришедший в спорт-зал, заниматься физическим развитием себя, если что то будет делать не так, получит критику того что делает и совет как праивльно, может даже в грубой форме. Но без перехода на личности.
Вы правда не видите разницы?
Критика конечно должна быть, но она должна быть конструктивной, возможно вполне возможно что грубой. Но без перехода на личности.
А г… нокодом, значит, называют не конкретные личности?
Ваш опыт основам на дискуссиях о Вашем коде? Если да, не допускаете ли Вы мысли, что дело в Вашем коде, а не в таксичных программистах?
2. Лично я, крайне уравновешанная личность, мне плевать на то как кто то выражается. При переходе на личности разговор будет потом в другом русле и всё).
3. Не мой код, просто по тому что я вижу на форумах постоянно. В своем коде я и сам прекрасно когда пишу нормально, а когда я леплю костыли. Живем не в идеальном мире, приходится и то и другое писать в зависимости от ситуаций.
4. «тОксичных»
просто по тому что я вижу на форумах постоянно
А тут всё просто — это "ошибка выжившего". Хороший код не имеет большого смысла обсуждать, он вполне самодостаточен, и он никому не создаёт проблем — ни клиентам, ни тем, кто его будет поддерживать. Его иногда приводят в пример при разговоре о плохом коде, но обсуждают-то всегда именно плохой.
"тОксичных"
И вас, коллега, тем же концом и в то же место. Перечитайте.
А тут всё просто — это «ошибка выжившего».Это уже не смешно %) так опосела эта фраза, суют где нипопадя.
Хороший код не имеет большого смысла обсуждать, он вполне самодостаточен, и он никому не создаёт проблем — ни клиентам, ни тем, кто его будет поддерживать.Правда правда, не видите разницы между обсуждением и «г**о, никогда больше не пиши код»? Новичку? Серьезно? Нет тут ошибки выжившего, это в целом касается русских форумов айтишно-железнячных. Сразу желчь. Это неприемлемо. Хотя последние годы стало заметно меньше.
Одно дело сказать «твой код г… о, так нельзя, нужно пользоваться *тем-то*» (тут грубо, но есть конкретная критика без перехода на личность. Особо ранимые личности могут обидиться, само собой. Обычно все же не поощряют грубость в коллективе), и совсем дургое «твой код г… о, *роскомнадзор* стену, не пиши больше код никогда, засунь его ***» (вот это уже токсичность).
Я конечно сильно утрирую, но тут везде и рядом из крайности в крайность. Я за адекватную критику, без перехода на личности, даже если грубо. Вот лично я был бы только рад, если мне кто указал бы что «вот тут можно написать лучше, перечитай *название*» или подобное. Я люблю делать хорошо, но я не всегда представляю как. Увы.
Те кто жалуется на таксичность, тоже хороши, часто воспринимают слишком сильно на свой счет.
И вас, коллега, тем же концом и в то же местоАхах. И правда, мои любимые а/о и/е. :)
любой код в 95% случаев «г… о», тот кто его писал сразу же «г… о-кодер» и т.д. и т.пВы готовы доказать, что это не правда, и что весь код в продакшене пахнет фиалками и никак не может быть улучшен переписыванием?
Аналогию надо проводить со спортзалом, а с врачом, который токсично и и с переходом на личности расскажем большинству людей о проблемах с весом, сердцем, позвоночником и т.д. и т.п. Как известно, здоровых нет, есть необследованные.
Дело не в том правда или не правда, а в подбираемых выражениях и реакции. ну и токсичность — это не использование мата, а определенного вида поведение, когда реакция на все подряд сводится к однотипнрму 'го… о', 'манки-кодер' и т.п.
А борцы с токсичностью борются именно с этим, требуют смягчать; щадить чувства; называть плохое не плохим, а «альтернативно хорошим»; не упоминать слова, имеющие негативное значение в отдельных культурах («slave»).
Ни я, ни автор статьи не боремся за право с порога поливать грязью любого вошедшего в коммюнити, нам это не надо. Но если человек принёс ушат помоев и называет это своим вкладом — то мы об этом скажем и не надо нас затыкать всякими CoC.
когда реакция на все подряд сводится к однотипнрму 'го… о', 'манки-кодер' и т.п.Это просто неправда. Сравните, например, реакцию на 3 проекта: systemd, новый скайп и на Steam Play. Всё очень по-разному, но адекватно ситуации.
Человеческая психология – это фактор, который нельзя не учитывать. Многие вещи, которые кажутся нам «правильными» и «естественными» по отношению к другим, совершенно также естественно воспринимаются неправильными по отношению к себе. Это происходит автоматически на уровне восприятия, еще до того, как мы начинаем осознанно анализировать услышанное.
Это относится и к критике. Любая критика (да, любая, в том числе и абсолютно справедливая) воспринимается негативно на эмоциональном уровне. А эмоциональный уровень — это то, что может владеть управлением нашего поведения до 100%, если не прикладывать дополнительных усилий на осмысливание происходящего.
Поэтому, все подходы к правильному формулированию замечаний — это не розовые сопли, а способ не испортить нормальную рабочую обстановку на ровном месте.
Что касается детского сада – автор ставит все с ног на голову.
Это в детском саду все друг другу всегда говорят все прямо без раздумья. А у взрослых людей, не важно в офисе, на заводе или в тюрьме, уже должна появиться привычка думать о последствиях, прежде чем что-то сказать. Исключение, возможно, только в армии, и то только по отношению к нижестоящим чинам.
Все сказанное вовсе не означает, что не надо критиковать и тем более, что надо молча работать с ленивыми бездарями. Критика должна быть правильной. Те, кто ее не воспринимает и ждет матов и ора, отправляются на сверхсрочную службу в армию. Там им будет комфортно.
По мне нарочитая всяко-политкорректность и терпимость только вредят.
. В бОльшинстве случаев если увидят что делает не так, подойдут помогут, подскажут, объяснят.Вспомнились Маски шоу в деревне, когда писарь 3 раза переписывал одно и тоже письмо, а председатель рвал его. В конце писарь просто склеил и подал председателю тоже письмо. В ответ — молодец, это то, что я хотел.
«Одно из самых впечатляющих озарений в моей карьере случилось, когда я преподавал инструкторам израильских ВВС психологию эффективного обучения. Я объяснил им важный принцип отработки навыков: поощрение за улучшение результатов работает эффективнее, чем наказание за ошибки. Это предположение много раз подтверждено исследованиями на голубях, крысах, других животных и людях.
Выслушав мои воодушевленные объяснения, один из самых опытных инструкторов в группе поднял руку и произнес в ответ собственную речь. Сначала он согласился, что, возможно, птицам поощрения и помогают, но отказался признавать, что похвала действует на курсантов. Он сказал так: „Я неоднократно хвалил курсантов за чистое исполнение фигуры высшего пилотажа. Во время следующей попытки исполнения той же фигуры они справляются хуже. А когда я ругаю их за плохое исполнение, то обычно в следующий раз у них выходит лучше. Так что, пожалуйста, не рассказывайте нам, что поощрение работает, а наказание — нет, потому что все как раз наоборот.»
Внезапно, в радостный момент озарения, я по-новому увидел статистический принцип, который многие годы преподавал. Инструктор был прав — и в то же время совершенно неправ! Он проницательно заметил, что за случаями, когда он хвалил исполнение маневра, с большой вероятностью следовали разочарования, а за наказаниями — улучшения. Однако сделанный им вывод об эффективности поощрения и наказания оказался совершенно неверным. Инструктор наблюдал эффект регрессии к среднему, возникающий из-за случайных колебаний в качестве исполнения. Естественно, хвалили только тех, кто выполнял маневры намного лучше среднего. Но, вероятно, курсанту на этой попытке просто повезло, и, таким образом, следующая попытка была бы хуже независимо от того, похвалили его или нет. И наоборот: инструктор ругал курсанта, если тот выполнял задание необычно плохо, и потому делал бы следующую попытку лучше, независимо от действий инструктора. Получилось, что неизбежным колебаниям случайного процесса дали каузальную интерпретацию."
Д. Канеман, «Думай медленно — решай быстро»
Сначала он согласился, что, возможно...
и потом привёл объективные доводы. А не начал с «что за ерунду Вы несёте».
Ибо, на основании наблюдений, инструктор установил (на большом кол-ве опытов) – «хвалю… справляются хуже… когда я ругаю… – лучше».
В случае правильности вашего вывода с «большой вероятностью»
кол-во вариантов лучше/хуже была бы примерно одинакова!
@-}---------
Тем самым Вы делаете ложными все душеизлияния топикстартера!
Ах, он всё эмоции на входящие воздействия придумал, «негодник»!
Так по Вашему? ;)
@-}---------
P.S. Пользуясь случаем поздравляю всех участников диспута!
Миф о том,
что только девушки могут переливать из пустого в порожнее часами – разрушен!
Ура, товарищи!!! )))
То есть Вы утверждаете, что «ругали или хвалили» не влияет на качество выполнения задачи объектом в дальнейшем?
ИМХО он утверждает, что отклонение результата в силу случайных обстоятельств больше, чем от приобретённого за 1 полёт навыка. А инструктор не может увидеть, что «когда ругаю — на 5% лучше, когда хвалю — на 3% хуже», для него просто лучше/хуже.
Чтобы что-то оценить, надо считать количество тех кто лучше/хуже, ругать или хвалить только часть курсантов, сравнивать на серии полётов и на разных базах — то есть делать именно то, что инструктор не делает а указанный выше Д.Канеман как раз делал.
Более того, чаще всего дело не в грубости или вежливости, а совершенно в другом. Я уверен, вежливо можно донести даже серьезные неприятные вещи. Другой вопрос, если не уметь это делать. А если просто орать и ругать детей или подчиненных — это тоже не всегда приводит к хорошим результатам.
По теме статьи: статья конечно написана чисто на эмоциях, поиск смысла в ней это работа для психологов. Более всего смущает то, что не понятно про какой уровень отношений в коллективе идёт речь. Если вы считаете кого-то из коллег некомпетентным, вам дико хочется его материть, аж кушать не можете, то проблема скорее в вашем к нему отношении, а не каких-то тенденциях. Я работал администратором баз данных со сменными дежурствами, уровень в отделе у всех был разный, от кого-то принимать смену было приятнее, от кого-то страшнее, и если кто-то явно протупливался при возникновении проблемы, то мы все вместе формировали регламент, что делать в такой-то ситуации, вместо уничижительных разборов. А уж если человек игнорирует регламенты, это уже проблема руководителя, не стоит забивать этим голову себе. Эта схема применялась не во всех компаниях, но она была самой продуктивной: вместо мыслей о разносе от руководителя или коллег, ты знаешь что твоя цель решить проблему и дать информацию остальным как обходить подобное. И как бы ты не сомневался в человеке, ты знаешь что если он не даст решение, то будет хотя бы способен обеспечить информацией что происходило.
Касаемо менторства — если код рабочий то его уже бессмысленно называть плохим, это никого не разубедит, а ученик подумает что вы просто пытаетесь самоутвердиться. Код который есть это отправная точка, на ней объясните человеку что не нужно стесняться оставлять комментарии, что теперь нужно подумать об удобстве отладки, что какие-то из методов довольно плохи в производительности, и их можно заменить другими, а примеры можно посмотреть вон там-то. Если вы сразу объявите код плохим, то человек вместо умения обращаться с кодом будет возводить культ Карго, смешанный со своими подозрительными решениями.
Крайне не согласен с мнением изложенным в статье. По пунктам:
"Это должен быть матёрый сисадмин со стальными яйцами" — никто никому ничего не должен.
"который плачет от шуток про ориентацию" — это плохие шутки и их не должно быть в "рабочей среде". Ровным счётом как и половых (например про "тупых блондинок"), религиозных, относительно воинской обязанности сотрудников.
"что нельзя критиковать людей, нельзя вообще высказвать им негативную оценку" — да, нельзя. Человек приложил усилия и написал код. То что он не соотвествует какому-то требованию, о котором он мог и не знать — это уже другой разговор. Но в целом: "критиковать людей нельзя" — правильная точка зрения. Не забывайте что это для вас "программирование — это субкультура" или, скорее, "культ", а для большинства людей это просто работа, на которую они ходят просто потому что получают за это деньги. Оскорблять людей за их работу неправильно. Критиковать тоже нужно правильно.
По поводу оценки кода — меня учили не критиковать код, а указывать на более подходящие варианты, или проблемные моменты. Да, допустим, программист сделал обход связанного списка вместо доставания по хешу из ассоциативного массива. Не нужно говорить что "это говнокод", "это <плохое> решение" нужно сразу сказать что это можно сделать лучше.
Удивительно что многие поддерживают мнение указанное в статье. "IT-не детский сад, а место для суровых людей которые могут и 'куда-подальше послать' " — это плохое мнение, которое может отсеять потенциальных специалистов.
Не говоря уже о том, что в нашей профессии часто приходится общаться с людьми, а аргументы в статье говорят о том что хороший айтишник — тот который не знает как это правильно делать
«который плачет от шуток про ориентацию» — это плохие шутки и их не должно быть в «рабочей среде». Ровным счётом как и половых (например про «тупых блондинок»), религиозных, относительно воинской обязанности сотрудников.Ваш список запрещенных шуток: про ориентацию, про пол, про религию, про воинскую обязанность(?). У других людей другие запретные темы, в итоге придем к тому, что шутить вообще нельзя. Вы сможете в такой среде работать? Программист ведь творческая личность, по-другому никак, и запретами его творчество можно только подавить. Ну и результат труда будет соответствующий.
Ваш список запрещенных шуток: про ориентацию, про пол, про религию, про воинскую обязанность(?)
Не мой, а краткий пересказ правил компании в которой я раньше работал.
От себя добавил бы ещё шутки про "пора рожать" для девушек и про детей в целом, потому что это деликатная тема, но, к сожалению, подобное тоже периодически всплывает.
У других людей другие запретные темы, в итоге придем к тому, что шутить вообще нельзя.
Смысл не столько в шутках, сколько в ущемлении людей. Для вас возможно это будет "просто шутка", а некоторых это может сильно зацепить. Та же тема про воинскую обязанность — некоторые просто посмеются, а человек может действительно переживать по этому поводу, что ему придётся расстаться со своими родственниками, друзьями и коллегами на год. Если задуматься, это достаточно депрессивная тема, поэтому не стоит "давить на больное".
Эти "запреты" скорее общие рекомендации, потому что шутки на эту тему зачастую бывают оскорбительными, либо болезненными, для многих людей. В остальном можно полагаться на собственные чувства.
Из важных запретных тем, которые я, к сожалению, забыл указать есть ещё "шутки" про инвалидность.
в итоге придем к тому, что шутить вообще нельзя.
Нужно понимать что вы не в баре с друзьями, а среди коллег, которые могут иметь разную ориентацию, религию, принадлежать разным культурам и быть по разному воспитанными. Поэтому темы для шуток желательно ограничить. Для вас, возможно, подобные шутки не значат ничего, а на моей памяти есть случай, когда девушку довели до слёз шуткой про то, что она ходила курить с другими сотрудниками. Таких случаев в рабочей среде быть не должно.
Программист ведь творческая личность, по-другому никак, и запретами его творчество можно только подавить. Ну и результат труда будет соответствующий.
Я не думаю что отказ от шуток которые могут задеть чувства других сотрудников помешает вам писать хороший код. А вот задетые чувства сотрудников могут негативно сказаться как на их производительности, так на межличностные отношения с командой. Этого нужно избегать, пускай и ценой "шуток".
Злоупотребление подобными правилами является проблемой, да.
Как в примере с CoC, когда сторонние люди, не относящиеся к проекту и не вложившие в него больших усилий могут убрать с проекта человека, посветившего огромное количество времени и усилий этому проекту.
Но в пределах разумного эти правила необходимы для современного общества. Необходимо понимание того, что люди разные, у них свои страхи и переживания, и относиться к особенностям личности с уважением, не упрекая их в том что, в общем случае, тебя не касается(ориентация, цвет кожи, религия) и не оказывает негативного влияния на окружающих.
С проблемой пренебрежения нужно бороться чётко сформулировав границу между приемлемым и неприемлемым поведением. Например, чтобы удивленный возглас "Боже мой" считался устоявшимся фразеологизмом, не имеющем отношения к религии.
В целом, не следует из более формального общения делать драму (как же я теперь без "шуток про блондинок" и тому подобного). Я напоминаю, что речь идёт о рабочей среде.
Кто-нибудь возьмется перевести эту самую "токсичность"? Это "отравляющее поведение"?
Вопрос у меня только один — какого овоща мне повесили на хабре пожизненный бан за ОДИН мат в комментах, притом что тут их как грязи? У некоторых права равнее чем у других?
Или за мной уже вылетели, лол.
Идите-ка вы в жопу с вашей «токсичностью»! Я говорю это потому, говорить друг другу такое могут могут позволить себе только друзья.
Потому что меня также не устраивает и отсутствие рамок приличия и элементарной этики
Относительно подковёрных интриг тоже много историй, вот одна от лично знакомого мне человека. Разработчик приходит в компанию, работает три месяца, все с ним вежливы и обходительны. Через три месяца разговор с HR, в результате которого выясняется, что команда его ненавидит. После этого запой, переход в другую команду и паранойя. Хотя не знаю, можно ли называть паранойей то состояние, когда тебя и в самом деле окружают двуличные ублюдки.
Мы недавно распрощались с дизайнером, для которого увольнением стало примерно таким же шоком. Ему очень вежливо и доходчиво раз за разом объясняли, что он делает не так и почему так делать не надо. Он хлопал глазами и продолжал делать фигню, иногда порывался поспорить…
… КАК ВДРУГ оказалось, если хлопать глазами и продолжать запарывать работу, можно не пройти испытательный срок. Шок! Сенсация!
Подсказываю: дело скорее всего не в подковёрных интригах, а в том, что человек попросту не слышит фидбэк. Ну и запойность — тоже так себе характеристика, на самом деле.
1. Он не компетентный, поэтому и не может понять ваше объяснение. Ему ещё надо базу усвоить. То есть вам надо его обучить(например, если нехватка не в общих знаниях, а в особенностях конкретно вашей фирмы) или гнать взашей.
2. Обе стороны компетентные, но вы объяснять не умееете.
3. Вы сами неконментентны. Поэтому он и хлопает глазами, как можно ругать за правильно выполненную работу и говорить ему полную чушь. После нескольких попытак отстоять очевидные истины спорить перестал.
Во всех этих трёх случаях, токсичный стиль будет только хуже, т.к. помешает определить с камим случаям столкнулись и оперативно действовать дельше.
Во втором случае — работать над лучшим взаимодействием, а в 1,3 — принять кадровые решения.
Токсичный стиль общения у нас в команде не принят. Объясняем, что и почему надо, если что-то идёт не так, спокойно объясняем, что не так и почему результат не годится. У нас знают, что такое кегль, негативное пространство и проч., «поиграть шрифтами» никогда не требуют :)
Ну я извините, что докапываюсь, второй -то дизайнер может быть менее компетентным или менее увереным в себе. Вот и ловит каждое слово. Поэтому ей легче объяснить.
Вы всё усложняете. Есть человек, который на лету понимает и сразу делает как надо. И есть человек, которому надо объяснять стопицот раз и который всё равно делает не так. Не надо больше ничего выдумывать :)
Не нравится что сделал человек, подскажи как сделать лучше
В списке рассылки ядра linux, типичная «проблема» — это сообщения вида «you are morron, because this code is bad». Такие сообщения, по-моему, в основном воспринимаются с юмором. По-моему, это вообще не проблема.
Есть другой вид «токсичности». Когда человек не занимается прямыми оскорблениями, а вместо этого начинает злобный троллинг по любому поводу. На любую фразу — сарказм и злые шутки (не имеющие вообще никакого отношения к коду или другим техническим вопросам). Это либо подростки, либо взрослые люди с какими-то психологическими проблемами (может просто депрессия у него и он на весь мир обижен). Чаще всего, таких людей коллектив старается как-нибудь выдавить из себя. Если это не значительная для коллектива личность — всё хорошо, его как-нибудь попросят не появляться в этом сообществе. Иногда такими бывают технические лидеры проектов. В опенсорсе, как правило, это приводит либо к забвению проекта, либо к форку. В среде коммерческой разработки сложнее.
CoC бесполезен в первом случае. Во втором случае, он может быть полезен для того, чтобы иметь формальный повод забанить бесполезного тролля. Но он действительно может и навредить, если в сообществе имеются люди, готовые ради каких-то личных интересов пользоваться формальными правилами для выдавливания полезных людей из сообщества.
В списке рассылки ядра Linux типичная «проблема» — это сообщения вида «you are morron, because this code is bad». Такие сообщения, по-моему, в основном воспринимаются с юмором. По-моему, это вообще не проблема.По-моему, тоже (это не проблема). Эту олдскульную этику можно сформулировать, например, так:
When people actually care about something, they tend to have strong opinions. When you are wrong, you hear about it, very directly and in no uncertain terms. Absolutely no one is given special treatment. You have a choice between being offended and leaving, or appreciating the criticism and trying to do better. The people who get offended are the ones who have missed the obvious; another person just gave you their time in writing out their opinion and correction. They may have skipped showering you with sunshine, rainbows and ponies, but how you feel is unimportant.(Выделение моё.) Тем не менее, для многих людей это таки проблема, причем весьма серьезная, и how they feel is very important, а на предложение не воспринимать всё близко к сердцу и вообще отрастить кожу потолще тебе возразят, что у нас в Техасе и за меньшее можно получить в морду. Аргументы про «деточка, это интернет» работают не всегда и не везде.
Можно годами оставлять уместную, как тебе самому кажется, конструктивную критику (я нередко оставляю feedback на коммиты), помогающую человеку и результатам его работы стать лучше (это к комментарию amarao выше), тщательно выбирать слова, вычитывать сообщение на любые намёки перехода на личности, и всё равно не догадываться, что тебя считают мудаком, причем даже те, кто не был непосредственным адресатом твоих писем в рассылку:
It took months from the beginning of my participation in FreeBSD, and repeated reassurances from community members, for me to learn that you, danfe, are not a complete asshole.ЧСХ, впоследствии человек мнение своё изменил на практически противоположное, но тем не менее: любая, даже самая взвешенная и уместная (по-твоему) критика может восприниматься болезненно.
Можно спорить, почему раньше старая этика работала, и не было нужды в CoC'ах, но факт остается фактом: мир изменился, for better or for worse.
Помните знаменитое разделение на «физиков» и «лириков»? Это самый известный знак того, что общество зашло не туда. Инженеры и ученые «старой школы» просто не поняли бы такой постановки вопроса.
Шухов отлично разбирался в опере и создавал фотоснимки, имевшие очевидную художественную ценность.
Бородин, внезапно, вообще больше известен как композитор, хотя его вклад в химию не меньше, чем в музыку.
Про то, что Ломоносов писал стихи, все и так знают.
И так далее, и так далее. При таком положении вещей обсуждаемых здесь проблем в общении с коллегами в частности и людьми вообще у них, естесственно, не возникало.
Сейчас вроде бы заметна положительная динамика в этом направлении, но, боюсь, результаты мы увидим еще очень нескоро. А до тех пор все будут спорить, каким же должен быть инженер/программист…
Человек, который пытается что-то требовать в плане улучшения по работе (например нормальных прав на dev сервер) и проталкивать по работе не то чтобы новые, а хотя бы стандартные устоявшиеся инструменты, чтобы стало лучше, а не «мы пилили и будем пилить это самодельное г№;%но мамонта ещё 10 лет, рефакторить нельзя, чинить нельзя, всё что хочешь переделать — делай десять копий разных реализаций, с кучей сомнительных проверок, левых файлов-флагов, твиков, костылей, потому что у нас есть клиенты которым что-то нашкодили и мы не знаем как иначе их поддерживать» — это токсичный или нет?
Критика «ты что-то закоммитил и ни;№;:%ра не работает! — А что именно не работает, вот я запустил же?! — ни;№%: ра не работает, чини срочно!» вообще может быть полезной?
Так же доводилось наблюдать, как пришедшее гораздо позже тебя руководство, перетаскивает работников с прошлого места работы, попутно увольняя неудобных «токсичных» людей, которые до этого руководства могли несколько лет отработать и никаких проблем со старым коллективом и руководством у них не было. Эффективный «менеджмент» во всей красе: неудобных уволить, оставить только тех, кто умеет на задних лапках танцевать. Ну и что что тасков за спринт закрываться будет втрое меньше, зато все свои, прикормыши, никто не возмущается, никто ничего не хочет, инициатив никаких, можно и на корпоративах все старые знакомые лица. «Новоприбывшие» переселенцы мало того что на новом месте ничего не знают и не хотят знать, так ещё и пытаются свои правила привнести, дополнительно накаляя атмосферу со старыми сотрудниками (на которых и так навалилось работы в добровольно приказном порядке). А чуть какие проблемы — бегут жаловаться к руководству. В итоге штат буквально превращается в гадюшник и все кто могут из квалифицированных сами рано или поздно уходят даже если их не увольняют (а всех уволить сразу невозможно, надо же кому-то и работу работать, а не только языком в кулуарах чесать).
Происходит активная девальвация статусов. Сейчас очень легко найти вакансии сеньоров, тимлидов, архитекторов с опытом от года. ОТ ГОДА. Не может быть, чтобы HR поголовно сошли с ума, кто-то и в самом деле верит, что с годом опыта можно быть специалистом высшего уровня в профессии
Вероятнее всего это вакансии с опытом работы именно сеньором или тимлидом от года и выше, а не вообще с опытом 1 год в ИТ.
-Воздержитесь от токсичного поведения (даже в завуалированной форме) в комментариях
Мне казалось, автор не хотел чтоб мы сдерживались
Нужно понимать, что никто не приходит на работу чтобы плохо работать. Все хотят делать то, что они любят и гордиться результатом своего труда. Хорошая команда должна мотивировать стать лучше.
Если дальнобойщик стал программистом, это не значит что он должен «обматерить коллегу и с довольной улыбкой» продолжить писать код. Если подобному навыку человека-со-стальными-яйцами и есть применение, то для того чтобы давать отпор прослойке сейлз и менеджеров которые в очередной раз пообещали клиенту запилить фичу до конца недели.
Я за индивидуальный подход! Вполне возможно, что на некоторых действует только пинок, чем мощнее, тем сильнее.
Мне нравился подход, который практиковали у одного из моих работодателей. Сначала обязательно похвалит, потом расскажет слабые стороны/ошибки и объяснить зачем это делает. Например: вот тут ты допустил ошибку, тебе необходимо изучить такую и такую библиотеку, благодаря этому ты сможешь писать чистый код и быстрее перейти из джуна в мидлы. Это же не сложно?
Долго думал как выразить своё отношение к этому словами, а тут эта статья — в точку!)
По существу со многим соласен, но статья «отдает» озлобленным субъективизмом. Хотя посыл мне понравился.
Интересно, где в России такое место, где ты отправляешь код с одними и теми же ошибками, а тебе в ответ не имеют сказать и слова, при этом ещё должны улыбаться.
Просто представьте, что у вас вместо людей, какие уже есть — инструменты. И по итогам в отдельно взятой команде все приходят к позиции «использовать бОльшую часть инструментов на все 100%, но при этом малая часть будет гневаться от необходимости вытирать задницу этим плаксам». Какой подход даст максимум производительности от отдельного коллектива, такой и победит — хоть на токсичность жалуйтесь, хоть бои без правил с элементами садомазо на скраммитингах проводите, лишь бы метрики росли.
— Старички с ruSO.
Буду добалять, наверное, свои 5 копеек к посту.
Для начала давайте определим термин «токсичное поведение».
Я под «токсичным поведнием» понимаю поведние. Которое разрушает среду, разрушает процесс работы, мешает продуктивно и конструктивно работать, мешает выдавать качественый результат.
и вот тут не важно, грубо подается критика или нет, посылает подчиненный начальство или подопострастно пополижествует, грубо говорит старщий или коллега или нет — важно по делу это говорится или нет, решается вопрос эффективно или нет, создается хорошая it — система или нет, улучшается качество результата или нет.
к сожалению, у многих внешне грубый процесс ассоциируется с токсичным поведением. хотя, согласитесь, к токсичности грубость может не иметь никакого отношения.
действительно токсичным может быть и вежливое подлижество, мягкое «идина*****йство», «итальянская забастовка» с доброжелательной физиономией и пр… — когда все вокруг улыбаются, а дело не идет.
ну так вот. инженерам это противно. и автор статьи, как мне кажется, совершенно точно это отметил.
но к сожалению в it-среду из за «перегретого спроса» в разы превышающего предложение, начали набиваться люди имеющие к it «практически никакое» отношение.
и тот ажиотаж вокруг политкорректности и толерастии, который мы имеем в исконно грубоватой но продуктивной технической среде — это, имхо, именно следствие попыток не-технарей выжить в технарской, чуждой им, среде. они бы рады, к нам не соваться, но тут типа вакуум, а в их областях вообще тухляк… и они приходят сюда.
нескончаемый шквал смены моды, подходов, фреймворков — это из той-же оперы: когда человек плохо мыслит технически и логически — поиск серебрянной пули приобретает особенный смысл.
… хотя и авантюристов с прохвоставми в «новоделанных it -шниках» тоже хватает. вспомните истории индусов которые устраиваются на работу «вместо собрата, прохлдившего собеседование».
Хотя таких, по крайней мере у нас, вроде как, не так много, как искренне верующих в собственную профессиональность безумцев с синдромом начинающего программиста.
Ну так вот. Очень много «новых специалистов», выучивших инструменты, но у которых нет ни инженерного чуться, ни «технической жилки», ни природной предрасположенности к техническим наукам.
ну представьте, если психиатором будет работать слесарь? ну вот и тут точно так же.
Я понимаю почему они тут появились, но легче от этого не становится — они приносят сюда нечно типа бардака «бабской бухгалтерии». Не хочу ни кого обидеть, простите, но вы поняли о чем я — подковерщина, толерастия, лицемерие, эмоциональное поведение там, где надо делать, думать и работать.Увы.
И именно такое поведение разрушает рабочую среду.
Что делать? Я не знаю. Но это данность. Они сюда пришли, и пока потребность даже в таких «пожизненных неофитах», думающих эмоциями, а не головой не исчезнет, — они никуда не денутся.
А потребрость ни куда не денется. особенно в условиях техногенной цивилизации и неспособности системы образования не убить природную предрасположенность к инженерным наукам в большинстве людей, исходно имеющих от природы техническую жилку.
Что делать? не уверен что знаю.
Пока же для лиц, не способных отличить объективную критику от личностных наездов (как при прослушивании так и высказывающих ), имеющих сложности с техническим мышлением и преобладающим эмоциональным восприятием, но пытающихся работать в it в технических ролях, вопящих сверх разумного про токсичномть — предлагаю ввести термин «it-меньшинства»..
именно так.
И обращаться с людьми, которые ведет себя действительно токсично(*) именно так же, как с «агрессивным подмножеством лгбт »: вежливо и аккуратно, но пусть идут общаться с разделяющими их интересы.
(*) повторюсь: под действительно токсичным поведением я понимаю поведение, приводящее к развалу конструктивного рабочего процесса
Второй вариант — ботоводить. именно в схеме «тимлид-проф и толпа младших». к сожалению это тоже сложно, потому что живущие эмоциями часто плохо воспринимают прямые технические указания. самость не позволяет. им же на курсах скзали, что они тепеоь профессиональные программисты. потому — отбирать адекватных, растить из нтх инжееров, а с остальными, увы, как с «агрессивными it-меньшинствами». вежливо и корректно, но выводить их из среды здорового грубоватого, но объективного и аргументированного общения технарей. Пусть портят рабочий процесс у конкурентов. имхо.
Еще варианты? Не знаю.
Но что точно — нам, инженерам, необходимо взращивать в себе некую житейскую мудорость и умение работать с человеческим окружением. Эти скиллы сейчас жизненно необходимы не столько и не только для лмчного выживания, но и для сохранения отрасли. иихо.
Какими бы мы не были асоциальными от природы, как бы мерзка ипротивна эта политкорректность не была местами — эти скиллы нужны.
Хотя бы просто ради того, что бы иметь навыки создать «островки чистой воды», не допустить туда действительно токсичных «толерантных», защитить области чистой воды от окружающего безумия.
Согласитесь, нам необходима среда, в которых можно просто работать. Дружески посылать друг друга нафиг, материться про код, грубо и иногда эмоционально, но конструктивно и объективно обсуждать архитектуру — вот это нужно, а не забивать себе голову фобией о том, что очередной представитель «it-меньшинств» подумает о форме твоих слов, потому что не способен понять содержимое.
Инженеры имеют право на такого рода области работы никак не меньше тех, кто громче всех кричит о своих правах и токсичном к себе поведении.
Пока же для лиц, не способных отличить объективную критику от личностных наездов (как при прослушивании так и высказывающих ), имеющих сложности с техническим мышлением и преобладающим эмоциональным восприятием, но пытающихся работать в it в технических ролях, вопящих сверх разумного про токсичномть — предлагаю ввести термин «it-меньшинства»..
Есть, как минимум, ещё субъективная критика. А вот проблемы с отличием объективной конструктивной критики от субъективной деструктивной обычно у людей привыкших выражаться типа "ты дебил! кто тебя на работу взял? твой код говно — переделывай". Они искренне уверены, что дали такой фразой объективный конструктивный фидбэк.
Идите-ка вы в жопу с вашей «токсичностью»! Я говорю это потому, говорить друг другу такое могут могут позволить себе только друзьяНо мы не друзья. И вряд ли когда-либо бы стали, если вы базовые правила этики соблюдать не в силах, глядя на ваши же комментарии.
Термин «токсичные сотрудники» впервые появляется в статье Майкла Хаусмана и Дилана Майнара, опубликованной в 2015 году в Harvard Business Review. Авторы описывают новый термин, основываясь на более ранних исследованиях психологических типов работников: от «звезд», приносящих организации множество бонусов, до тех, кто вредит своим поведением рабочему процессу. Главной особенностью в трактовке нового термина является тот факт, что токсичные сотрудники не просто вредят рабочему процессу, но и демотивируют весь коллектив, заражая его негативными эмоциями.
Токсичность не определяется грубостью или наоборот излишней вежливостью и обходительностью. И то и то может быть токсичным, если вредит рабочей атмосфере.
Очень похоже на детскую жестокость — люди которые ещё не понимают, что «они делают очень больно» — больше всех вопят о том что «больно им».
Люди которые не понимают, что их поступки разрушают рабочий процесс — зачастую больше других кричат, что им нужна «не токсичная атмосфера», подменяя понятие «токсичность» на личные обиды на критику и форму обращения.
Блин, реально наболело. Поддерживаю текст на все 100!
ps. Кстати. Печенье — очень вредная еда. Дофига калорий, в-основном трансжиры в составе. Люди, зарабатывающие под 200 тыс, не могут позволить себе нормальную еду, что получают самые дешёвые и самые вредные калории — так думают хрюши?
Хамство никогда не способствовало авторитету в действительно профессональном коллективе.
Вон в вашем примере выше — команда тихо и бескровно избавилась от чувака, который им явно не подходил. А если бы они вместо этого начали конфликт? Чувак был бы предупрежден, принял бы меры, к эйчару бы побежал с воплями о токсичности. Избавиться от него было бы значительно сложнее.
Вести себя корректно — не значит ничего не делать. Если бы тот же чувак зашел к эйчару / шефу месяц спустя и вежливо поинтересовался фидбэком, драмы бы не было.
"«Твой код плохой, я сейчас подробно изложу причины и дам советы» уже считается токсичным поведением."— это где так???? Ни разу не видел, чтобы это считалось токсичным поведением.
Общий тренд в целом за последние десять лет имхо сильно сместился от «1) мы разрабатываем хорошую операционную систему (пишем качественный, хорошо документированный код); 2) получаем от этого удовольствие» в сторону «1) получаем удовольствие; 2) разрабатываем операционную систему». В том смысле, что приоритеты поменялись. Теперь главное — be nice to people, не мешайте им получать свой фан, не аннойте их, даже если они что-то делают объективно плохо. Смею полагать, так не только во фре.
Фразу Твой код плохой, я сейчас подробно изложу причины Сергей Milfgard считает не токсичным поведением, но ошибкой и оскорблением. Он разбирает чем она плоха в своей книге, ссылку и цитату на которую я привел чуть выше
Токсичное поведение, на мой взгляд, это нечто большее чем агрессивная подача своего мнения. Я бы сказал, что агрессивные высказывания (как "твой код плохой...") это необходимая, но недостаточная часть токсичного поведения.
Заголовок — «Важные вопросы по вашему коду».
1. Выполнение этого когда может привести к таким-то уязвимостям…
2. Есть альтернативное решение, которое лучше потому что…
3. Подробнее с этим можно ознакомиться на…
Ну типа — «Уважаемый Василий Пупкин. Многократное использование операторов GOTO в вашем коде сильно затрудняет понимание его логики, и последующую его поддержку. Опыт разработники проектов показывает, что использование структурного программирования намного повышает читаемость кода. Рекомендую вам ознакомиться с материалом — программирование-для-ламерят.ру/struct.php » :-)
Жупкин и Пепкин это сообщение даже не прочитают, и пришлют вам свои патчи с GOTO как будто так и надо.
Опыт годовалых сеньоров, к сожалению, настиг меня ещё на первом месте работы. Себя я считаю не очень уверенным мидлом, из за чего крайне отрицательно отношусь к такой завышенной самооценке.
Stackoverflow принципиально читаю только на английском. Давно не авторизовался, ник не помню, но, скорее всего, такой же.
Аргумент с опытом уложил меня на обе лопатки. Вы не оставили камня на камне от моих рассуждений. Уж теперь-то все поймут, что я не прав.
И в один прекрасный день скажет Таня Пете «не мог бы ты ревертнуть ту хрень, которую вчера закоммитил», и выставит Петя Таню в ответ на бабки через корпоративного лоера (система штрафов) за токсичное слово «хрень».
А потом Владислав, наслаждаясь уютом в своем кубике, случайно посмотрит ниже чем надо на ноги Тани, и обдерет Таня Владислава как липку (не сама, а через корпоративного лоера) до самой неуютности, под угрозой увольнения без выплаты.
Думаете, это бред? Есть такой юридический термин — «прецедент». Достаточно одного раза. И пошло поехало. А лоеры, уверяю, гораздо вас умнее и тоже очень хотят кушать.
Уделите своего драгоценного времени минут 20 — сериал «Вечный отпуск» сезон 1 серия 17.
Там все очень доходчиво и наглядно. В каждой сказке есть доля сказки…
А потом, люди называющие себя инженерами, хорошо подумайте — надо вам такое «нетоксичное» IT или нет?
Спасибо что дочитали, никого не хотел обидеть.
Мировое академическое сообщество вновь нашло себе новую жертву для травли. На сей раз ею стал 28-летний учёный из Кембриджского Университета, недавно получивший престижную стипендию на свои исследования. Казалось бы, подобная награда это невероятный престиж для столь молодого ученого, но некоторые его коллеги так не думают.
Более 300 ученых уже подписали открытое письмо, чтобы университет разобрался в сложившейся ситуации i.e. лишил Карла стипендии, а его самого чуть ли не предал анафеме. Так как его работы «этически подозрительны» и «методологически ошибочны». В письме также написано, что ученые шокированы тем, что работы, содержащие столько ошибок и наверно интерпретированных данных, получили признание. В то же время, подписавшиеся не приводят никаких реальных опровержений этим научным работам.
На самом деле, работы Карла довольно известны и он не раз публиковался в таких изданиях как «Intelligence, Personality & Individual Differences, The American Sociologist, Comparative Sociology, European Union Politics» и «The British Journal of Sociology». Более того, с 2013 года его исследования были процитированы 235 раз.
Так что же не так? Спросите вы. На самом деле становится все понятно, как только вы посмотрите на названия его трудов: «Leave and Remain voters’ knowledge of the EU after the referendum of 2016, Cognitive Ability and Political Beliefs in the United States» и «Verbal Intelligence is correlated with socially and economically liberal beliefs».
По сути, учёный затрагивал табуированные леваками темы, а именно связи между генетикой, расами и уровнем IQ. А его основные работы посвящены тому, как интеллект и психологические характеристики влияют на убеждение и поведение человека. За что и был фактически назван «псевдонаучным расистом», хотя никаких опровержений его работ не существует. А мы всё-таки говорим, а недовольстве в научном сообществе.
Отсюда
Оригинал статьи: quillette.com/2018/12/07/academics-mobbing-of-a-young-scholar-must-be-denounced
У чувака хотят отнять деньги, которые дали для проведения более детальных исследований, на основании того что его текущие исследования недостаточно детальны и нужно провести более детальные исследования.
Клоака она и в Африке — клоака!
Или планктон «великомыслящий»?! )))
Статья отдает подростковым максимализмом. Причем прям все тезисы. Нотя верю, что практически все так рассуждают на определенном этапе.
На зависть бабам на базаре!
Всё! Нет слов… Дабы не уподобиться!
кто виноват — понятно. Что делать — нет. Налицо почти подростковое «буду делать как нравится, ваши чувства меня не волнуют, мир жесток».
Что делать? Прошариваться в психологии и понимать, как давать фидбек корректно. Почитайте хоть ту же «Как разговаривать с м*даками».
Почему надо быть аккуратным? Потому что от токсичного коллеги разбегутся остальные. В итоге вы останетесь с начальством, которое требует результатов, и необходимостью работать по 18 часов день, чтобы все успеть. И тоже разбежитесь.
Обиженные люди не будут командой, они не будут вам помогать и будут мешать. Они — не ваши родственники, связанные обязательствами. Им платят за то, что они вообще с вами имеют дело. Если вы собираетесь ездить им по ушам — платите им за вредность. Это бизнес.
Я вам открою страшную тайну — вежливость на работе (адекватная) не самоцель, а инструмент сплочения людей и улучшения рабочей среды. Невежливый человек идет на выход ровно потому, что команда начинает устраивать терки вместо работы. Ты обидел человека, он четыре часа не работал. Честно будет наказать вас штрафом за эти четыре часа, а так же за часы простоя тех, кто зависел от него. После такого вы отлично будете разделять корректный фидбек и «сектантские практики».
Иди-ка ты на !@# со своей «токсичностью»