Русский
Русский
English
Статистика
Реклама

Советы

Боль фронтов, или что нам нужно от дизайнеров

12.02.2021 12:08:58 | Автор: admin

Вступление

Пройдя путь от верстальщика-стажёра до сеньора фронтенд-разработчика, я работал в разных командах и с разными дизайнерами. Независимо от количества человек и типа проекта, всегда были похожие проблемы: взаимное недоверие или даже предвзятое отношение между фронтендщиками и дизайнерами, непонимание макета или дизайн-системы, отсутствие коммуникации в команде и многое другое, что мешало работать. В этой статье я попробую разобрать часть проблем и дам свои рекомендации по их решению. Надеюсь, статья будет полезна как фронтендщикам, так и дизайнерам.

Мифы о UI/UX-дизайнерах

Вначале я хотел бы обратить внимание на предвзятое отношение и недоверие фронтендщиков к UI/UX-дизайнерам. Далее по тексту я опущу приставку UI/UX и буду писать просто дизайнер, подразумевая именно дизайнеров интерфейсов. Выделим несколько мифов, которые мешают в коммуникации.

Мой дизайнер ни за что не изменит свой макет. Это один из самых распространённых мифов. Многие разработчики думают, что макет для дизайнера это как картина для художника, он закончил её и больше ни за что не изменит. В реальности всё не так. Как программисты продолжают работать над кодом, устраняя технический долг и совершенствуя код, так и дизайнеры продолжают работу над макетами. Если команда большая, макет вообще может начать жить своей жизнью. В моей практике почти все дизайнеры шли мне навстречу, если я просил что-то изменить. Даже в самом глубоком энтерпрайзе, где макеты проходили несколько этапов согласований, мы всё равно находили возможность что-то подкорректировать. В любом случае изменения в макетах неизбежны, ведь не все из гипотез дизайнера проходят проверку на реальных пользователях. Если вы можете доходчиво объяснить причину предлагаемого изменения (например, ваш вариант позволяет сэкономить на времени разработки вдвое или есть готовая библиотека с нужным поведением, но немного отличается внешне), вы найдёте компромисс со своим коллегой. Он либо поправит макет по вашим предложениям, либо объяснит, почему его вариант важен для проекта.

Мой дизайнер самый ленивый. Этот миф возникает, когда приходишь несколько раз с одной и той же просьбой к своему дизайнеру, но он её упорно игнорирует. Зачастую дизайнеров меньше на проекте, и они всегда завалены работой и техдолгом как я уже упоминал выше, техдолг есть не только у разработчиков). Если работа простаивает без помощи дизайнера, лучше сходить к тимлиду возможно, есть задачи, которыми можно заняться в ожидании макета. Например, настроить инфраструктуру, среду для тестирования или что-нибудь ещё. Если тимлида нет, можно спросить дизайнера, чем он занимается, и помочь ему с расстановкой приоритетов. Объясните, какие экраны нужны в первую очередь, а какие могут подождать. Возможно, ваш дизайнер готовит дизайн-систему для проекта, тогда его лучше вообще не отвлекать, ведь как и у программистов, у них всегда есть важные задачи, при работе над которыми лучше не отвлекаться. Если вам действительно что-то очень нужно, объясните почему, спросите, когда у коллеги будет возможность заняться вашим вопросом, и до этого времени постарайтесь его не беспокоить.

Мой дизайнер только рисует макеты, откуда он знает, как лучше? Этот миф распространен у Junior-разработчиков. Специально для них объясню, что дизайнеры то люди, которые прорабатывают макет не только чтобы он смотрелся красиво и современно, но и чтобы им было удобно пользоваться. Они знают множество паттернов поведения пользователя, сочетания цветов и форм, о которых мы не догадываемся, поэтому лучший совет в этом пункте: больше доверяйте своему коллеге, он наверняка знает, что делает.

Мой дизайнер самый упёртый. Наверняка каждый фронтенд-разработчик слышал нет от дизайнера, отсюда и возникает этот миф. Опираясь на предыдущие мифы, первый совет поверьте ему на слово. Если не удаётся, попробуйте получить у него больше информации, почему он говорит нет, или обратиться к его менее загруженному коллеге за разъяснением (правда, таким образом можно обидеть своего дизайнера, будьте к этому готовы).

По правде говоря, мифов гораздо больше, но основная мысль, которую я хотел донести, звучит так: все дизайнеры тоже люди, с которыми лучше общаться и задавать вопросы. Многие, с кем я общался, научили меня некоторым тонкостям своего ремесла, которые пригодились мне в вёрстке.

Сложности с макетами

Начну с простого. В макетах не проработаны случаи горизонтального и вертикального переполнения. Часто приходится додумывать самому, что будет с длинным текстом внутри кнопки или в подзаголовке, или как будет осуществляться скролл: внутри контентной области либо на всей странице. Больше всего расстраивает, когда твоё решение не нравится дизайнеру или тестировщику, и приходится перевёрстывать под открытый баг, хотя это не является багом. Например, я прятал длинный текст под троеточием, но дизайнер потом заменил их на уход в прозрачность. Из рекомендаций могу предложить любые белые пятна разбирать в паре с дизайнером, наверняка он уже продумал эти кейсы, но не успел отобразить их на макетах.

Следующая проблема связана с высотой блоков и вертикальными отступами между ними. Бывало, делаешь всё по макету, а при проверке на pixel perfect видишь, что вертикальные отступы отличаются. В моём случае это возникло из-за беспорядка в стилях, определяющих высоту блока. В макете высота строки (line-height) была задана в пикселях и была меньше размера основного текста (font-size), а размер блока был задан через height. При вёрстке я не смотрел на высоту блока, потому что обычно она не задается, ведь это может сломать элемент при переносе строки, и такой блок сложнее адаптировать. Высота блока должна формироваться автоматически и состоять из внутренних отступов (padding), высоты строки (line-height) и ширины рамки (border-width), при этом высота строки должна быть больше либо равна размеру шрифта (font-size). Отступы от блока считаются от внешнего края его границы, поэтому чтобы отступы и размеры блока совпадали с макетом, внимательно проверяйте все свойства. Если в них есть проблемы, постарайтесь объяснить их важность своему дизайнеру и попросите его привести эти стили в порядок. На одном из проектов мы с дизайнером договорились, что все отступы в проекте должны быть кратны определённой величине, например, четырем или восьми пикселям, тогда в случае расхождения отступов на сайте и в макете предпочтение отдаётся ближайшей кратной величине. Этот подход решает много проблем, но важно донести его тестировщику, который может прийти с багами, что отступы отличаются от макетов. Ещё рекомендация: всегда просматривайте свою вёрстку в pixel perfect, чтобы знать, где у вас явные расхождения и где вы могли что-то упустить, а где сам макет расходится с дизайн-системой.

Подобная проблема возникает при вёрстке блоков с рамкой, ведь отступы внутри блока в figma считаются без его учёта. Особенно это заметно на кнопках. Приведу пример.

Рисунок 1 внутренние отступы на примере макета кнопкиРисунок 1 внутренние отступы на примере макета кнопки

В макете отступы внутри кнопки 8px от текста до верхнего края кнопки, но при вёрстке приходится уменьшать их на ширину бордера (border-width), потому что в браузере, как правило (если box-sizing: border-box), бордер входит в высоту и ширину элемента, и внутренний отступ (padding) считается именно от его внутреннего края. Похожая проблема наблюдается, когда кнопка в макете без обводки, но при ховере обводка появляется. Тогда, если делать один-в-один с макетом, наша кнопка будет прыгать, поэтому надо самому добавлять бордер с прозрачностью. Рекомендация только одна: всегда нужно удостовериться, что ваш элемент выглядит так, как нужно.

Следующая проблема связана с прелоадерами. В решении нам поможет теория конечных автоматов. Часто сами фронтендщики грешат тем, что задают одну булевую переменную (isFetching или isLoading) для отображения прелоадера, хотя состояний там гораздо больше. Например, в случае повторного перехода на страницу, на которой уже есть кэшированные данные, произойдёт отображение контента, а потом всё исчезнет и появится прелоадер, потому что пройдет обновление данных. Согласитесь, это не очень красиво. Такая проблема возникла потому, что мы смешали состояние первичной загрузки и обновления данных, а прелоадер использовали один и тот же в обоих случаях. Решить это можно, попросив вашего дизайнера продумать все состояния. Для этого лучше описать их, либо привести пример. При этом на фронтенде нужно будет задавать переменную не в булевом виде, а перечислением состояний, и обрабатывать каждое состояние отдельно.

Раз уж зашла речь о состояниях, хочу отметить, что часто в макетах не хватает всех состояний интерактивных элементов. А их, как правило, шесть:

  • Normal сообщает, что компонент интерактивен и включен.

  • Focus сообщает, что пользователь выделил элемент, используя клавиатуру или другой метод ввода.

  • Hover сообщает, когда пользователь навел курсор на интерактивный элемент.

  • Active активное или нажатое состояние сообщает о том, что пользователь нажал на кнопку.

  • Progress/Loading используется, когда действие не выполняется немедленно и сообщает, что компонент находится в процессе завершения действия.

  • Disabled сообщает, что компонент в настоящее время не является интерактивным, но может быть включен в будущем.

Часто про это забывают, и некоторые состояния сливаются. Сами фронтенд-разработчики иногда объединяют hover и focus в один стиль, что является ошибкой. Постарайтесь обсудить это со своим дизайнером до старта работ, потому что такие решения влияют на доступность вашего продукта. Самый жизненный пример вы кликнули на кнопку, а потом убираете с неё курсор, но она как будто остаётся в состоянии ховера.

О доступности можно написать отдельную статью, поэтому здесь обозначу свою основную боль. Почти во всех проектах, где я работал, дизайнер требовал убрать эту уродскую синюю обводку, которую мы просто отключаем, ничего не добавляя взамен. Речь идёт про outline. Отключая его и не давая ничего взамен, мы ломаем клавиатурную поддержку вашего сайта, потому что по сути мы отключаем у всех интерактивных элементов состояние focus. Вряд ли пользователи, которые пользуются вашим сайтом с клавиатуры, поблагодарят вас, а их немало.

Следующая сложность возникает, когда стайлгайд используется неправильно. Например, есть шрифты для десктопной версии Heading-1 и мобильной версии MobileHeading-1, но в макете Heading-1 в десктопе в мобильной версии неожиданно становится Heading-3. С этим очень сложно работать, потому что вся система, которую я делал на фронте по стайлгайду, начинает рушиться прямо в этом месте. Основной посыл: если есть стайлгайд или дизайн-система, старайтесь максимально ей соответствовать. Например, если дизайнер спрашивает, нужно ли добавлять в стайлгайд немного изменённую кнопку, однозначно говорите да.

Отдельно поговорим об адапативности. Как правило, вёрстка бывает адаптивная и резиновая. Адаптивная подстраивается под конкретные заданные разрешения экрана, а резиновая плавно изменяется, подстраиваясь под любую ширину экрана. На мой взгляд, резиновая вёрстка более современная и универсальная, а ее создание не вызывает трудностей, потому что в арсенале есть flex-box, grid, vw/vh, математические функции и прочее,. Однако, все давно привыкли к бутстраповским брекйпоинтам, и большинство макетов опираются именно на них. Хорошо, если в макете есть хотя бы три состояния: десктоп (как правило, 1440px), планшет (часто это 1024px или 768px) и телефон (320px или 375px). Именно с этого места обычно начинаются проблемы. Приходит заказчик и говорит, что на его моноблоке, у которого разрешение 2500px, сайт выглядит ужасно. Потом приходит аналитик и говорит, что сайт плохо выглядит на его ноутбуке, с разрешением в 1380px и так далее. Здесь описано сразу две проблемы.

Первая не проработан макет или принцип отображения сайта на больших мониторах. Об этом нельзя забывать, всегда просите дизайнера отобразить одну-две страницы на большом разрешении, чтобы был понятен принцип, как сайты должны себя вести на таких экранах. Повторю: приводить все страницы к такому разрешению не надо, достаточно одного-двух примеров.

Вторая проблема промежуточные состояния в макетах. Если размышлять адаптивно, а не резиново, все версии, отображаемые в макете, используются для состояний выше указанного, то есть макет на 1440px подходит для экранов шириной от 1440px и выше до следующего брейкпоинта (если он есть, конечно). Если ширина экрана меньше указанной в макете, должна отображаться версия для предыдущего брейкпоинта. Например, у вас в макете есть состояние на 1440px и 768px, на ширине в 1380px должна отображаться версия на 768px с ограничением ширины контентной области в соответствии с макетом. Выглядеть это будет не очень, мягко говоря. Худший сценарий, когда между брейкпоинтами большой разрыв. Например, дизайнер отобразил состояние на 1920px и на 768px. Тогда, следуя прямой логике, на 1440px включится состояние 768px, но так быть не должно. Суть проблемы в том, что, глядя на макеты в трёх разрешениях, фронтендщик не всегда понимает, какое состояние и в какой момент должно включиться. Если рассмотреть этот пример на резиновой вёрстке, на ширине экрана в 1380px должен отображаться макет для версии в 1440px, а на ширине 1110px версия для 1024px. Здесь возникают вопросы: в какой момент должна включаться какая из версий? До какой ширины экрана будет отображаться версия в 1024px? рассмотрим потенциальные варианты решений. Первый пойти к дизайнеру и описать проблему. Наверняка у него уже есть видение, как сайт должен меняться при сжатии и расширении экрана, он объяснит вам хотя бы на словах, однако это не всегда работает. Второй вариант отвязать свой разум от бутстраповских брейкпоинтов и рассматреть каждый блок как независимый. Потом я начинаю сжимать и разжимать каждый блок, наблюдая за его поведением, и определяю оптимальное разрешение для смены состояния. Многим верстальщикам такой подход не нравится и кажется избыточным. Основной аргумент возможно появление множества брейкпоинтов, но как показывает практика, этих состояний вряд ли будет больше шести, и все они будут инкапсулированы внутри своих блоков и ни на что не повлияют. Однако, ваш макет будет действительно резиновый и сможет подстраиваться под любое разрешение экрана.

Чем дизайнер может помочь фронтенд-разработчику

Здесь я собрал некоторые пункты, наличие которых в проекте помогло бы мне верстать.

  • Комментарии к макетам. Невозможно всё отобразить в макете, и в этом нет необходимости, но некоторую информацию лучше описать в комментариях. Конечно, можно передавать информацию устно, но если фронтенд-разработчиков много, будьте готовы объяснять каждому отдельно. Усложнится и процесс онбординга новых людей, потому что можно просто забыть, почему было принято то или иное решение.

  • История изменения макетов. Часто при работе над макетом неожиданно обновляются требования к продукту, и в макет вносят изменения. Фронтендщику ставят задачу на перевёрстку, но, на первый взгляд, все выглядит, как раньше. Только при более детальном исследовании выясняется, что поменялся, например, порядок иконок социальных сетей в футере, изменились некоторые отступы в контентной области или изменились некоторые тексты на странице. Чтобы это выяснить, приходится делать скриншот макета и сопоставлять его с текущей вёрсткой сайта. В Figma на данный момент нет системы контроля версий, поэтому всё ложится на плечи команды. И только коммуникация помогает решить данную проблему.

  • Стайлгайд проекта. Страница со всеми состояниями интерактивных элементов, страница с типографией, страница с формами и примерами их заполнения и прочее, что позволит атомарно подойти к блокам. Хорошо проработанный стайлгайд проекта залог успеха. Главное держать его в актуальном состоянии и не нарушать его.

  • Доступность интерфейса. Понимание дизайнером всей важности доступности вашего интерфейса и ее учет при проектировании очень важны. Сделать сейчас как есть, а потом задуматься о версии для слабовидящих или о режиме для чтения не получится. Внедрение доступности будет гораздо тяжелее, если вообще возможно.

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

  • Структура проекта в Figma. Многие разработчики жаловались мне, что невозможно открыть Figma, потому что на одной вкладке отображаются все страницы проекта. Правильная структура хранения проекта облегчит работу с ним как дизайнеру, так и разработчику.

  • Названия у цветов и шрифтов. Когда у всех цветов и типов шрифтов есть имена, фронтенд разработчику не придётся их придумывать. Идеально, если имена содержат только буквы, цифры и знаки $ и _, при этом первый символ не является цифрой. Это необязательно, но позволит использовать названия прямо в коде, что облегчит их применение и поддержку в актуальном состоянии.

  • Консистентность между версиями. Это, скорее, просьба к дизайнерам. Разрабатывая макет мобильной версии сайта, старайтесь помнить, что это всё-таки сайт, а не мобильное приложение. Хочется видеть консистентность между десктопной и мобильной версиями. В некоторых проектах мобильная и десктопная версии настолько отличались, что приходилось делать разные версии с нуля, а это забирает в два раза больше времени на разработку.

Что следует знать дизайнерам о фронтенде

  • Вёрстку без практического опыта изучить невозможно, но было бы хорошо знать хотя бы основные правила, по которым формируется веб-страница. Это позволит дизайнеру понять, где верстальщику будет непонятна реализация, а где он скорее всего ошибётся.

    • box-sizing определяет, как вычисляется общая ширина и высота элемента;

    • margin определяет внешний отступ;

    • padding определяет внутренний отступ;

    • border отвечает за все персональные свойства границ;

    • overflow работает с переполнением;

    • flex/grid наиболее популярные типы отображения элементов.

  • Одна из основных методологий в CSS БЭМ. Дизайнеру она нужна, чтобы понять образ мыслей фронтендщика, который будет собирать страницу, и позволит хранить элементы проекта аналогично тому, как это будет делать фронтенд-разработчик.

  • Отличие блочных элементов от строчных. Это позволит глубже понять композицию веб-страницы.

  • Браузерные инструменты разработчика упростят процесс проведения авторского надзора и помогут проверить некоторые гипотезы непосредственно в рабочей среде.

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

Что следует знать фронтендщику о дизайне и не только

  • Сетка. Практически все макеты строятся на основе сетки. Зная её, верстать становится проще, а учитывая, что теперь у нас есть grid, это превращается в удовольствие.

  • Основы Figma. Говорить с дизайнером на одном языке и понимать особенности и отличия вёрстки в Figma и WEB-е.

  • БЭМ. Неважно, как вы верстаете, будь то CSS-in-JS или CSS-modules, методология позволяет навести порядок в голове и мыслить правильными категориями.

  • Наследование стилей. Многие CSS свойства наследуются от родительского блока, в Figma это отсутствует.Чтобы не переписывать все стили, не глядя , помните, какие свойства берутся от родителя, а какие объявляются в самом элементе.

  • Конечные автоматы. Понимать, сколько состояний может быть у того или иного элемента на странице.

Повторю мысль из предыдущих частей: если вам что-то непонятно или интересно к своему дизайнеру и задавайте вопросы, набирайтесь опыта в построении интерфейсов у профессионалов.

Заключение

В этой статье я осветил только часть того моста, который перекинут между двумя берегами фронтенда и UI/UX-дизайна. Надеюсь, мой опыт поможет фронтенд-разработчикам и дизайнерам чуть лучше понять друг друга.

Главное, что хочется вынести в заключение мы работаем с людьми, а значит, любой вопрос можно решить через общение и прийти к компромиссу. Уважайте своих коллег и чаще ставьте себя на их место.

P. S. (постскриптум)

За помощь в подготовке материала благодарю самого крутого из дизайнеров Олега Ровного.

Подробнее..

5 советов для прокачки своих навыков в Angular

14.09.2020 16:14:47 | Автор: admin

Этим летом мы с Ромой запустили серию твитов с полезными советами и приемами по Angular. Сообщество тепло встретило эту инициативу, и я решил написать обобщающую статью.Вот мои 5 рекомендаций, которыми хочется поделиться с разработчиками. Эти советы будут подкреплены конкретными примерами из моего твиттера. Они помогут вам поднять свои навыки или как минимум дадут пару практических приемов.

1. Разберитесь в работе механизма проверки изменений

В интернете множество отличных углубленных статей про проверку изменений в Angular. Например, вот эта. Так что давайте просто освежим основы и перейдем к советам.

Основы

В Angular два режима проверки изменений: Default и OnPush. Первый запускает проверку на каждый tick внутри приложения. Этим управляет Zone.js, которая патчит все асинхронные операции вроде подписок на события и промисов. Второй режим помечает view для проверки, только если в нем случилось слушаемое событие или изменились входные данные.

Default vs OnPush

По правде говоря, вряд ли есть причины использовать режим Default. Просто пишите код так, как задумано принципами фреймворка, и вы не попадете в неприятности с OnPush. Это означает никогда не мутировать данные. Если ваши входные объекты или массивы немутабельные, OnPush подцепит изменения и обновит вью.

Подписки на события через @HostListener Angular заметит и в OnPush. Но что делать, если вы используете RxJS? Всегда можно заинжектить ChangeDetectorRef и вызвать markForCheck(), когда потребуется. Декларативным решением тут будет async пайп, если стрим в итоге доходит до шаблона. Он сам запустит проверку и возьмет на себя отписку.

Вам наверняка попадался такой паттерн:

<div *ngIf="stream$ | async as result"></div>

Но что делать, если вам важны также falsy-результаты? Можно выкинуть всю логику на условие из ngIf и сделать свою простую структурную директиву. Она будет использоваться, только чтобы объявить контекст для вложенного вью:

Код
@Directive({  selector: "[ngLet]"})export class LetDirective<T> {  @Input()  ngLet: T;  constructor(    @Inject(ViewContainerRef) container: ViewContainerRef,    @Inject(TemplateRef) templateRef: TemplateRef<LetContext<T>>  ) {    container.createEmbeddedView(templateRef, new LetContext<T>(this));  }}

NgZone

Если у вас нет возможности полностью перейти на OnPush, можно провести оптимизации. Заинжектите NgZone и выполняйте нагруженные операции в .runOutsideAngular(). Таким образом не будет возникать лишних тиков в механизме проверки изменений. Даже компоненты в режиме Default не будут реагировать на эти операции. Это уместно делать для частых событий, таких как mousemove или scroll. Это можно сделать декларативно в RxJS-стримах с помощью двух операторов: один для выхода из зоны, другой для возврата в нее, чтобы запустить проверку изменений:

Код
class ZonefreeOperator<T> implements Operator<T, T> {  constructor(private readonly zone: NgZone) {}  call(observer: Observer<T>, source: Observable<T>): TeardownLogic {    return this.zone.runOutsideAngular(      () => source.subscribe(observer)    );  }}export function zonefull<T>(zone: NgZone): MonoTypeOperatorFunction<T> {  return map(value => zone.run(() => value));}export function zonefree<T>(zone: NgZone): MonoTypeOperatorFunction<T> {  return source => source.lift(new ZonefreeOperator(zone));}

Еще один вариант, работающий с @HostListener, создать свой EventManagerPlugin. Мы выпустили open-source-библиотеку под названием ng-event-plugins. Она позволяет отсеивать лишние проверки изменений. Подробнее об этом читайте в этой статье.

2. Хорошенько разберитесь в RxJS

RxJS очень мощный инструмент. Мы все его используем в той или иной мере, но именно хорошее владение им очень сильно поможет вам. От простых стримов, которые позволят быстро перезагрузить компонент

до сложных комбинаций операторов. Например, чтобы понять, настоящий у вас скролл или инерционный:

Только посмотрите, как просто создать шапку, исчезающую при прокрутке сайта вниз. Совсем немного CSS и базовый RxJS:

Код
@Directive({  selector: "[sticky]",  providers: [DestroyService]})export class StickyDirective {  constructor(    @Inject(DestroyService) destroy$: Observable<void>,    @Inject(WINDOW) windowRef: Window,    renderer: Renderer2,    { nativeElement }: ElementRef<HTMLElement>  ) {    fromEvent(windowRef, "scroll")      .pipe(        map(() => windowRef.scrollY),        pairwise(),        map(([prev, next]) => next < THRESHOLD || prev > next),        distinctUntilChanged(),        startWith(true),        takeUntil(destroy$)      )      .subscribe(stuck => {        renderer.setAttribute(          nativeElement,           "data-stuck",           String(stuck)        );      });  }}

Сложно переоценить знание RxJS для Angular-разработчика в долгосрочной перспективе. Простой на первый взгляд RxJS требует некоего смещения парадигмы, чтобы начать мыслить потоками. Но, когда вы это сделаете, ваш код станет аккуратнее и легче в поддержке.

Тут особо нечего советовать, кроме как больше практиковаться . Если видите ситуацию, которую можно решить через RxJS, попытайтесь сделать это. Избегайте сайд-эффектов и вложенных подписок. Держите свои стримы в порядке и следите за утечками памяти (подробнее об этом дальше).

3. Выжимайте максимум из TypeScript

Мы все пишем Angular-приложения на TypeScript. Но, чтобы получить максимальную пользу, нужно задействовать его целиком. Я редко вижу проекты с включенным strict: true. Вам определенно следует сделать это. Оно спасет вас от множества cannot read property of null и undefined is not a function.

Дженерики

В TypeScript существуют дженерики для случаев, когда тип, с которым мы работаем, неизвестен. Комбинация дженериков, перегрузок и сужения типов позволит вам сделать крутой API. Почти никогда не придется делать тайпкаст. Посмотрите на этот пример типизированного RxJS-метода fromEvent:

Код
// Тип события с конкретным currentTargetexport type EventWith<  E extends Event,  T extends FromEventTarget<E>> = E & {  readonly currentTarget: T;};// Типизированный вариант fromEventexport function typedFromEvent<  E extends keyof GlobalEventHandlersEventMap,  T extends FromEventTarget<EventWith<GlobalEventHandlersEventMap[E], T>>>(  target: T,  event: E,  options: AddEventListenerOptions = {},): Observable<EventWith<GlobalEventHandlersEventMap[E], T>> {  return fromEvent(target, event, options);}

С ним вы будете уверены, что событие имеет конкретный тип, а currentTarget это элемент, на котором вы его слушаете.

API, построенные на дженериках, хороши тем, что они не завязаны на формат данных. А значит, их легко расширять и другим разработчикам не придется подстраиваться под определенный интерфейс.

Есть немало статей о продвинутой типизации и всевозможных трюках с TypeScript. Я очень советую расширять свои знания в этой области, это поможет вам писать надежный код. Мой последний совет: не используйте any. Если вы не можете применить дженерик, более безопасным выбором будет unknown.

Декораторы

Не забывайте про другие инструменты TypeScript, такие как декораторы. При умелом использовании они могут значительно улучшить ваш код. К примеру, бывают ситуации, когда тип переменной корректный, но значение не подходит: отрицательное или дробное число не подходит для обозначения количества, хотя тип и там, и там number. TypeScript такое не отловит, но мы можем защитить компоненты в runtime с помощью декоратора:

Код
export function assert<T, K extends keyof T>(  assertion: (input: T[K]) => boolean,  messsage: string): PropertyDecorator {  return (target, key) => {    Object.defineProperty(target, key, {      set(this: T, initialValue: T[K]) {        let currentValue = initialValue;        Object.defineProperty(this, key, {          get(): T[K] {            return currentValue;          },          set(this: T, value: T[K]) {            console.assert(assertion(value), messsage);            currentValue = value;          }        });      }    });  };}

Вы знали, что декорированный абстрактный класс не нуждается в пробросе аргументов в super()? Angular сам сделает это за вас, если не использовать конструктор в дочернем классе:

Еще один хороший пример для декораторов переиспользуемая логика обработки. Посмотрите кусок кода из нашей библиотеки для Web Audio API в Angular, где мы превращаем декларативный байндинг в императивные нативные команды с помощью строго типизированного декоратора. Подробнее про саму библиотеку можно почитать тут.

4. Dependency Injection. Используйте его почаще

DI одна из причин, почему Angular такой мощный фреймворк. Возможно, это даже главная причина. Но слишком часто его не используют по полной.

Могу порекомендовать нашу статью, посвященную DI, чтобы освоиться с этим инструментом.

RxJS

Что касается практических советов, выше я уже говорил быть внимательными к утечкам памяти в RxJS. Главным образом это означает, что, если вы подписались на стрим руками, вам же и придется от него отписаться. Идиоматическим решение в Angular будет инкапсуляция подобной логики в сервис:

Код
@Injectable()export class DestroyService extends Subject<void> implements OnDestroy {    ngOnDestroy() {        this.next();        this.complete();    }}

Вы также можете создавать общие стримы и добавлять их в DI. Нет необходимости создавать отдельные потоки на базе requestAnimationFrame в вашем приложении. Создайте токен и переиспользуйте его. Вы даже можете заложить в него операторы для выхода из зоны, описанные выше:

Токены

DI хороший инструмент для повышения абстрактности вашего кода. Если вы не зависите от глобальных объектов вроде window или navigator ваше приложение готово к использование в Angular Universal в серверном окружении. Такой код просто тестируется, так как все его зависимости легко подменить на заглушки. Глобальные объекты без труда превращаются в токены. Внутри фабрики при объявлении токена нам доступен глобальный инжектор. Нам потребуется всего пара строк для создания WINDOW токена на базе встроенного DOCUMENT:

Код
export const WINDOW = new InjectionToken<Window>(  'An abstraction over global window object',  {    factory: () => {      const {defaultView} = inject(DOCUMENT);      if (!defaultView) {        throw new Error('Window is not available');      }      return defaultView;    },  },);

Чтобы не тратить на это время, используйте нашу open-source-библиотеку, где мы уже реализовали многие такие токены. А для Angular Universal есть ее библиотека-сестра с качественными заглушками. Не стесняйтесь, пишите нам, если вам нужен еще какой-то токен.

Токены и фабрики дают массу возможностей. В сочетании с иерархической структурой DI они позволяют сделать приложение очень модульным. Можете почитать больше про использование провайдеров в этой статье.

5. Бросайте императора в бездну, как Вейдер

Angular со своим синтаксисом шаблонов и декораторами подталкивает нас к декларативному подходу. Я уже упоминал его. Не будем сейчас вдаваться в подробности о его преимуществах по сравнению с императивным кодом. Я просто дам вам четкий совет: пишите декларативный код. Когда вы к нему привыкнете, то заметите, насколько все стало лучше.

Геттеры

Что это означает писать декларативный код? В первую очередь постарайтесь использовать ngOnChanges как можно реже. Это плохо типизированный сайд-эффект, который нужен, по сути, только когда надо выполнить какое-то действие при изменении нескольких входных значений.

Если есть необходимость отреагировать на изменение одного инпута сеттер будет более прямолинейным решением. Если же вместо действия вы собирались обновить какое-то внутреннее состояние, убедитесь что его нельзя заменить вычисляемым геттером.

Производительность и геттеры тема для отдельной статьи, до которой я надеюсь вскоре добраться. А пока возьмите за правило не создавать новых объектов или массивов внутри геттеров. Это существенно более затратная операция, чем арифметика или сложение строк. Если вам требуется пересоздать объект, воспользуйтесь техникой мемоизации к примеру, чистым пайпом.

Это хороший пример для сеттера, который я опустил для краткости, но про который мне напомнил внимательный читатель.

Template reference variables

Вместо ручного запрашивания элементов из шаблона в Angular предусмотрен декоратор @ViewChild. Однако зачастую он не нужен, если можно завернуть передачу элемента в шаблоне:

<input #input><button (click)="onClick(input)">Focus</button>

Здесь мы передаем template reference variable непосредственно в метод, где она нужна. Так код нашего компонента остается чище. Думайте об этом как о подобии замыкания в шаблоне.

Но что, если мы хотим получить DOM-элемент, который является компонентом? Мы могли бы написать @ViewChild(MyComponent, {read: ElementRef}), но мы обойдемся без поля класса, если создадим директиву с exportAs:

Код
@Directive({    selector: '[element]',    exportAs: 'elementRef',})export class ElementDirective<T extends Element> extends ElementRef<T> {    constructor(@Inject(ElementRef) {nativeElement}: ElementRef<T>) {        super(nativeElement);    }}

Динамический контент

Люди часто используют ComponentFactoryResolver для императивного создания динамических компонентов. Зачем, если есть директива ngComponentOutlet? Потому что так мы получим доступ к экземпляру компонента и сможем передать в него данные. Хороший способ решения подобной задачи опять же, Dependency Injection. ngComponentOutlet позволяет передать Injector, который мы создадим и подложим в него данные через токен.

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

Мы уже давно используем этот подход, не зависящий от типа переданного контента. Мы вынесли его в крошечную open-source-библиотеку под названием ng-polymorpheus. Она не делает ничего, кроме передачи контента в соответствующий встроенный инструмент, ngTemplateOutlet, ngContentOutlet или же простую интерполяцию с вызовом функции. Когда привыкаешь к такому, обратной дороги уже нет! Подробнее читайте в этой статье.

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

Подробнее..

Перевод 3 полезных Python-инструмента для упрощения работы с кодом

02.09.2020 16:16:09 | Автор: admin

Любой разработчик использует те или иные вспомогательные инструменты. Какие-то из них позволяют ускорить процесс, какие-то избавиться от ошибок, сделать код более понятным. Такие инструменты есть практически в любой сфере разработки.

Престон Бадир (Preston Badeer), Python-программист, поделился набором расширений которые, по его мнению, значительно упрощают и ускоряют кодинг. За 5 лет работы он перепробовал множество инструментов и выделил три наиболее полезных.

Kite: быстрый доступ к документации и автозаполнение на основе ИИ


У большинства IDE есть встроенная функция автозаполнения. Примерно так выглядит процесс работы с ними.


Эти инструменты используют внутреннюю документацию для автоматической подстановки параметров и имен функций. Но что если бы существовал инструмент, который способен помогать не только с именами функций, но и с часто используемыми кусками кода? А еще анализировал данные репозиториев GitHub и предлагал нужные подсказки. Такой инструмент есть. Kite умеет многое, но большинство важных функций можно разделить на три группы.

Smart-подсказки на основе ИИ


Kite изучает кодовую базу, запоминает название переменных, которые часто использует разработчик, имена параметров из интернета и документацию, чтобы выдавать контекстные рекомендации, например:


В примере показано, как Kite предсказывает какие переменные вы будете использовать в зависимости от контекста кода. Вот еще пример работы подсказок:


Мы потратили большое количество времени на семантическую индексацию всего кода на GitHub, построение статистических выводов и обширных моделей, которые помогают использовать полученную информацию, комментирует продукт CEO Kite Адам Смит.

Улучшенная работа с документацией


Если коллеги вам никогда не отправляли в рабочем чате RTFM, значит, вы разработчик, который не допускает ошибок. Но, в любом случае, вы должны сначала ознакомиться с документацией, а затем уже спрашивать коллег о какой-то проблеме или искать ответы на вопросы на Stack Overflow. Чтение документации важный этап создания программного кода. Более удобным его сделает Kite Copilot, который в режиме реального времени показывает описание подсвеченных курсором объектов и функций.


Ваш код остается с вами на локальном ПК


Kite создан для локальной работы и не отправляет код в облако. Скорость работы подсказок достаточно высокая. Это важно для тех, у кого медленный интернет или работа связана с закрытым/проприетарным кодом.

Я работаю с этим инструментом несколько лет, и он становится только лучше. Опробовать его можно прямо сейчас.

Улучшаем код с Mypy


Python динамически типизированный язык, что позволяет в любое время сделать любую переменную с любым типом данных. Одна и та же переменная может быть как строкой, так и целым числом или иным типом данных в зависимости от последнего присвоенного значения. Это ускоряет процесс написания кода, когда разработчику не нужно каждый раз вручную назначать тип данных для переменных.

# These two variable types are declared the exact same way# Python figures out the data type on it's own, dynamically# stringvar_name = "string here"# integervar_name = 1234

А вот пример языка со статической типизацией, где каждой переменной задается конкретный тип данных, чего необходимо придерживаться в логике:

# Many languages require the data type to be declared too# stringstr var_name = "string here"# integerint var_name = 1234

В динамическом подходе есть и минусы:

  • К концу процесса разработки повышается риск столкнуться с ошибками, так что придется переписывать какие-то части кода.
  • Из-за постоянного вычисления типов код работает медленнее.
  • Из-за динамической типизации код становится небезопасным, так как у функции на входе и выходе могут быть разные типы данных у одной и той же переменной.
  • Читать динамический код сложнее, поскольку другой разработчик не может быть на 100% уверен в том, что объявленная ранее переменная не изменит тип.

Бесплатный инструмент Mypy внедряет статическую типизацию в код. Он позволяет находить ошибки несоответствия типов в коде. Если обнаружено несоответствие значение переменной присвоенному типу, выводится ошибка.

# Declaring a function using normal dynamic typing, without mypydef iter_primes():   # code here# Declaring the same function with mypy static typingfrom typing import Iteratordef iter_primes() -> Iterator[int]:   # code here

Это самый простой пример из целого списка. Если вам нужно больше информации, переходите по ссылке. Кроме того, в документации Mypy есть обширный FAQ.

Быстрый поиск ошибок и написание простых функций с SonarLint


У большинства IDE есть линтеры, статические анализаторы ошибок. Линтер еще до запуска кода может найти ошибку. Это считается статистическим анализом кода.


Но есть еще и динамический анализ, который в фоновом режиме запускает/компилирует код, проверяя правильность его работы. И если что-то идет не так, сообщает о возможной ошибке. Как раз по такому принципу работает бесплатный проект SonarLint.

Закомментированный или неиспользуемый код

Каюсь, бывает, что я оставляю операторы вывода, закомментированный код и неиспользуемые функции по всей кодовой базе. SonarLint предупреждает об этих проблемах, показывая, где что находится. Без SonarLint поиск проблем и отладка может занять многие часы.



Проблемы с безопасностью

У SonarLint есть большая обновляемая база данных с перечнем уязвимостей, которая позволяет плагину вовремя предупреждать разработчика о найденных в коде проблемах.

Читаемость кода

SonarLint предупреждает о чрезмерном усложнении кода, объясняя суть проблемы. Это может быть, например, слишком большая вложенность операторов if.

В качестве вывода


Небольшое резюме, чтобы не забыть описанные в статье инструменты:


А какие полезные инструменты для работы с Python используете вы?

Подробнее..

Здравствуй, дорогой я двадцать лет назад

18.11.2020 22:19:29 | Автор: admin


Жаль, что вряд ли смогу отправить это письмо. А тебе, наверное, было бы интересно узнать, что жизнь и работа у тебя сложились неплохо. А если бы ты это прочитал вовремя, то могли бы сложиться еще лучше. Что касается работы ты стал вполне приличным специалистом, сегодня тебя уважают, с тобой советуются и некоторые даже благодарны за науку. Очень хочется дать тебе тогдашнему несколько советов. Кое о чем из письма ты и так уже догадываешься, но сегодня я могу точно сказать оно помогает.


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


В первую очередь:


Английский язык хотя бы на уровне чтения. Вся актуальная техническая информация на английском. Причем, в интернете. Он у тебя только начинает появляться местами, но знай это отличный источник информации, если уметь им пользоваться и фильтровать. Тем более, его там, в твоем времени, еще так не загадили. Но сейчас не об интернете, а об английском. Переводные книги на русском устаревают к моменту выхода на два-четыре года. Даже печатные книги на английском устаревают на год. Дистрибьютеры микросхем, например, прямо на семинарах говорят, почему они перестали переводить документацию бесполезно. Пока вышел перевод, уже серия устарела и вышла новая. Документация в электронном виде наше всё. В институте у тебя были по английскому одни пятерки, ты был лучшим в группе и одним из лучших на курсе, так знай этого мало. Знания твои на троечку от силы. Это только база для начала освоения английского. Надо больше читать. А еще лучше смотреть и слушать, фильмы, лекции, записи конференций и семинаров. Когда интернет станет подешевле и побезлимитнее, у тебя появится такая возможность, не упусти ее.


Поиск и анализ информации в открытых источниках. Не только Ctrl-C Ctrl-V со StackOverflow (ах да, у тебя там его еще нету, но запомни это слово, после 2008 пригодится) но оценка полезности и применимости, способность выбрать из десятка книг лучшую, даже не особенно разбираясь в предмете. Надо сказать, это главное, чему тебя научил институт. Те учебники и справочники, которые ты выбрал в Доме книги на Вайнера, оказались в числе лучших, и лучшее из всего, что было на полке.


Постоянная учеба: как говорила Черная Королева Алисе даже чтобы оставаться на месте, надо бежать со всех ног, а чтобы двигаться вперед, надо бежать вдвое быстрее. Читай профильную литературу, проходи бесплатные онлайн-курсы (когда появятся), проверяй себя на тестах и задачах на Codewars, Hackerrank или что еще найдешь.


Отслеживай состояние отрасли и новинок в ней читай периодику, по возможности участвуй в конференциях хотя бы слушателем (кое-где и выступишь, готовься).


Учись вести переписку и переговоры. Не очень приятно, но придется будешь и официальные письма писать, и в командировки ездить. Надо как владеть канцелярско-дипломатическим языком, так и быть в состоянии неформально (но не фамильярно) общаться по неофициальным каналам.


Было бы здорово, если бы ты участвовал в сообществах и OpenSource-проектах, но на это у тебя не будет хватать сил и будет жалко времени. Может, все-таки постараешься?


Насчет учебы:


У тебя не получится обойтись одним языком программирования, иногда придется осваивать другие, и в довольно сжатые сроки. Так вот, лучший источник информации по языку это его официальная документация. Учебники хороши, когда не умеешь программировать совсем. После того, как более-менее освоишь один язык, для перехода на другой не нужен учебник, нужен справочник, а лучший справочник по языку его документация. Конечно, не стоит ограничиваться только справочником, есть какие-то стандартные подходы, best practice, описанные в отдельных книгах, типа "55 советов" Майерса.


Когда возьмешься за программирование всерьез, непременно напиши небольшой проект на ассемблере. Любом, хоть для ПК, хоть для микроконтроллера, благо есть куча дешевых отладочных плат или копеечных МК, которые можно лазерно-утюжным методом превратить в простое устройство (в общем-то, ты все это обязательно попробуешь). В проекте используй различные методы адресации и передачи параметров в подпрограммы, создай подпрограммы в полном соответствии с правилами: выделение стекового кадра, сохранение регистров в стеке, передача параметров и возврат значения. Опять же, поработай со стеком выдели место для него в памяти и пробуй сохранять/восстанавливать данные, особенно интересно на рекурсивных подпрограммах. Это снимает кучу недопониманий: что такое указатели и указатели на указатели, что такое размещение на стеке и откуда берется переполнение стека, как работают локальные переменные и почему до инициализации в них мусор, вопросы про соглашение о вызове типа stdcall и всё такое прочее.


Непременно заведи шпаргалку. И не одну, а по каджому языку и инструменту, типа системы контроля версий или IDE. В любой программерской работе есть типовые решения. Они не сразу записываются "на подкорку", их сначала надо узнать, а потом к ним привыкнуть. Хорошо в этом помогают сборники собственных учебных проектов (ну, и не только учебных), откуда можно копировать удачные уже найденные решения. Но по своим проектам непросто искать, где что. Если наткнулся на задачку, которая явно должна иметь типовое решение, следует это решение найти самому, или в документации (в рекомендованных вариантах использования библиотеки, например), или в поисковике (StackOverflow), а потом хорошо бы это решение переписать в отдельный файл-сборник и пометить текстовым тегом/заголовком, по которому его будет легко найти, ибо скорее всего это решение еще не раз понадобится. Однажды закончатся новые разработки с процессором 1806 и его ассемблер PDP-11 будет отложен и подзабыт. А потом внезапно, лет через пять, надо будет дополнить чужую программу, и на работу будет два дня. Так вот, без такой шпаргалки ты не справишься, а с ней запросто.


Непременно освой систему контроля версий, чем раньше, тем лучше. После 2005 года выбирай GIT, он станет стандартом де-факто. Конечно, не обязательно его, но я-то знаю, что ты выберешь Это действительно очень полезная штука даже в сугубо индивидуальной разработке. Для работы в одного плюсы:


  • резко сокращает объем проекта. Сохранять промежуточные точки версии все равно придется, самый популярный метод без СКВ копировать весь проект. Так накапливается куча огромных папок (со всеми служебными файлами) из-за изменений в паре строк пары файлов. Ты и займешься выбором СКВ, когда твой первый серьезный проект вырастет до десятка гигов. А я еще помню, что у тебя дома на компьютере винчестер всего на шесть. Так что начинай пораньше.
  • улучшает возможность поиска по актуальности, особенно если папки с "как бы версиями" называются "новая", "последняя", "текущая", "самая новая". А у тебя в отделе было так принято, я помню. И ты внесешь свой вклад в то, чтобы это прекратить.
  • упрощает слияние версий, позволяет создавать вместо копии проекта отдельную ветку, при неудачной попытке грохнуть эту ветку, не трогая остальную работу, при удачной легко влить изменения в основную средствами СКВ.
  • обеспечивает ведение реальной хронологии проекта, позволяет увидеть затраты времени на свою работу над более-менее однотипными задачами для последующей оценки времени на похожие проекты по времени коммитов. Это тебе тоже пригодится не раз, с тебя будут требовать планы с ориентировочными сроками, так не срывай их!
  • упрощает переход на командную работу над проектом, если проект перерастет во что-то серьезное, с чем одному уже не справиться.
  • уменьшает трудозатраты при необходимости разобраться в проекте, показывая последовательность разработки с комментариями, поясняющими что и зачем было сделано. Это может быть полезно не только при передаче в чужие руки, но и при открытии собственного проекта трехлетней, да что там, порой и двухмесячной давности.

Не пренебрегай разминкой для ума. Задачки в книгах это не очень интересно, но скоро появятся сайты типа hackerrank, codewars. Позволяют проверить свои знания, посмотреть на некоторые задачи под необычным углом зрения, сравнить свои решения с чужими, в конце концов, баллами померяться с коллегами. У меня на первых простейших задачах hackerrank местами ступор был, потом как с мертвой точки сорвался стали получаться результаты все ближе к оптимальным.


Строй костыли и велосипеды. Свои решения некоторых задач делать надо. Парсеры, функции сортировки и тому подобные, вплоть до своих мини-баз данных. Но в учебных целях чтобы понимать механику работы таких штук. Однако при наличии готовых библиотек или готовых методов у имеющихся стандартных классов данных надо использовать именно готовое оно написано более опытными людьми, проверено и протестировано. Свои велосипеды используй только тогда, когда есть 100% уверенность, что оно или позволяет выкроить лишнее время или память там, где этого катастрофически не хватает. Не спеши с этим, для такого решения уже надо понимать, что такое профилировка, как прогонять тесты производительности и чем придется жертвовать при выкраивании ресурсов, потому что выигрыш бесплатным не бывает.


Попробуй попользоваться логарифмической линейкой не пожалеешь. Удивительный инструмент, хотя для программиста почти бесполезный. Позволяет выполнять довольно сложные последовательности математических вычислений. В институтах был когда-то семестровый курс логарифмической линейки, были учебники. Основная хитрость при ее использовании чему, собственно, и учили оптимизация вычислений. Перед тем, как начать работать с линейкой, серию вычислений надо минимизировать так, чтобы как можно меньше двигать ползунок и среднюю шкалу. Это очень полезный навык, который стоит освоить, он-то и пригодится. Даже если потом линейка будет отложена и забыта.


О подходе к работе:


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


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

Так как не везде есть стандарты кодирования, стоит выбрать и принять для себя какие-то и следовать им. Наилучшим выбором будет взять готовые стандарты уважаемой организации, например, Google или Mozilla, особенно, если они касаются языка, разработанного этой организацией. Сюда входят правила именования сущностей, использование регистра, префиксов/суффиксов, отступы, табы-пробелы и прочее. Найдешь в интернете, это несложно.


Работай над контролем собственного времени. Здесь есть две крайности:
1) задача рутинная, неинтересная, хочется отвлечься. Чревато тем, что она не будет выполняться до тех пор, пока не замаячат реальные угрозы хорошей выволочки. В результате то, на что отводился месяц, будет делаться последние два-три дня круглосуточно. Ну, примерно как твои недавние еще курсовые.
2) задача очень интересная, "цепляет", не отпускает. Погружаешься в нее с головой, отпинывая тех, кто пытается отвлекать. Чревато серьезной утомляемостью. Опять же, если впахивать не отрываясь, через некоторое время производительность падает, хотя субъективно кажется, что все в порядке, работа идет вроде бы так же.
В обоих случаях надо себя заставить работать равномерно, делая перерывы, но не делая перерывы больше, чем периоды работы над задачей. Есть разные методики управления временем, гуглить аббревиатуру GTD (Getting Things Done) и метод помодоро. Тебе понравится, но не всегда получится использовать.


Занимайся декомпозицией и планированием. Принцип "ввязаться в бой, а там посмотрим" работает только на маленьких одноразовых задачках. Любую серьезную задачу можно разбить на подзадачи, определить их приоритеты, взаимное влияние результатов, отсюда последовательность выполнения. Опять же, чем меньше задача, тем проще прикинуть время на ее выполнение. При качественной декомпозиции не очень трудно спланировать весь проект, и даже распараллелить при возможности (иногда у тебя будет на кого распараллелить). Хорошо, если задачи в результате декомпозиции укладываются в полчаса-час так они отлично ложатся на практики управления временем, вроде помодоро. Неплохо, если задачи глобального плана хотя бы не больше одного рабочего дня, тогда имеет смысл проводить дополнительную декомпозицию каждое утро и планирование конкретного дня. Если работать размеренно получается удобно и довольно производительно. Но тебе не всегда дадут. Будут авралы, и "тушения пожаров", и резкие смены приоритетов Борись, иногда получится сделать правильно. Но в свои сроки закладывай коэффициент 1,5 на форс-мажоры, их будет навалом.


Документируй свою работу. Я знаю, у вас это не принято. И у нас до сих пор не принято. Но все же, хотя бы для себя очень хорошо при ведении проекта заполнять пусть в произвольной форме текстовый файл, куда записывать все особенности работы, например: была подключена сторонняя библиотека зачем, где ее взять, как откомпилировать и подключить, как использовать. При установке драйвера возникли проблемы чего не хватало, где взять, как установить, как запустить, особенности совместимости версий железа, драйвера и прочего софта. Крайне полезно, опять же, как при передаче работы другому, так и при перезапуске работы через какое-то время. Иногда приходится поднимать очень старые проекты, например, пришел на ремонт прибор, выпущенный 10 лет назад, а средства отладки заморожены как раз эти лет 10, под виндой десяткой это уже на запустится, а ПК с вин 98 не найти, и виртуалка не поможет из-за прямой работы с портами, не все порты можно пробросить. Придется быстро переписывать под то, что есть, а как, если никто не помнит подробностей? Ты себе даже не представляешь, как такой документик тебя выручит...


Выбирай инструменты под задачу. Если можно выбирать (редактор, IDE, утилиты, компиляторы и т. д.), следует подойти к выбору ответственно. А тебе выбирать придется, тебе никто не принесет готовых рецептов и не сделает принудительный выбор. Любой одноразовый отладочный проект может вырасти во что-то нужное и полезное, стать базой для серьезной работы. Соответственно, делать работу с использованием инструментов пиратских может быть не просто аморально, но и небезопасно с точки зрения закона (некоторые фирмы отслеживают появление результатов работ, сделанных с использованием их инструментов в открытой печати и проверяют, является ли автор работы зарегистрированным пользователем). Хорошо известные инструменты с бесплатной версией, например, Qt, могут привести к проблемам с лицензированием а сейчас в ТЗ стали появляться требования соблюдения лицензионной чистоты программ и требования к сертификации. Так что старайся, чтобы тебе было удобно, но не шали.


Не относись к инструментам программирования слишком субъективно. Впрочем, у тебя с этим проблем и не было, но убеди в этом и коллег. Нельзя говорить "Дельфи фуфло", просто потому, что твоим первым языком был С++, и все "гуру" уверяли, что он лучший. У любого используемого инструмента есть преимущества, недостатки и область применения вполне объективные параметры. Это не статусная вещь, типа часов "Электроника" или "Роллекс".
Опять же, инструмент надо выбирать под задачу: для работы с железом, с драйверами бери что-то компилируемое, например, плюсы, для работы по сети что-то с отлаженными библиотеками для этого, например, java, для математического моделировния матлаб или python с соответствующими библиотеками. Впрочем, матлаб не бери замучаешься добиваться, чтобы тебе дали лицензионный, а пиратить не стоит, я уже говорил.
Выбирая интерпретируемый язык, помни, что придется скорее всего брать на себя все хлопоты, связанные с версией интерпретатора на машинах пользователей. Потому что если не заработает виноват будет разработчик. Так что на java или python пиши для себя, а то, что пойдет на чужие рабочие станции Lazarus, если быстренько, или плюсы, если всё всерьез. А тот диск с Delphi 6, который ты купил на Вайнера возле ЦУМа нет, это не лицензия, хотя в уважаемом магазине так сказали. Ты позже узнаешь, сколько стоит лицензия. А того магазина давно нет. Но пока делай на Delphi, у тебя все равно пока нет выбора.
Использовать турбопаскаль 7.0 под DOS для преобразования бинарного файла данных в текст чисто из принципиальных соображений даже не смешно, это диагноз, но ты столкнешься с таким году в 2007. И тебе придется это переписывать...


Умей работать с железом. Хорошо, что тебе это даже нравится, но у тебя будут коллеги с девизом "я только программист!" Программист, который работает с оборудованием, пишет код для встроенных систем, или пусть для ПК, но для его взаимодействия с каким-то железом, не может себе позволит роскоши сказать "я хороший программист, а железо меня не интересует". Не будет хорошего программиста. Надо знать язык коллеги-схемотехника, чтобы с ним общаться. Надо иногда участвовать в анализе схемы и поиске недостатков или ошибок. Невозможно написать нормальную программу настройки железа, не понимая, как это железо работает.


Архитектура. Понятие сложное, толком не определенное. В твое время оно еще особо не звучит. Однако "всего лишь неделя отладки может сэкономить целый час обдумывания". Есть проверенные временем практики программирования, выраженные в принципах типа SOLID и паттернах проектирования. Вызубривать наизусть это все нет смысла, но прочитать необходимо, что-то отложится. Одно из самых важных правил оставляй возможности для расширения. Чтобы при добавлении возможностей программу не пришлось переписывать заново. Это тебе пригодится не раз. Поэтому штудируй про интерфейсы (в смысле абстрактные классы), слабую связность (или зацепление?) и всё такое. Обнадежу, что получится у тебя неплохо твой первый более-менее серьезный проект будут дорабатывать без тебя даже не задавая вопросов, потому что расширяемость заложена нормально.


Делай то, что надо прямо сейчас. В смысле, не надо вводить функции, которые кажутся полезными, но не нужны вотпрямщаз, пока не сделано то, без чего работать не будет. Не надо заниматься оптимизацией того, что еще не работает. Для всего этого будет время позже, а если не будет значит, можно и обойтись. Расширяемость предусматривать надо, просто не надо сразу же расширять. Если видно, что какая-то функция понадобится, не делай ее сразу, а строй программу так, чтобы ее введение позже не сломало всё.


Умей представить результаты своей работы. Полезно на митапах (которых у тебя не будет), на конференциях (я уже говорил тебе еще выступать!), на защите выполненной работы (на НТС), на защите на категорию/грейд при повышении, при общении с заказчиком, при докладе начальству. Что важно:


  • изложить языком, понятным неспециалисту. Брать пример с рекламы не как сделано и почему так лучше, а показать положительные стороны результата и создать отличное впечатление о нем. Информацию о деталях реализации и подробности спросят, если надо.
  • выделить главное, также понятное неспециалисту: божественно реализованный вариант сортировки пузырьком под капотом продукта никого особенно не заинтересует, а экономия времени вдвое при выполнении технологической операции с использованием представленного продукта это действительно важно.
  • иметь количественную оценку достижений. Не "стало быстрее", а "запускалось 15 секунд, а теперь 2,5".
  • иметь планы рассказа как сжато, тезисно, так и развернуто по пунктам при необходимости. При этом надо знать, сколько времени у тебя занимает доклад, напечатанный, скажем, 14 шрифтом на одном листе, чтобы иметь возможность оценить время любого своего доклада и скорректировать при необходимости. После второго-третьего доклада запомнишь этот параметр, минуты три у тебя получается. Не части, помедленнее надо.
  • иметь визуальные образцы работы презентация, макет. Макет это очень здорово, но обычно дорого, и на это не любят выделять деньги. Презентация должна быть с приличной инфографикой те самые количественные оценки, о которых выше. Традиционно принятые у вас (ну да, у нас) схемы принципиальные электрические и экономические таблицы на 50 строк и 40 столбцов на слайде чушь. Должно быть фото, простой рисунок, диаграмма из 5-7 элементов, график из 3-10 точек, таблицы 3х4, тезисы по 1-5 предложений. Хорошо заходят анимированные картинки (особенно графики) и коротенькие зацикленные видосики с процессом эксперимента. Но не всегда получится заснять. Презентация это не телетекст, с которого читает диктор. Это иллюстрация и легкая подсказка, чтобы не сбиться с порядка изложения. Впрочем, на эту тему есть отдельные подборки рекомендаций, с ними хорошо бы ознакомиться. Существенная часть презентаций на конференциях нашего уровня ужасны, даже (особенно?) если они делаются уважаемыми специалистами в своей области. Например, это тупо вордовские листы с вставленными картинкой маткадовскими формулами без комментариев.
  • уметь акцентировать внимание на собственных достижениях в проделанной работе и намекнуть (тонко!) на свой профессиональный рост.
  • высший пилотаж при защите оставить недосказанным и напроситься на вопрос по такой теме, о которой можешь наилучшим образом рассказать.
  • нужно уметь ответить на вопросы, на которые нет ответа. Грамотно обосновать принципиальное отсутствие ответа, переадресовать вопрос специалисту в смежной области (желательно коллеге, обязательно чтоб он был рядом и в курсе, что его могут привлечь содокладчиком), иметь заготовки универсальных ответов, как вариант сообщить, что заданный вопрос как раз сейчас прорабатывается, потому что мы о нем знаем, но ответ еще не нашли, ищем. Важно не оставить впечатления, что владеешь вопросом поверхностно, строго в границах доклада и ни на сантиметр шире. Очень плохо звучит ответ, что вопрос не по теме, и я, мол, имею право этого не знать, даже если это чистая правда.

Общайся, помогай новичкам и коллегам в решении проблем. Всегда есть тема, в которой ты разбираешься хорошо, и есть человек, который разбирается хуже и хочет, чтобы ему помогли поднять уровень. Помогая другому, начинаешь разбираться еще лучше: во-первых, вербальное изложение, формулирование знаний позволяет их лучше упорядочить, систематизировать. Во-вторых, новичок поможет взглянуть на некоторые знакомые вопросы под новым углом. В третьих, даже в знакомых темах могут быть темные уголки, о которых ты и не знал, а новичок спросит и покажет.
Метод резиновой уточки еще лучше работает с коллегой. Если что-то не получается очень хорошо спросить совета у кого угодно, даже у резиновой уточки. При этом важно очень детально и грамотно изложить вопрос. При этом в процессе нередко проявляется ответ. Соответственно, коллега может в вопросе и не разбираться, особенно если это резиновая уточка, тем детальнее и грамотнее придется излагать, тем лучше сам поймешь, что пока скрыто. Ну, тут тонкость есть резиновая уточка всегда выслушает, а терпеливого коллегу еще найти надо Иногда и сам побудь уточкой, тоже полезно.
Ну, и не стесняйся обращаться с вопросами, боясь показаться чайником. У каждого есть пробелы в знаниях, это не стыдно. Между прочим, человек, который обратился за помощью, чаще вызывает симпатию, чем пренебрежение приятно ведь почувствовать, что ты такой умный, что у тебя учатся, часть этих положительных эмоций касается и ученика это вообще иногда используется манипуляторами. Так что спрашивать можно и нужно, только не кого попало.


Предметной областью не брезговать, разбирайся. Грубо говоря, если пишется бухгалтерский софт, а ты не знаешь, что такое дебет-кредит и проводки тебе тут делать нечего. Надо знать язык конечного пользователя. Разрабатывая софт для авионики, мало знать в общих чертах схемотехнику приборов авионики, надо примерно понимать и принципы захода самолета на посадку и кто обжал шасси по команде "шасси обжато". Читай не только Шилдта и Александреску, листай и "Справочник летчика и штурмана", а то и "Взаимодействие пути и подвижного состава".


Составляй и используй чеклисты. При любой более-менее однотипной работе имеет смысл выделить основные пункты, которые непременно должны быть выполнены. Нечто вроде инструкции по настройке. Грамотно и кратко сформулированные в письменном виде, такие пункты позволят не забыть и не пропустить что-то достаточно важное: выполнил отметил. Сюда же можно отнести и TODO-листы список того, что надо сделать в случае нетиповой работы. Между прочим, есть работа, которая сейчас у вас передается от "наставника" к новичку из рук в руки месяца два-три. С твоим чеклистом она будет передаваться очень просто "делай по списку и отмечай", за пару дней.


Ну и напоследок, еще несколько моментов:


Есть два подхода к незаменимости:
1) все дела запутаны, документации не ведется, исполнитель держит все в голове, что приходится записывать шифруется. Быстро передать кому-то его дела невозможно. Впрочем, невозможно и медленно, потому что он сопротивляется.
2) специалист высокого уровня, на которого можно положиться, со сложившейся репутацией, как у коллег, так и у смежников и заказчиков. Дела в порядке, все понятно, прозрачно и документировано.
К сожалению, не могу сказать, что незаменимость первого рода использовать однозначно нельзя. Ты сам знаешь живые примеры, когда такие люди ценятся руководством выше остальных, потому что очевидно без них все сыпется, а с ними все крутится. Правда, в организации, где такой подход в порядке вещей, не очень-то считают человеческие и временные ресурсы, а значит, если захотят избавиться от такого незаменимого, то все проекты, которые без него рухнут, тупо начнут заново. А незаменимость второго рода кроме прочего позволяет без особенного ущерба сменить место работы при необходимости, потому что репутация тоже ценность и ресурс. Впрочем, стать незаменимым первого рода у тебя все равно не получится.


Кстати, репутация ресурс очень важный. Очень долго нарабатывается. Теряется в один момент. Например, если все знают, что ты никогда не врешь тебе верят, соврешь один раз больше верить не будут, и это даже хуже, чем если бы раньше не было репутации кристально честного, потому что такой редкий случай запомнят надолго. Так что репутация это дополнительная ответственность, вроде печати самоконтроля у настройщика, которого не проверяет ОТК. С одной стороны, для поддержания репутации надо прилагать определенные усилия и следить за собой тщательно, не допускать работы "на отвали", но с другой некоторые вопросы становится проще решать: твои документы проверяют не так тщательно и подписывают проще (или сразу), меньше стоят над душой, больше доверяют твоим оценкам. При выборе между интересной сложной или рутинной однотипной работой тебе вероятнее предложат сложную, если к другим исполнителям меньше доверия. На что следует обратить внимание в плане репутации:


  • Не врать.
  • Быть пунктуальным, не опаздывать, но и не приходить на полчаса раньше.
  • Не срывать обещанные сроки. Насчет установленных свыше пытайся предупредить об их нереальности. Это никому не нравится, но хотя бы так.
  • Составлять документы грамотно и технически, и в литературном смысле, без орфографических и пунктуационных ошибок, стараться и без стилистических. Доверие к человеку, который не может двух слов связать, ниже, чем к грамотному. Не раз в этом убедишься на своем опыте. Не стесняйся обращаться к Розенталю и Лопатину. Особенно при спорах с коллегами, которые уверяют, что "одеть" это длинное, как чулок, а "надеть" это короткое, как шапка, поэтому оплетку на провод одевают, а заглушку на разъем надевают.
  • То же относится и к рабочей полуофициальной переписке, тоже проверено.
  • Не рассказывать кому попало полученную информацию. "Фильтровать базар".
  • Взятое на время у коллег (документы, оборудование) возвращать немедленно после использования. Никогда не забывать, что у кого взято. Никогда не задерживать у себя дольше оговоренного срока, если он был установлен. Благодаря этому тебе будут доверять забирать с собой на время то, что другим не дают совсем, не раз пригодится.
  • Не допускать таких промахов, которые явно показывают на работу спустя рукава. Для этого не работай спустя рукава, а от глупых случайных ошибок хорошо помогают чеклисты и TODO.

Внешний вид. Не зря придумана пословица "по одежке встречают, по уму провожают". В тех случаях, когда есть время и возможности показать ум, можно к одежке отнестись проще. Однако на более-менее серьезных встречах, например, с заказчиком, или при сборе подписей под документом оценивать будут порой только по одежке и принимать решения соответственно. Ты еще не раз убедишься: заходишь в кабинет в костюме и при галстуке получаешь автограф чаще всего сразу. Заходишь в потертых джинсах и футболке в лучшем случае "оставь, почитаю", в худшем "отнеси в комнату N, пусть сначала подпишет Такой-то", а это уже надолго. Срабатывает какая-то клановость раз внешние признаки примерно совпадают, то, наверное, это "наш". Опять же, выбор "нормального" (или, если хотите, нормированного) внешнего вида соответственно представлениям тех, в чьем хорошем мнении ты заинтересован это еще и показатель серьезного подхода, видно, что ты подготовился. Это не призыв всегда ходить в галстуке. Это намек, что имеет смысл выбирать "прикид" под обстоятельства: если предстоит долгая работа за клавиатурой или стендом, то стоит одеться поудобнее, а если серьезный разговор то попредставительнее. Все-таки нормальные люди не ходят в оперу в энцефалитке, а в тайгу в лакированых туфлях. Ты это поймешь, я знаю. Но ни одного товарища-неформала убедить в этом не удастся. Ну и ладно.


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


И не забывай отдыхать так, чтобы было о чем вспомнить и рассказать. Саяны это прекрасно, но упущенный Эльбрус ты себе еще долго не забудешь. Отпуск не для дивана!


На этом буду заканчивать, и так слишком много написал. Еще решишь, что станешь занудой. За будущее особенно не переживай, у тебя получится почти все, что хотел. Но и не расслабляйся оно получится не само собой.


Постараюсь отправить тебе это письмо при первой же оказии. Надеюсь на тебя. Пока,


Твой я (двадцать с лишним лет спустя).

Подробнее..

Какие ошибки совершает аналитик в первые полгода работы и как их избежать

19.05.2021 14:18:09 | Автор: admin

Хайди хо, Кайл!

Меня зовут Диана и я бизнес-аналитик в компании Surf. В прошлом году я закончила бакалавриат факультета компьютерных наук в ВГУ: это дало мне базовые теоретические знания. Однако теория мало применима без практики: теперь набиваю шишки в настоящих проектах.

Я пришла к вам для того, чтобы поделиться опытом, который получила на своём первом боевом проекте. Мы делали банковское мобильное приложение со сложной архитектурой и кучей фич.

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

Пристёгивайтесь покрепче: мы начинаем увлекательное путешествие по миру ошибок начинающего аналитика (все трюки были выполнены профессиональными каскадёрами, не повторять в домашних условиях).

Не бойтесь задавать больше вопросов и просить уточнений

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

Лучше задать больше вопросов, чем что-то упустить. Например, когда работаешь над проектом, важно уточнить:

  • На чьей стороне будет реализована логика: фронта, middleware, бэка?

  • Как определять нужное состояние элемента? Как и где получать и обрабатывать нужные параметры?

  • Примерный макет дизайна, потому что он наглядно показывает, что именно должно быть реализовано, проще воспринимать требования.

  • Касаются ли вашей стороны эти требования или от вас никаких доработок и не потребуется?

Перед тем, как передать информацию разработчикам, нужно убедиться, что вы с клиентом поняли друг друга: обсудили все ключевые моменты и разобрались, что клиент хочет получить на выходе.

Проверяйте и перепроверяйте выполнение договорённостей

Когда в процессе проработки фичи участвует большое количество человек, это как минимум значит, что сторонам будет непросто договориться. А ещё это значит, что сложно будет уследить за всеми требованиями и договорённостями.

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

Обычно мы обсуждаем задачи в переписке или на онлайн-митингах. Нетрудно понять, что на созвоне в 20 человек легко пропустить какое-то поручение. Поэтому я записываю основную информацию, которую обсудили во время созвона. После дублирую требования в печатном виде и прошу подтверждения у коллег, чтобы убедиться, что ничего не упустила. Кроме того зафиксированные в письменном виде договорённости гарантируют, что заказчик не сможет при желании переобуться и поменять требования.

Затем я слежу за выполнением этих поручений: периодически (в зависимости от того, насколько горит фича) уточняю у исполнителей статус готовности и пинаю их по необходимости.

Не стесняйтесь быть настойчивым и даже назойливым, иногда вы и проджект-менеджер единственные, кто может повлиять на то, что договорённости будут выполнены в срок. Если видите, что ответов нет в оговоренное время, не стесняйтесь пинговать коллег. Иначе ожидание может сильно затянуться.

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

Пример из жизни

Мы разрабатывали фичу, которая при выполнении определённого условия отображала кнопку на главном экране. Когда обсуждали реализацию, решили, что условие будет проверяться на бэке, а фронт будет получать поле с признаком выполнения или невыполнения этого условия.

Я не акцентировала внимание бэкендеров и продакт оунера на том, насколько важно, чтобы бэк присылал нам этот признак. Когда фича должна была уже уйти в разработку, этого признака всё ещё не было и в помине, потому что ни бэк, ни сторонний сервис, к API которого мы обращались, не разработали его.

Из-за этого процесс задержался ещё на неделю, потому что пришлось потратить много времени на повторное обсуждение. В итоге решили кнопку отображать всегда:)

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

Уточняйте, как сделать проще

Бывает, что бизнес-аналитику реализация фичи кажется удобной. Он предлагает её разработчику, а в ответ получает: Чё-то сложно, давай по-другому?. Это нормально: взгляды аналитика и разработчика на реализацию фичи могут разительно отличаться: разработчик понимает, что ему хотят втюхать что-то сложное и заморочное, и идёт в отказ.

Если бизнес-аналитику не хватает опыта, чтобы оценить, насколько сложен вариант реализации, лучше сразу прийти к разработчикам и посоветоваться с ними. Иначе потом придется проходить новый круг ада: обсуждать изменения. Кроме того, это может сдвинуть сроки реализации: не нужно объяснять, почему это плохо:)

Френдли ремайндер

Если встаёт вопрос, на чьей стороне должна быть реализована сложная логика, связанная со сравнениями, вычислениями, сортировкой и так далее, практически всегда логичнее вынести её на бэк. Запомните мой совет и повторяйте его как мантру на всех созвонах (и перед сном).

Будьте внимательным к потенциально проблемным требованиям

Если на этапе верхнеуровневой аналитики чуйка шепчет вам, что требования могут перерасти из маленькой задачи на день в большую и неповоротливую фичу не игнорируйте эти сигналы и не спускайте всё на тормозах, мол, прорвёмся. Обычно я составляю большой список вопросов к заказчику и к бэку по требованиям, где прописываю, правильно ли я поняла формулировку.

Уточните (если нужно, несколько раз), правильно ли вы поняли, что ваша задача просто добавить картинку котика на экран. Может оказаться, что добавить нужно обязательно чеширского кота, а ещё он должен улыбаться в момент, когда вы моргаете. Я специально привела утрированный пример.

А вот пример из жизни. Недавно мы параллельно вели две фичи от разных продакт-оунеров. Фичи были частично взаимосвязаны, но требования во многих местах противоречили друг другу. Каждый продакт видел UI по-своему: договориться было достаточно трудно. Тогда пришлось столкнуть их лбами. После этому мы наконец пришли к варианту, устраивающему всех.

Важно быть начеку и проверять, не противоречат ли новые требования уже реализованной функциональности.

Помните, что есть много требований, которые могут быть не видны не вооруженным опытом взглядом под толщей воды из документа с требованиями. Хорошая новость: чем опытнее становится бизнес-аналитик, тем больше потенциально проблемных мест он видит и тем тщательнее терзает заказчика вопросами и уточнениями. Поэтому сделайте глубокий вдох и наберитесь терпения! Дальше лучше.

Как определить, что перед вами задача-оборотень, которая может превратиться из человечной в дикую? По количеству непоняток. Берегитесь, если:

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

  • Не очевидна инициализация флоу и переход между экранами.

  • Нет четкого понимания логики.

Например, несколько месяцев назад мы начали обсуждение фичи без определённых требований. У продакт-оунера не было четкого понимания, что должно получиться в итоге. Это стоило нам многих часов созвонов-обсуждений и несколько раз перекроенного ТЗ.

Это работает и в обратную сторону. Иногда задача описана настолько запутанно, что кажется, будто на разработку потребуется достаточно много времени. Однако, если выяснить подробности, может оказаться, что с вашей стороны доработок вообще не нужно, и требования относятся совсем не к вам. Это происходит из-за того, что заказчик сам не до конца понимает процесс разработки.

Пример

Прилетают требования: нужно определять значение поля по параметрам, которые будут приходить с сервера. Значение поля должно отображаться в интерфейсе.

Когда начинаем обсуждать задачу, выясняется, что параметры будут приходить прослойке middleware, определение значения нас не касается и отображение поля в интерфейсе остается прежним.

Чтобы избежать таких непоняток, старайтесь как можно подробнее выяснить флоу и влияние данной задачи конкретно на вас.

_______

Я описала только малую часть ошибок, с которой может столкнуться начинающий бизнес-аналитик. Многие ошибки вам ещё предстоит совершить самим в любом случае. Однако я постаралась поподробнее описать процессы взаимодействия и общения в реальном проекте. Надеюсь, это поможет вам легче влиться в проект.

Вот и всё, мои маленькие хоббиты. Я поделилась с вами своей мудростью, теперь вы сами по себе. Не дрейфте, не теряйтесь, будьте настойчивы и внимательны. В добрый путь!

Подробнее..

Перевод Антипаттерны деплоя в Kubernetes. Часть 2

04.06.2021 12:23:32 | Автор: admin

Перед вами вторая часть руководства по антипаттернам деплоя в Kubernetes. Советуем также ознакомиться с первой частью.

Список антипаттернов, которые мы рассмотрим:

  1. Использование образов с тегом latest

  2. Сохранение конфигурации внутри образов

  3. Использование приложением компонентов Kubernetes без необходимости

  4. Использование для деплоя приложений инструментов для развёртывания инфраструктуры

  5. Изменение конфигурации вручную

  6. Использование кubectl в качестве инструмента отладки

  7. Непонимание сетевых концепций Kubernetes

  8. Использование неизменяемых тестовых окружений вместо динамических сред

  9. Смешивание кластеров Production и Non-Production

  10. Развёртывание приложений без Limits

  11. Неправильное использование Health Probes

  12. Не используете Helm

  13. Не собираете метрики приложений, позволяющие оценить их работу

  14. Отсутствие единого подхода к хранению конфиденциальных данных

  15. Попытка перенести все ваши приложения в Kubernetes

6. Использование кubectl в качестве инструмента отладки

Утилита kubectl незаменима при работе с кластерами Kubernetes. Но не стоит использовать её как единственный отладочный инструмент.

При возникновении проблем, особенно в production кластере, вашим первым импульсом не должен быть запуск kubectl. Если вы поступаете именно так, то вы уже проиграли битву, особенно если сейчас 3 часа ночи, сервисы не работают, и вы на связи.

kubectl get nskubectl get pods -n saleskubectl describe pod prod-app-1233445 -n saleskubectl get svc - n saleskubectl describe...

Вместо этого все ваши кластеры Kubernetes должны иметь надлежащие системы мониторинга, трассировки и сбора логов, которые можно использовать для своевременного выявления проблем. Если вам нужно запустить kubectl для проверки чего-либо, это означает, что вы не учли это, настраивая вашу систему мониторинга.

Сложно переоценить ценность метрик и трассировок, мы расскажем о них отдельно в одном из следующих антипаттернов.

Даже если вы просто хотите проверить конфигурацию кластера, вы также можете использовать для этой цели специальный инструмент. Сегодня существует множество решений для работы с кластерами Kubernetes.

Например, обратите внимание на Kubevious, это универсальная панель управления Kubernetes, которая позволяет вам искать и отображать ресурсы Kubernetes в соответствии с настраиваемыми правилами.

7. Непонимание сетевых концепций Kubernetes

Прошли те времена, когда единственный балансировщик нагрузки был всем, что необходимо для настройки подключения к вашему приложению. Kubernetes представляет свою собственную сетевую модель, и вам нужно разобраться с её основными концепциями. По крайней мере, вы должны быть знакомы с типами сервисов - Load Balancer, Cluster IP, Node Port и понимать, чем сервисы отличаются от Ingress.

Сервисы типа Сluster IP используются внутри кластера, Node Port также могут использоваться внутри кластера, но при этом доступны снаружи, а балансировщики нагрузки могут принимать только входящий трафик.

Но это ещё не всё потребуется разобраться, как в кластере Kubernetes работает DNS. И не забывать, что весь трафик между служебными компонентами шифруется и нужно контролировать срок действия сертификатов.

Будет полезно разобраться, что такое Service Mesh и какие проблемы она решает. Необязательно разворачивать Service Mesh в каждом кластере Kubernetes. Но желательно понимать, как она работает и зачем вам это нужно.

Вы можете возразить, что разработчику не нужно знать множество сетевых концепций для развертывания приложения, и вы будете правы. Нам нужна абстракция для разработчиков поверх Kubernetes, но у нас ее пока нет.

Как разработчик, вы должны знать, как трафик достигает вашего приложения. Если запрос должен выполнить 5 хопов между подами, узлами и службами, при этом каждый хоп имеет потенциальную задержку 100 мс, то ваши пользователи могут столкнуться с задержкой в 500 мс при посещении веб-страницы. Вы должны знать об этом, чтобы ваши усилия по оптимизации времени отклика были сосредоточены на устранении узких мест.

8. Использование неизменяемых тестовых окружений вместо динамических сред

Когда вы используете виртуальные машины или физические сервера, то командам разработчиков программного обеспечения обычно предоставляется несколько тестовых сред, которые используются для проверки приложения, прежде чем оно попадет в production.

Один из наиболее распространенных подходов наличие как минимум трех сред (QA / Staging / Production), в зависимости от размера компании их может быть больше. Наиболее важной из них является интеграционная, которая содержит результат слияния всех обновлений с основной веткой.

Когда вы используете неизменяемые тестовые среды, вы платите за них, даже если они не используются. Но наиболее серьёзной проблемой является изоляция обновлений для последующего тестирования.

Если вы используете единое окружение для интеграции, когда несколько разработчиков выполняют слияние результатов работы и что-то ломается, не сразу становится понятно, какая из функций вызвала проблему. Если 3 разработчика объединяют свои функции в промежуточной среде и развертывание завершается неудачно (либо сборка завершается неудачно, либо тесты интеграции терпят неудачу, либо показатели взрываются...), тогда существует несколько сценариев:

  1. Обновление A содержит ошибки, B и C в порядке

  2. Обновление B содержит ошибки, A и C в порядке

  3. Обновление C содержит ошибки, B и A в порядке

  4. Каждое обновление в отдельности работает, но при работе вместе с обновлениями A и B возникает ошибка

  5. Каждое обновление в отдельности работает, но при работе вместе с обновлениями A и C возникает ошибка

  6. Каждое обновление в отдельности работает, но при работе вместе с обновлениями B и C возникает ошибка

  7. Каждое обновление в отдельности работает, но все 3 обновления вместе не работают

В результате, если после обновления возникли проблемы в работе сервиса, будет непросто понять, какое из них стало причиной возникновения проблемы.

Способы избежать подобных проблем:

  1. "Резервирование" промежуточного (stage) окружения разработчиками, чтобы они имели возможность тестировать свои обновления изолированно.

  2. Компания создает несколько staging сред, которые разработчики используют для тестирования своих обновлений (поскольку единственное staging окружение может быстро стать узким местом).

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

Кроме того, несколько промежуточных (staging) сред могут страдать от проблемы дрейфа конфигурации, когда среды должны быть одинаковыми, но после нескольких изменений это уже не так.

Решение, конечно же, состоит в том, чтобы отказаться от ручного обслуживания статических сред и перейти к динамическим средам, которые создаются и уничтожаются по запросу. С Kubernetes это очень легко сделать:

Есть много способов реализовать этот сценарий, по крайней мере, каждый запрос Pull Request должен создавать динамическую среду, содержащую только этот запрос Pull Request и ничего больше. Среда автоматически уничтожается, когда Pull Request объединяется / закрывается или по прошествии определенного времени.

Преимущество динамических сред это полная свобода разработчиков. Если я разработчик и только что закончил работу с обновлением A, а мой коллега завершил работу над обновлением B, я должен иметь возможность:

git checkout mastergit checkout -b feature-a-b-togethergit merge feature-agit merge feature-bgit push origin feature-a-b-together

Как по волшебству, будет создана динамическая среда:feature-a-b-together.staging.company.comилиstaging.company.com/feature-a-b-together.

Для создания динамических сред вы можете использовать, например, пространства имен Kubernetes.

Обратите внимание, что это нормально, если у вашей компании есть постоянные staging среды для специализированных нужд, таких как нагрузочное тестирование, тестирование на проникновения, развертывание A / B и т. д. Но для базового сценария Я разработчик и хочу, чтобы моё обновление работало изолированно и запускались интеграционные тесты динамические среды лучшее решение.

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

9. Смешивание кластеров Production и Non-Production

Несмотря на то, что Kubernetes специально разработан для оркестрирования кластеров, вы не должны создавать единый кластер для всех ваших окружений. Как минимум у вас должно быть два кластера: производственный и непроизводственный.

Прежде всего, смешивание Production и Non-Production кластеров может привести к нехватке ресурсов.

Так как приложение, работающее некорректно, может утилизировать слишком много ресурсов.

Для разработчиков самая большая проблема связана с безопасностью. Если вы не предпринимаете дополнительных шагов по настройке Kubernetes, то вопреки распространенному мнению, под из одного пространства имен может свободно взаимодействовать с подом из другого пространства имен. Также есть некоторые ресурсы Kubernetes, которые вообще не имеют пространства имен.

Пространства имен Kubernetes не являются мерой безопасности. Если ваша команда обладает глубокими знаниями Kubernetes, то действительно можно поддерживать мультитенантность внутри кластера и защищать все рабочие нагрузки друг от друга. Но это требует значительных усилий, и в большинстве случаев гораздо проще создать второй кластер исключительно для production.

Если вы объедините этот антипаттерн со вторым (сохранение конфигурации внутри образов), должно стать очевидно, что может произойти множество негативных сценариев, например:

  1. Разработчик создает новое пространство имен, используемое для тестирования и production.

  2. Далее развертывается приложение и запускаются интеграционные тесты.

  3. Интеграционные тесты записывают фиктивные данные или очищают БД.

  4. К сожалению, в контейнерах были рабочие URL-адреса и конфигурация внутри них, и, таким образом, все интеграционные тесты фактически повлияли на работу production!

Чтобы не попасть в эту ловушку, гораздо проще просто создать Production и Non-Production кластера. К сожалению, многие руководства описывают сценарий при котором, пространства имен можно использовать для разделения сред, и даже в официальной документации Kubernetes есть примеры с пространствами имен prod / dev.

Обратите внимание, что в зависимости от размера вашей компании у вас может быть больше кластеров, чем два, например:

  1. Production

  2. Pre Production (Shadow) клон production, но с меньшими ресурсами

  3. Development кластер, который мы уже обсуждали выше

  4. Специализированный кластер для нагрузочного тестирования / тестирования безопасности

  5. И даже отдельный кластер для служебных инструментов

10. Развёртывание приложений без Limits

По умолчанию приложение, развернутое в Kubernetes, не имеет ограничений на использование ресурсов. Это означает, что ваше приложение потенциально может мешать работе всего кластера, поскольку утечка памяти или высокая загрузка ЦП нанесут ущерб остальным приложениям, работающим в кластере.

Это означает, что все ваши приложения (независимо от окружения) должны иметь ограничения на использование ресурсов.

К сожалению, просто взглянуть на среднюю загрузку памяти и ЦП приложением недостаточно. Вам необходимо изучить свое приложение и отследить всплески трафика и нагрузки, а также понять, как оно ведёт себя в этих условиях. Вы же не хотите, чтобы ваше приложение перезапускалось без причины.

Одно из преимуществ Kubernetes эластичность ресурсов. Если кластер убивает / перезапускает ваше приложение, когда оно начинает обрабатывать значительную нагрузку (например, ваш интернет-магазин испытывает всплеск трафика), вы не используете все преимущества Kubenetes. Вы можете решить эту проблему с использованием vertical pod auto-scaler (VPA).

Подробнее..

Перевод Откровения пьяного старшего инженера

01.06.2021 02:22:59 | Автор: admin
image

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

  • Лучший способ достичь карьерного роста сменить компанию.
  • Стек технологий на самом деле не имеет значения, потому что в моей области есть примерно 15 базовых шаблонов разработки программного обеспечения. Я работаю с данными, поэтому они не будут такими же, как веб-разработка или embedded. Но все области имеют около 10-20 основных принципов, и технический стек просто пытается упростить эти вещи, так что не переживайте.
  • Есть причина, по которой люди рекомендуют искать работу. Если я недоволен работой, наверное, пора уходить.
  • У меня появилось несколько хороших друзей на всю жизнь в компаниях, с которыми я работал. Мне не нужно это от каждого места, где я работаю. Я был совершенно счастлив, работая в тех местах, где у меня не складывались дружеские отношения с моими коллегами, и я был несчастен в местах, где у меня было несколько хороших друзей.
  • Я научился быть честным со своим менеджером. Не слишком честным, но достаточно честным, чтобы быть искренним на работе. Что может быть хуже? Он меня уволил? Я просто найду новую работу через 2 недели.
  • Если я просыпаюсь в 2 часа ночи из-за того, потому что нужно постоянно быть на связи чаще одного раза в квартал, значит, что-то серьезно не так, и я либо исправлю это, либо уйду.
  • налейте еще один стакан
  • Хороший менеджер обладает многими качествами хорошего инженера.
  • Когда я только начинал, я был очарован технологиями, программированием и computer science. С меня хватит.
  • Хороший код это код, который может понять младший инженер. Отличный код может понять новичок первого курса computer science. Лучший код это его отсутствие.
  • Самый недооцененный навык, которому нужно научиться инженеру, это документирование. Бля, кто-нибудь, пожалуйста, научите меня писать хорошую документацию. Серьезно, если есть какие-то рекомендации, я бы заплатил за курс (вероятно, даже много денег, может быть, 1к за курс, если бы это гарантировало, что я смогу писать хорошие доки).
  • В связи с вышесказанным, написание хороших предложений по изменениям отличный навык.
  • Почти каждая священная война (vim против emacs, mac против linux, что угодно) не имеет значения кроме одной. См. ниже.
  • Чем старше я становлюсь, тем больше ценю динамические языки. Бля, я это сказал. Бейте меня.
  • Если я когда-нибудь пойму, что считаю себя самым умным человеком в комнате, пора уходить.
  • Я не знаю, почему веб-разработчикам с полным стеком так плохо платят. Нет, правда, им надо платить полмиллиона в год просто базовый оклад. Черт, они должны понимать и внешний интерфейс, и серверную часть, и как работают разные браузеры, и сети, и базы данных, и кеширование, и различия между веб и мобильными устройствами, и, черт возьми, есть еще одна структура, которую компании хотели бы использовать? Серьезно, почему веб-разработчикам так мало платят?
  • Нам следует нанять больше стажеров, они классные. Эти энергичные мелкие хулиганы со своими идеями. Еще лучше, когда они могут задавать вопросы или критиковать. Я люблю стажеров.
  • Еще глоток
  • Не ведитесь на своих героев. Я заплатил 5к, чтобы пройти курс одного из моих героев. Он гениальный человек, но в конце концов я понял, что он выдумывает, как и все мы.
  • Стек технологий имеет значение. Хорошо, я только что сказал, что технический стек не имеет значения, но выслушайте меня. Думая о разработке Python и C ++, вы думаете о совершенно разных вещах, верно? Это потому, что определенные инструменты действительно хороши для определенных работ. Если вы не уверены, что хотите делать, просто займитесь Java. Это дерьмовый язык программирования, который хорош почти во всем.
  • Самый лучший язык программирования это LISP. Я должен выучить LISP.
  • Для новичков самый прибыльный язык программирования это SQL. К черту все остальные языки. Если вы знаете SQL и ничего больше, вы можете заработать. Специалист по расчету заработной платы? Может, 50к. Специалист по зарплате, знающий SQL 90к. Обычный Джо с организаторскими способностями в большой корпорации? 40 тысяч долларов. Обычный Джо с организационными навыками и SQL? Назовите себя программным менеджером и зарабатывайте 150 тысяч долларов.
  • Тесты важны, но TDD это чертов культ.
  • Хорошо оплачиваемые государственные должности не то, чем они кажутся, по крайней мере, для инженеров в начале и в середине карьеры. Конечно, 120 тысяч долларов + пособия + пенсия это здорово, но вы продадите свою душу, чтобы работать над эзотерическими проприетарными технологиями. Большое уважение к государственным служащим, но серьезно, есть причина, по которой средний возраст инженеров в этих местах составляет 50+. Совет не распространяется на государственных подрядчиков.
  • Сторонние рекрутеры пиявки. Однако, если вы найдете хорошего, развивайте с ним хорошие отношения. Они могут помочь вам в карьере. Как узнать, хороший ли у вас? Если они были сторонними рекрутерами более 3 лет, они, вероятно, плохие. Хорошими рекрутерами обычно становятся крупные компании.
  • Опционы либо бесполезны, либо могут сделать вас миллионером. Они, вероятно, бесполезны, если численность инженеров не превышает 100 человек. Тогда, возможно, они чего-то стоят в течение этого десятилетия.
  • Работа из дома это что-то невероятное. Но отсутствие пинков под зад отстой.
  • Я никогда не работал в FAANG, поэтому не знаю, что я упускаю. Но я нанял (и не нанял) инженеров из FAANG, и они тоже не знают, что делают.
  • Моя ценность не является функцией и не коррелирует с моим полным вознаграждением. Капитализм плохой способ определить ценность.
  • У менеджеров меньше власти, чем вы думаете. Намного меньше. Если вы когда-нибудь задумывались, почему менеджер XYZ не увольняет кого-то, то это потому, что он не может.
  • Должности в основном не имеют значения. Главный выдающийся штатный ведущий инженер любой компании, да кто бы то ни было. Что ты делал и чего добился. Это все, что волнует людей.
  • Кстати о должностях: в начале карьеры смена должности это хорошо. От младшего к среднему. От среднего до старшего. От старшего к ведущему. Позже в вашей карьере смена должности это хорошо. Таким образом, вы можете получить такое же вознаграждение, но затем получить еще и прибавку при повышении по службе. Другими словами, в начале вашей карьеры (<10 лет) повышение в должности это хорошо, потому что это позволяет вам развивать свои навыки и обязанности. Позже смена должности это хорошо, потому что это позволяет вам увеличить зарплату.
  • По максимуму израсходуйте вашу пенсию.
  • Будьте добры ко всем. Не потому, что это поможет вашей карьере (а это поможет), а потому, что доброта сама по себе вознаграждает.
  • Если я ничего не узнал от младшего инженера или стажера за последний месяц, значит, я не обратил на что-то внимание.
  • Ой, у меня закончилось вино.
  • Оплата уроков, книг, конференций того стоит. Я прошел несколько конференций, несколько курсов по 1,5 тыс., купил много книг и подписок. Это стоило того. Так я смогу лучше притвориться, что что-то делаю.
  • Серьезно, почему веб-разработчикам не платят больше? Они все знают !!!
  • Синдром запястного канала и проблемы со спиной не шутка. Потратьте 1к сейчас на хорошее оборудование.
  • Самый умный человек, на которого я когда-либо работал, был доктором математических наук. Я многому научился у этого парня. Надеюсь, у него все хорошо.
  • Однажды, в старшей школе, у меня была хорошая подруга. Я имею в виду, что мы разговаривали, тусовались и делились множеством личных вещей несколько лет. Потом прошел слух, что она мне нравится, или что мы встречаемся, или что-то еще. Она не восприняла это слишком уж хорошо, поэтому начала игнорировать меня. Это было не особо приятно. Думаю, это был бы современный эквивалент гостинга. Я не желаю ей зла и надеюсь, что у нее все хорошо. Мне жаль, что я не справился с ситуацией лучше.
  • В 8-м классе у меня была девушка, с которой я не хотел расставаться, хотя она мне больше не нравилась, поэтому я просто начал ее игнорировать. Это было так хреново. Прости, Лена.
  • Вы знаете, что самое лучшее в работе программиста? Вы можете встретиться и поговорить с людьми, которые думают так же, как вы. Не обязательно у вас будут одинаковые интересы, такие как спорт, телешоу и прочее. Но они думают о проблемах так же, как вы о них думаете. Это круто.
  • В технологиях мало женщин. Какая дурацкая индустрия. Это нужно изменить. Я стараюсь больше воодушевлять и помогать женщинам-инженерам в нашей организации, но не знаю, что еще сделать.
  • То же и с черными инженерами. Что за черт?
  • Я никогда по-настоящему не ненавидел язык или технологию, пока не начал с ними близко знакомиться. Кроме того, я считаю, что технология хороша, если я ее ненавижу, но одновременно рекомендую ее клиенту. К черту Jenkins, но, чувак, я не думаю, что буду заниматься недобросовестным использованием программного обеспечения, рекомендуя его новому клиенту.
  • При этом git ужасен, и у меня есть выбор, кроме как его использовать. Кроме того, инструменты git с графическим интерфейсом могут пойти к черту, дайте мне командную строку в любой день. Есть 7 командных строк, которые нужно запомнить, все остальное можно погуглить.
  • Поскольку я работаю с данными, я собираюсь дать совет, полученный из конкретных данных. К черту pandas.
  • Моя работа проще, потому что в моей команде есть полутехнические аналитики. Полутехнические, потому что они разбираются в программировании, но не в разработке ПО. Это благословение, потому что если что-то не имеет для них смысла, значит, это, вероятно, было плохо спроектировано. Я люблю аналитиков в команде, они помогли мне вырасти гораздо больше, чем самые блестящие инженеры.
  • Темный режим хорош, пока вы не будете вынуждены использовать светлый режим (веб-страница или неподдерживаемое приложение). Поэтому я использую светлый режим.
  • Я достаточно знаю о безопасности, чтобы понимать, что я ни хрена не знаю о безопасности.
  • Блин, у меня закончилось вино.
  • Быть хорошим инженером значит иметь лучшую практику. Быть старшим инженером значит понимать, когда следует прервать лучшую практику.
  • Если люди пытаются возложить вину на ошибку или сбой, пора двигаться дальше.
  • Множество прогрессивных компаний, особенно стартапов, говорят о том, что нужно проявить истинное я. Что, если ваше настоящее я полностью посвящено просмотру порно? Да, соблюдать границы между работой и личной жизнью это здорово.
  • Я люблю выпить с коллегами в счастливые часы. Я предпочитаю проводить время с детьми, семьей или друзьями.
  • Лучшая демонстрация отличного лидерства это когда мой лидер взяла на себя вину из-за ошибки, которая на 100% случилась из-за меня. Поверь, ради нее я бы пошел по огню.
  • Точно так же лучшие лидеры, с которыми мне посчастливилось работать, сделали все возможное, чтобы отстаивать мое мнение, а также объяснять мне другие мнения, которые противоречат моему. Я очень стараюсь быть похожим на них.
  • К черту сайд-проекты. Если вам нравится их делать отлично! Даже если бы у меня было время заниматься сайд-проектами, я был бы чертовски занят написанием пьяных постов на Reddit.
  • Алгоритмы и ограничения данных важны, до определенной степени. Я не вижу в интервью с фармацевтом всяких пустяков по поводу органической химии. Что-то явно не так с интервью в нашей индустрии.
  • Черт побери, эти парни и девчонки разработчики такие умные. По крайней мере, этим хулиганам платят.
  • Неважно заниматься любимым делом. Важнее делать то, что не ненавидишь.
  • Чем ближе я к продукту, чем ближе я к увеличению дохода, тем больше я чувствую, что меня ценят, независимо от того, насколько технической была моя работа. Это является правдой даже для самых прогрессивных компаний.
  • Linux важен даже тогда, когда я работал со всеми Windows. Почему? Потому что в конце концов я работал в Linux. Так счастлив, вспоминая те выходные, когда я напортачил с установкой Arch.
  • Я научился опасаться двусмысленных модных слов, таких как большие данные. Что за большие данные? Я имел дело с потоковой передачей в 10 тысяч строк каждые 10 минут в Spark и Kafka и имел дело с 1 млрд строк, загружаемых ежечасно в Python и MySQL. Эти словечки могут пойти к черту.
  • Не все хорошие рабочие места находятся в Кремниевой долине. Но многие из них.


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

Перевод Откровения трезвого инженера

02.06.2021 18:06:54 | Автор: admin
image


Ответ на: Откровения пьяного старшего инженера

Я выскажу свое мнение и значительно короче, наверное.

  1. Работа в нашей отрасли полностью построена на порочных стимулах.
  2. Лучший способ продвинуться по карьерной лестнице это смена компании. Компании, в которых вы работаете, будут вознаграждать хорошую работу большей работой и ответственностью, а не большим количеством времени и/или денег. Компании, в которые вы переходите, вознаградят вашу предыдущую хорошую работу в других компаниях большими деньгами. На самом деле это не имеет смысла См. Пункт 1.
  3. Каждый раз, когда я меняю работу, я сокращаю свои обязанности на 50% и увеличиваю зарплату на 50%. На моей первой работе я был очень раздражен, когда новые сотрудники, которые были на моем уровне квалификации, зарабатывали больше, чем я. Теперь другие старожилы в моей компании с таким же уровнем квалификации раздражаются, когда я зарабатываю намного больше, чем они (обратите внимание, что количество смен работы >= 3). На самом деле это не имеет смысла См. Пункт 1.
  4. Хороший код прост, надежен и хорошо протестирован. Отличный код это хороший код, только он меньше. Лучший код это отсутствие кода (Best code is no code). К сожалению, большинство компаний не настроены писать лучший код. Во-первых, менеджерам нравится, когда кодеры пишут код (потому что их сотрудники работают). Кодеры любят писать код (потому что иногда им это нравится, а также они чувствуют себя некомфортно, если они не работают). В результате получается много посредственного кода (запутанного, ошибочного и поверхностно протестированного). Посредственный код порождает фонтан ошибок и дополнительных задач, которые заставляют всех быть занятыми и, следовательно, оправданы в их использовании. К сожалению, отличный код и лучший код приводят к тому, что каждый чувствует себя неуверенно и может потерять работу. Можно было подумать, они догадаются, но См. Пункт 1.
  5. У меня нет абсолютно никаких ментальных ресурсов, чтобы работать удаленно по 40 часов в неделю (иногда могу неделю здесь или неделю там). Но если постоянно, каждую неделю, то я могу потратить только несколько часов. Следствие: количество отработанного времени практически не влияет на ваш успех или влияние. Вы могли подумать, что мы переориентируемся сейчас, но См. Пункт 1.
  6. Agile это культ ритуалов, священников и непоколебимых систем убеждений, который превратился в настоящий ад корпоративного управления, против которого авторы оригинального Agile Manifesto пытались восстать 20 лет назад. А если серьезно, вам не нужно быть солдатом Big Agile или Agile-Industrial Complex. Не выставляйте себя дураком, подставляя при этом шею. Мы что, снова застряли в 90-х? Ну да ладно См. Пункт 1.
  7. Никогда не принимайте на работу программиста с дипломом по прикладной математике. Хорошо, ребята, вы меня поняли, это слишком сурово. Но все же будьте осторожны.
  8. Нет такой вещи, как компромисс между работой и личной жизнью Под этим я подразумеваю, что иногда люди думают, что я принимаю работу, которая плохо оплачивается, за ту, которая удобна или не требует особого напряжения. На низкооплачиваемых вакансиях к вам будут относиться как к дерьму и не будет гибкости. На работе, которая приносит вам богатство, к вам будут относиться как к принцессе, и такая работа может быть бесконечно гибкой. Не знаю, но все-таки взгляните на пункт 1.
  9. Если у вас нет обычного, облагаемого налогом брокерского счета, в который вы инвестируете еженедельно или ежемесячно с постоянной суммой (и в диверсифицированный портфель или фонд), вы зря тратите свое время и свою жизнь. Делая это в течение многих лет и более, у вас будет много активов, которые полностью изменят ваш подход к вашей карьере: вы беретесь на работу тогда и только тогда, когда вам нравится работа, а если нет, у вас достаточно денег на F-U, чтобы продолжать искать что-то до тех пор, пока вы не найдете то, что вам нравится. Также есть максимум 401k. Это вырывает вас из цикла, определяемого пунктом 1 (!!!!!)
  10. Если мы собираемся использовать Python, мы используем mypy.
  11. Жизнь слишком коротка для C ++.
  12. Люди, которые рассказывают вам теорию в вашей курсовой работе по CS, бесполезны, потому что они никогда не имели практики в ней на самом деле, и поскольку они никогда не имели практики в ней, они не видят, где ее можно применить, и поскольку они не могут ее применить, они могут сделать вывод, что это бесполезно. Мне это кажется какой-то странной логикой.


P.S.


Первый коммент на Reddit: Бухни и продолжай писать
Подробнее..

Советы и лайфхаки по Windows Terminal

20.10.2020 10:16:23 | Автор: admin
Терминал Windows поставляется с множеством функций, которые позволяют настраивать его и взаимодействовать с ним наиболее удобным для вас способом. Давайте рассмотрим несколько советов и приемов, которые помогут вам настроить свой терминал так, чтобы он идеально вам подходил. На момент публикации этого сообщения в блоге Windows Terminal имел версию 1.3, а Windows Terminal Preview версию 1.4.



При первом запуске


При первой установке Windows Terminal вы будете поприветствованы строкой Windows PowerShell. Терминал Windows по умолчанию поставляется с профилями Windows PowerShell, командной строки и Azure Cloud Shell.

В дополнение к этим профилям, если у вас установлены какие-либо дистрибутивы Подсистемы Windows для Linux (WSL), терминал также автоматически создаст профили для этих дистрибутивов. Если вы хотите установить дополнительные дистрибутивы WSL на свой компьютер, вы можете сделать это после установки терминала и при следующем запуске терминала профили для этих дистрибутивов должны появиться автоматически. Эти профили будут иметь значок Tux, однако вы можете изменить значок дистрибутива в своих настройках, чтобы он соответствовал любому дистрибутиву, который у вас есть. Вы можете найти дополнительную информацию о WSL на сайте с документацией WSL.

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

Кастомизация


Терминал Windows поставляется с большим набором настроек по умолчанию, включая цветовые схемы и сочетания клавиш. Если вы хотите просмотреть файл настроек по умолчанию, удерживайте Alt и нажмите кнопку Настройки в раскрывающемся меню.

Глобальные настройки профиля


Терминал Windows предоставляет вам возможность применить настройку к каждому профилю без необходимости дублировать настройку для каждой записи профиля. Это можно сделать, добавив параметр в массив "defaults" внутри объекта "profiles". Список всех возможных настроек профиля можно найти на странице настроек профиля в нашей документации.

"profiles":    {        "defaults":        {            // Поместите здесь настройки, которые вы хотите применить ко всем профилям.            "fontFace": "Cascadia Code"        },        "list":        []    }

Кастомные цветовые схемы


Терминал Windows по умолчанию поставляется с набором цветовых схем. Однако, когда дело касается цветовых схем, есть неограниченные возможности. Отличное место для поиска дополнительных схем терминалов terminalplash.com.

Если вы хотите создать свою собственную цветовую схему, terminal.sexy отличный инструмент для создания и визуализации ваших собственных цветовых схем.

Совет. Вы можете сопоставить свою цветовую схему с фоновым изображением, используя палитру цветов PowerToys, чтобы получить коды цветов для использования в вашей схеме. PowerToys можно установить с помощью winget с winget install powertoys.

Настраиваемая командная строка


Вы можете придать стиль своей командной строке с помощью Oh my Posh и Terminal-Icons. Эти инструменты позволяют настроить внешний вид вашей командной строки с помощью цветов, глифов и смайликов. Чтобы запустить Oh my Posh с Posh-Git и PSReadline, следуйте этому руководству.

Oh my Posh недавно выпустили Oh my Posh 3, который имеет гораздо больше возможностей настройки и не является эксклюзивным только для PowerShell. Пройдя руководство, указанное выше, вы можете перейти на V3 с помощью следующей команды:

Update-Module -Name oh-my-posh -AllowPrerelease -Scope CurrentUser



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

Примечание. Для отображения значков терминала вам необходимо установить шрифт Nerd Font.



Олдскульный шрифт


Для тех из вас, кто является поклонником эффекта ретро-терминала, отличное место для поиска шрифтов старой школы находится на странице https://int10h.org/oldschool-pc-fonts/.



Места для фоновых изображений


Обои для рабочего стола часто отлично смотрятся в Windows Terminal в качестве фоновых изображений. Отличные места для поиска фоновых изображений это темы Windows, а также WallpaperHub. Терминал Windows поддерживает как изображения, так и гифки для фоновых изображений.

Другой популярный вариант размещение логотипа оболочки, которую вы используете в качестве фонового изображения, чтобы помочь определить, в какой оболочке вы находитесь. Вы можете указать, где будет размещаться фоновое изображение, с помощью "backgroundImageAlignment" в настройках. Дополнительную информацию о настройках фонового изображения можно найти в нашей документации.

Функции


аргументы командной строки wt.exe


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

Если вы используете команду wt.exe внутри палитры команд, она вступит в силу в вашем текущем окне терминала, вместо того, чтобы запускать новый экземпляр терминала.

В этом примере профиль PowerShell откроется в текущем рабочем каталоге на новой вкладке с вертикальной панелью, на которой будет запущен ваш профиль по умолчанию.

wt-p"PowerShell"-d.;split-pane-V

Full documentation aboutwt command line argumentscan be found on our docs site.

Панели


Терминал Windows поддерживает панель для профилей. Вы можете открыть новую панель профиля, удерживая Alt и щелкнув профиль в раскрывающемся списке, или используя следующие сочетания клавиш:

  • Автоматическое разделение панели текущего профиля: Alt+Shift+D
  • Горизонтальное разделение панели профиля по умолчанию: Alt+Shift+Minus
  • Вертикальное разделение панели профиля по умолчанию: Alt+Shift+Plus

Вы также можете перемещать фокус по панелям, удерживая Alt и используя клавиши со стрелками. Наконец, вы можете изменить размер панелей, удерживая Alt + Shift и используя клавиши со стрелками. Дополнительную информацию о панелях можно найти на нашем сайте документации.



Копи-паст


В Терминале Windows по умолчанию используются сочетания клавиш для копирования и вставкиCtrl+CиCtrl+V, соответственно. Если у вас нет выделения, Ctrl + C будет действовать как обычно, как команда break.

Вы можете настроить, какие клавиши вы хотите использовать для"копировать"и"вставить", редактируя привязки клавиш. Если вы удалите эти привязки клавиш из файла settings.json, терминал по умолчанию будет использовать Ctrl + Shift + C и Ctrl + Shift + V. Это может быть особенно полезно для пользователей WSL, которым нужны свободные Ctrl + C и Ctrl + V для своих оболочек.

Вы также можете выбрать, какое форматирование копируется в буфер обмена вместе с символами новой строки с помощью действий "copyFormatting" и "singleLine", связанных с командой копирования. Полную документацию по командам интеграции с буфером обмена можно найти на нашем сайте документации.

Определение привязок клавиш и действий


Большая часть настраиваемых свойств внутри Windows Terminal зависит от привязок клавиш и действий. Команды внутри массива "actions" будут автоматически добавлены в вашу палитру команд. Если вы хотите также использовать их с привязками клавиш, вы можете добавить к ним ключи, чтобы вызывать их с клавиатуры. Полный список всех возможных команд можно найти на странице действий нашего сайта документации.

Отправка команд input


Терминал Windows дает вам возможность отправлять input в вашу оболочку с привязкой клавиш. Это можно сделать с помощью следующей структуры внутри массива "actions" .

{ "command": {"action": "sendInput", "input": ""}, "keys": "" }

Отправка ввода в оболочку с помощью сочетания клавиш может быть полезна для часто выполняемых команд. Одним из примеров может быть очистка экрана:

{ "command": {"action": "sendInput", "input": "clear\r"}, "keys": "alt+k" }

Также может быть полезен переход к родительскому каталогу с привязкой клавиш.

{ "command": {"action": "sendInput", "input": "cd ..\r"}, "keys": "ctrl+up" }

Вы также можете использовать эту функцию для запуска сборок или тестовых сценариев.

Начальный каталог WSL


На данный момент Терминал Windows по умолчанию устанавливает начальный каталог профилей WSL в качестве папки профиля пользователя Windows. Чтобы настроить запуск вашего профиля WSL в папке ~, вы можете добавить следующую строку в настройки своего профиля, заменив DISTRONAME и USERNAME соответствующими полями.

"startingDirectory": "//wsl$/DISTRONAME/home/USERNAME"
Подробнее..

Как поддерживать максимальную эффективность без выгорания. Краткий конспект

16.05.2021 14:08:59 | Автор: admin

К данной книге я пришёл от джедайских техник и она является вторым источником, в котором я обнаружил понятие резервуара ментальных сил, который может быть исчерпан.

Оригинал состоит из 272 страниц, в которых приведены множества исследований, объяснений, историй и примеров того, что нужно делать, как это делать и почему.
Представляю вам всё самое важное, что, несомненно, должно помочь вам эффективно справляться с задачами.

Кое-что может быть для вас уже знакомым или даже банальным, а кое-что контринтуитивным.
Однако помните: знать и делать - кардинально разные понятия.

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

Алгоритм максимальной эффективности

  1. Определить цель и конкретные задачи.

  2. Полное, совершенное погружение в работу с глубокой, устойчивой сфокусированностью и осознанностью. Чем больше осознанность, тем лучше.

  3. Период отдыха и восстановления, когда нужно вообще не думать о работе.

  4. Инсайт - появление моментов прозрения, новых идей и умственного прогресса.

Нагрузка + отдых = рост. Вот и вся формула успеха. При чём универсальная.Да, вот так всё просто.

Постановка целей

  • Определите свои ключевые ценности.

  • Персонализируйте свои ключевые ценности.

  • Ранжируйте свои ключевые ценности.

  • Запишите своё заявление о цели.

  • Используйте визуальные подсказки - повесьте цели на видное место.

  • Обдумывайте вашу цель перед сном. Можно на бумаге во всех деталях расписать свою жизнь, когда цель будет достигнута.

  • Подумайте о том, насколько ваша жизнь соответствует вашей цели, и что нужно сделать, чтобы стать к ней ближе.

  • Великие идеи рождаются в глубине души.

Используйте силу целеполагания

  • Ищите смысл в трансцендентности, то есть в том, что превосходит вас самих.

  • Понимание цели способствует упорству в её достижении.

  • Помните, что ваше эго, или я, или центральный управляющий, служит защитным механизмом, который удерживает вас от достижения истинных пределов. Когда вы сталкиваетесь с серьезными проблемами, ваше эго биологически запрограммировано остановить вас и велеть вам повернуть в другом направлении.

  • Сконцентрировавшись на трансцендентной цели, на задаче сделать что-то за пределами личных интересов (например, помощь другим), вы можете преодолеть свое эго и пробиться через практически любые ограничения и сделать гораздо больше, чем полагали возможным.

  • В данном контексте меньше думать о себе это лучший способ развить себя.

Лучше всего мы учимся, когда нам приходится реально стараться

  • Поэтому следует искать задачи, едва поддающиеся решению. Это те, которые находятся слегка за пределами имеющихся навыков и возможностей. Данная зона, как бы "за чертой" - и есть зона наилучшего обучения.

  • Сомнения и неуверенность по отношению к задаче - это даже полезно, ведь они выступают в качестве свидетельства возможности роста.

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

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

Культивируйте мышление роста

  • От отношения зависит всё. Оно способно изменять даже гормональную реакцию нашего тела и личностные характеристики.

  • Чувство напряжение и стресса само по себе нейтрально. Именно наше отношение придаёт ему эмоциональный окрас и существенно сказывается на его влиянии на нас. К сожалению, мы привыкли воспринимать его болезненно.

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

  • В ситуациях, вызывающих напряжение, сотвори из стресса приятный мандраж. Просто сделай глубокий вдох и искренне скажи себе "Я в восторге". Используй нервное возбуждение и обостренное восприятие во благо.

  • Ощути предвкушение победы. Как ни странно, оно дарует больше мотивации, чем сама победа.

Глубоко фокусируйтесь и добивайтесь осознанного идеального исполнения, даже если это не всегда приятно

  • Осознанность заключается в том, чтобы полностью присутствовать в настоящем, до конца осознавая себя и происходящее вокруг. Осознанность также позволяет решить, как реагировать на стресс.

  • Уберите все, что вас отвлекает, например смартфоны. Помните: с глаз долой из сердца вон.

  • Делайте только одну вещь за раз. Наука доказала: многозадачность неэффективна.

  • Качество важнее количества.

Разбивайте работу на блоки

  • Разделите работу на спринты продолжительностью 50 минут и передышки по 10 минут. Мозг устаёт точно так же, как и мышца.

  • Во время отдыха мозг не перестаёт быть активным, просто включается другая система, за которую ответственно подсознание. Именно тогда активизируется магия творческих открытий и идей.

  • Когда утыкаетесь в тупик во время работы, значит самое время сделать перерыв.

  • Во время перерывов занимайтесь делами, которые почти не требуют или вообще не требуют концентрации:

    выйдите на короткую прогулку;
    посидите на природе;
    медитируйте;
    общайтесь с людьми;
    погладьте кота или партнёра;
    послушайте музыку;
    примите душ;
    помойте посуду.

  • Даже если никаких явных идей во время перерыва в голову не пришло, подсознание все равно заработало. Когда вы вернетесь к тому, чем занимались, вы, скорее всего, сможете преодолеть затруднение.

  • В случае действительно выматывающих задач подумайте о том, чтобы сделать паузу до утра.

  • Чем сложнее задача, тем дольше должен быть перерыв.

Отдыхайте правильно!

  • Медитация "дыхания". Сосредоточьтесь только на дыхании. Если задумываетесь о чем-то, отмечайте свои мысли, но отпускайте их. Снова сконцентрируйтесь на дыхании.

  • Регулярность важнее продолжительности. Лучше всего медитировать ежедневно, даже если это означает, что сессии будут короткими.

Используйте повышенную осознанность в повседневной жизни

  • Медитация помогает увеличить осознанность, с помощью которой можно направлять энергию стресса в правильном направлении.

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

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

  • Чем больше стресс, тем дольше вы должны отдыхать.

  • Отключитесь как физически, так и умственно, и занимайтесь делами, которые находите расслабляющими и восстанавливающими.

  • Усердный отдых порой может потребовать большего мужества, чем усердная работа.

  • Если ты откатился к старым привычкам, значит мозг устал и не может толком проявлять повышенный самоконтроль. Самоконтроль - тоже проявление ментальных сил.

  • Принятие решений тоже расходует мыслетопливо. Исключение ненужных решений и автоматизация простых действий способно повысить продуктивность.

Сон в приоритете

  • Сон продуктивное занятие.

  • 7-9 часов каждую ночь.

  • Убедитесь, что в течение дня находитесь под естественным, не электрическим светом. Это поможет вам поддерживать здоровый циркадный ритм.

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

  • Когда чувствуете дремоту, не боритесь с ней. Что бы вы ни делали, это может подождать до утра.

  • Спальня должна быть как можно более темной. Если возможно, заведите светонепроницаемые жалюзи.

  • Дневной сон от 10 до 30 минут для восстановления энергии, концентрации и креативности очень полезен. Однако ни в коем случае не дольше, а то случится обратный эффект.

Подготовка к производительности

  • Создайте свой ритуал разогрева для важной деятельности.

  • Определите, какого именно состояния вы хотите добиться (острый ум, максимальная внимательность, быстрая сообразительность).

  • Разработайте последовательность действий, которая приведет ваше тело и разум в это состояние (зарядка, аффирмации, сытный завтрак, кофе, душ).

  • Будьте последовательны: используйте один и тот же ритуал каждый раз, когда занимаетесь деятельностью, с которой он связан.

Выбирайте свое окружение

  • Окружение имеет огромное влияние на нас.

  • Следует окружить себя предметами, которые побуждают желательные действия, а приводящие к нежелательным - убрать.

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

  • Помните, что, сохраняя положительный настрой и демонстрируя мотивацию, вы помогаете не только себе, но также всем окружающим.

  • Не поддавайтесь негативным эмоциям и пессимизму.

Помните, что цепь сильна настолько, насколько сильно ее самое слабое звено.

Помогайте другим, чтобы избегать выгорания

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

  • Основные критерии: помощь другим должна быть тесно связана с вашей работой, помогать нужно, не рассчитывая получить что-то взамен.

  • Помощь другим отлично помогает предотвращать и исцелять выгорание.

Подробнее..

Глупость и излишняя уверенность. 13 качеств хорошего руководителя

01.10.2020 06:21:49 | Автор: admin


Я инженер и дизайнер. Мне нравится представляться людям именно так, особенно в Европе. Слово инженер там носит интересный налёт загадочности, интеллектуальности и богатства. В общем, очень помогает заводить новых знакомых.

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

А ещё я почти 10 лет руковожу небольшой организацией. Но при этом всегда продолжал программировать и дизайнить как минимум в виде хобби.

Обнаружилась особенность: нельзя одинаково подходить к работе программиста/дизайнера и к работе руководителя, приходится как бы переключать тумблер, перенастраиваться.

В очередной раз планируя проект, поймал себя на мысли Ну, архитектуру REST API я-то и сам могу сделать. Заодно функциональные требования напишу и нарисую дизайн для MVP. Там же немного совсем. И тут в голове захохотал голос:
Сказочный ты руководитель, раз самому приходится всё делать.

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




1. Глупость


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

Это поможет избежать аналитического паралича (не путать с сонным параличом). Ведь чем более человек склонен анализировать информацию и чем больше данных у него есть, тем сложнее принять решение. У вас когда-нибудь был руководитель, который не может ничего решить? Как вам опыт работы с ним?

Вот ещё три исследования в пользу отказа от чрезмерных умствований.
  1. Введение дополнительной информации может увеличить вероятность принятия неверного решения.
  2. Для принятия решений люди используют гораздо меньше сведений, чем они думают.
  3. Когда ты считаешь себя самым умным, сложно доверять работу другим. А работа, выполненная под твоей опекой, кажется тебе более значимой, даже если на самом деле это не так.



2. Излишняя уверенность


Уверенности должно быть через край. Уверенности в успехе, в вашей команде и, конечно, в себе. Человеческое настроение, оно как герпес, заразно. У руководителя должно быть достаточно уверенности, чтобы поперезаражать ею всех своих коллег, а заодно ещё линейных начальников, инвесторов и клиентов.

Мало того, недостаточно просто чувствовать уверенность внутри себя. Нужно её демонстрировать. А это уже отдельный навык. У кого-то есть к нему талант, а кому-то нужно специально тренироваться.

Даже такие небольшие моменты, как расправленная спина, чёткий голос, улыбка, спокойные движения и прямой взгляд, позволяют влиять на людей. Звучит как цитата из какой-то книжки по НЛП. Но иногда это работает даже лучше, чем убедительные аргументы.

В одной из статей я встречал определение de-facto leader. Это когда при наличии формального начальника, реальные решения в организации принимает один из его подчинённых, которого просто больше слушают из-за того, что тот увереннее действует.


3. Энергичность


Очень похожая история с уверенностью. Плох тот проект, посередине которого не происходит чего-то неожиданного. И плох тот руководитель, у которого недостаточно сил, чтобы взбодрить команду и вытянуть проект из ямы.

Но невозможно постоянно быть суперэнергичным. Следом за пиками всегда наступает эмоциональный упадок. Приходится как-то выкручиваться.

Есть одно простое правило: никогда, ни за что и ни при каких обстоятельствах не общайся с командой, если у тебя плохое, вялое настроение.

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


4. Честно о плохом


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

Чтобы неприятные разговоры не стали неожиданностью, лучше заранее подготавливать для них почву. Уже на собеседованиях о приёме на работу я начинаю договариваться с человеком об условиях его увольнения, обсуждать задержки зарплаты и переработки. Вы бы видели лицо HR-ра в эти моменты.

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

Зачем это нужно? Многие люди отвечают честностью на честность. И если у ценного сотрудника будут сомнения по поводу работы в вашей компании, то перед началом поиска чего-то на стороне, он придёт к вам с разговором. И тут уже будет возможность или изменить его мнение или заранее подготовиться к замене. Никто не любит внезапно терять полезных членов команды.


5. Делегировать, а не командовать


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

Как вам определение полная личная ответственность? Мы не просто расплывчато и неопределённо делегируем, мы передаём задачи под полную личную ответственность. После такой передачи у менеджера появляются:

  • Полная свобода действий
  • Безусловный авторитет перед сотрудниками
  • Единоличный контроль над своими сотрудниками


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

Есть вещи, которые нельзя делегировать. У каждого это что-то своё. Я обычно не передаю полную ответственность за всё, что связано с деньгами, решениями о принятии кого-то на работу, контролем над важными аккаунтами (вроде домена).


6. Не работать без плана


Без плана люди склонны браться за понятные небольшие задачи и углубляться в детали, забывая об общей картине. Это создаёт иллюзию работы, хотя глобально проект стоит на месте. Сотрудники тратят силы, не видя результата, это в конечном итоге ведёт проект к провалу.

Планирование начинается с цели. Удобнее ставить её по старому доброму SMART (конкретная, измеримая, достижимая, значимая, привязанная ко времени). В продуктовых командах сложнее всего с привязкой ко времени. Формально она есть, но по факту сроки постоянно могут переноситься, и все в итоге понимают, что поставленный срок ничего не значит. Задача на будущее придумать, как можно эффективнее с этим бороться.

Планирование может занимать много времени. Чтобы ресурсы компании не простаивали, стоит заранее обговорить с людьми, что они должны делать, когда нет постановки. Это может быть:
  • Закрыть 10 тикетов из бэклога внутренних проектов
  • Сходить на конференцию и сделать доклад о том, что нового узнал
  • Самые крутые ребята сами с удовольствием придумывают себе задачи и пилят их на благо компании
  • По договорённости можно дать человеку дополнительный выходной за счёт того, что он отработает его во время активной фазы проекта



7. Не брать чужую работу


Все, кто не читал знаменитую статью Менеджер и его время, или Кому достанется обезьяна скорее читайте её. С 1974 г. это самая популярная публикация Harvard Business Review. Менеджеры по-прежнему наступают на старые грабли, позволяя подчинённым ставить себе задачи.

Вдумайтесь. Каждый раз, когда вы выслушиваете проблему сотрудника в коридоре (по почте, телефону и т.п.) и обещаете помочь, она становится вашей проблемой. Образно говоря, вы берёте на попечение чужую обезьяну. Подчинённый легко расстанется с ней, а потом будет спрашивать тебя, когда же ты наконец решишь его проблему. А если не решишь, то окажешься ещё и плохим руководителем.

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

В отношениях с начальством можно выделить 5 уровней инициативности:
  1. Сотрудник ждёт, пока поступит прямое указание
  2. Сотрудник спрашивает, что нужно делать
  3. Сотрудник предлагает свой план, который затем реализует
  4. Сотрудник действует самостоятельно, по ходу дела спрашивая совета
  5. Сотрудник действует совершенно самостоятельно и в конце представляет отчет о проделанной работе


Признаюсь, не встречал руководителей в ИТ, которые хотели бы видеть в команде хотя бы одного человека, действующего по принципу 1. Я бы сказал, что нужен как минимум 3-й уровень инициативности.


8. Не критиковать за инициативу


Это табу. Даже если человек накосячил. Можно обсуждать, как он собирается исправлять ситуацию, как избежать в будущем таких сложностей, но никогда не наказывать за инициативу и не пресекать её.

Да и вообще всяческие наказания стоит убрать из своего арсенала. Я ради интереса пробовал подход Я начальник, ты дурак, это давало очень кратковременные результаты и всегда заканчивалось уходом человека из команды.


9. Давать и выполнять обещания


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

И то и другое применимо даже к микрообещаниям по самым пустяковым поводам. Вечером пришлю тебе ссылку на ту книжку, о которой говорил, Да, давай сходим в столовку, освобожусь через 15 минут. А минус в карму тебе принесёт даже передвинутая встреча. Нужно следить, чтобы выполненных обещаний всегда было больше, чем невыполненных.

Кстати, превосходить ожидания в надежде завоевать уважение тоже не стоит. Есть подозрение, что это не только не несёт позитивных последствий, но и может привести к обратному эффекту.


10. Единоначалие


О принципе единоначалия в менеджменте писал ещё Анри Файоль (батя современного менеджмента). Это правило актуально до сих пор. Если сотрудник получает задания и отчитывается о результатах перед несколькими менеджерами, ни к чему хорошему это не приводит.

Стресс, демотивация, потеря лояльности, срыв дедлайнов, подрыв авторитетов только самые очевидные последствия. И тут становится понятно, почему так сложно делегировать. Когда у твоего подчинённого появляется своя команда, ты должен отказаться от личного контроля над этой командой. В конечном итоге, что тебе важнее, эффективность работы или желание кем-то поруководить?


11. Оценивать по результатам


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

Если человек раз за разом не справляется со своей работой, то нужно расставаться.


12. Не тянуть с расставанием


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

Бывает, что даже мудака увольнять не хочется. Он подучится, перевоспитается эти сказки мы рассказываем себе, лишь бы нас самих не посчитали плохими. Если оказалось, что человек токсичный, некомпетентный, ленивый, не нужно тянуть.

А ещё кто-то может просто оказаться не на своём месте и сам быть недоволен ситуацией и своим в ней положением. Держась за такого человека, оказываешь медвежью услугу и ему и себе.

В конце концов, с адекватными людьми всегда можно сойтись снова. И я так не раз делал.


13. Благодарить вслух


Все любят, когда их хвалят. Но хвалить нужно за дело. Пустые похвалы со временем просто никто не будет воспринимать всерьёз.

Мне очень сложно с этим. Думаю восхитительно, а говорю норм. Для людей с такими же проблемами есть несколько советов:
  • Показать результаты работы в действии это тоже похвала. Людям нравится понимать, что их работа востребована
  • Если решаешь выдать премию, то нужно лично сказать человеку об этом решении, а не просто попросить бухгалтера перевести её молча на карту
  • Нужно как можно чаще публично указывать, кто принимал участие в работах
  • Ну и просто благодари вслух и при свидетелях


Статью написал Денис Элиановский.
Спасибо Станиславу Лушину и Татьяне Китаевой за помощь и редактуру, Елене Ефимовой за картинку в хедере.
Подробнее..

Работать в цехе, о культуре рабочих

04.06.2021 02:06:03 | Автор: admin

Это краткая заметка о культуре в разных кооперативах, в которых пришлось по работать (картинки из подобного места, но не те о которых пойдет речь)

Кратко о себе: 2 вышки - 1ая Учитель рисования, 2ая - ИТ + одно средне специальное - художественная обработка металла

В Цехе

Начну с того, что где-то в 2001-2002 я устроился на завод, устраивался 2 раза.

Первый раз - практика, разрабатывал медаль для цеха, ну в смысле медаль которую дарят, от эскиза до ручной обработки металлических пресс штампов.

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

И что характерно для цеха размером 150-250 м в длину и наверно 250-400 м в ширину + 200..300 работников в цехе (на заводе много цехов, завод и сейчас большой - более 10000 сотрудников, наверно даже больше)

Распорядок дня

Рабочий день официально начинался с 8, а для меня всегда была проблема проснуться.

Что бы попасть на завод надо взять с собой пластиковый пропуск с фото, пройти КПП (Контрольно пропускной пункт), а затем еще +5...8 минут пешком и в цех.

Хотя и начинался рабочий день в 8-00, а по факту, надо было до 8-30 закинуть пропуск в окно, на первом этаже цеха. В окне из оргстекла была щель, и к 8-30 накапливалась груда пропусков, а в 8-30 приходила табельщица, собирала все их, и кто не успел до 8-30 кинуть пропуск - тому ставила опоздание/прогул.

Не успел - пиши объяснительную начальнику цеха, я писал просто - проспал. Моя работа не была важной, но мой непосредственный начальник кратко матерился, но более ничего не делал. Ибо и так че взять, с пацана которому еще и 20 лет нет. Ну и опаздывал я не так часто, так чтоб на 30+ минут.

Что еще важно, так то, что в 8-45 начальник цеха начинал обход рабочих мест, смотрел, кто вышел, кто нет, есть ли косяки на рабочих местах (грязь например) и иногда спрашивал рабочих, что им нужно для работы.

Рядом с начальником шел мастер, который отчитывался за косяки и он, не мог свалить косяк на рабочего, т.к. рабочий тут же был.

Интересный момент в том, что рабочие особо не раптовали перед начальством и часто говорили в лицо, почти все что думают о начальстве, о мастере, хотя перед начальником цеха не выпендривались.

Начальники, включая мастеров всякие бывают, но диалоги редко блистали высоким слогом, да и кому он в цеху нужен.

Завод большой, в нем есть "Управление" - это такое отдельное здание, где сидят белые воротнички или говоря по другому - офисный планктон.

Байка - в Управление говорят раньше, то есть до 80-ых можно было спокойно зайти, охранника на входе не было. Был случай, когда задержали зарплату (или еще что-то) возмущенные труженики пришли в управление, поднялись на 2ой этаж и таки "популярно" объяснили что они думаю о начальстве,, с применением силы, и вот мол после этого появились охранники на входе.

Хоть я и не верю этой байке, но доля правды в ней есть.

Я первые пол года работал в маленьком бюро которое производила точные копии продукции в маленьком масштабе, бюро состояло из 5 человек, включая меня, и все мы размещались в трех комнатах на втором этаже цеха.

У меня на рабочем месте, лежали напильники, надфиля, паяльник на 100Вт, карандаш, штангельциркуль, тисы прикрученные к столу, чертежи продукции и куча заготовок.

Пол из кафельной плитки размером 40 на 40 см и огрызками плитки-линолиума, или какого то выцветшего зеленого пластика времен СССР, яркие лампы под 3+ метровым потолком.

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

Рабочее утро начиналось с того что я спал на ходу, коллеги тогда поили меня чаем который они заваривали в 1 литровой банке. В банку они кидали кипятильник, заливали водой, вода кипела. В кипящую воду высыпали чай напоминающий опилки и кипятил еще минут 5.

Такой чай мог разбудить наверно и мертвеца как меня.

Никто не кидался за работу сразу, типичная поговорка была такой: "Чай не пил, какая сила ?"

Обед

Обед по распорядку, в 12-20, надо было спуститься на первый этаж в столовую, о меню и кухе лучше не спрашивать, и не знать.

Ближе к 16-40 конец дня, время прибраться, пострадать х... и занять очередь за пропуском.

Социалка и плюшки

Что хорошо еще, надо тебе по работе или не по работе к коллеге в соседний цех сходить, встаешь и идешь, если тебя на месте нет больше 2,5 часов, могут и спросить, где шатался. По сути никому не было особого дела, где ты шатаешься, кроме твоего непосредственного начальства. А начальник в первый же день мне сказал где шататься нельзя. Начальник отвечал за мою безопасность.

Если заболел, или лень работать, то можно сходить в поликлинику, которая располагалась на территории и попытать удачу, получить больничный. Я тогда не борзел, т.к. начальство хорошо относилось ко мне.

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

Еще было такое, что работы не было, выходишь в цех, сделал плановую работу, до обеда, а после нет работы, тогда кто что делал, кто в шишки или в нарды, кто в настольный теннис, а кто у батареи храпит.

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

А кооперативы и ценности компании и тим билдинг - это очень просто: за территорией завода есть пивнушка, там и водка есть и закусь. Начальник цеха сам не пьет с рабочими, ибо статус, а мастер... а это на его совести.

А на рабочем месте, пить - не хорошо, нет, ну я сам нет, ибо в первом же коллективе объяснили просто: будешь пить - сопьёшься. Но то мне, когда я был внушаем, и то мужик которому 40+ и пить для него естественно, как зубы чистить.

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

Впечатления

Что хорошо в таком рабочем коллективе, так это открытость, открыто можно послать и быть посланным. Можно коллегу по просить подменить, а если надо что для работы, то и начальника спросить можно.

Что не очень, та же сторона, не часто в таком коллективе встретишь людей которые Иммануила Канта читали, но.... в целом было бы хорошо услышать мат с перемешкой про философию сознания и трансцедентальным ужасом.

А еще хорошо то, что там есть и простые люди и крутые люди, как например профессор/преподаватель по металлургии, который учил меня как на глаз определять температуру металла между 600 и 650, 700, 750, ... градусов, показывая на своем примере, как в муфельную печь размером с гараж засовывать заготовки и как их закалять в воде или в масле.

Что плохо - если ты молод и ничего не умеешь, то и ЗП маленькая.

Что хорошо - а быстро понимаешь, зачем работать и как живут люди с их страстями, очень все скажем так ... выпукло или душевненько. Среди офисного планктона в котором я работал, таких понятных отношений не наблюдал, за не большим исключением, о чем я напишу еще.

P.S. А еще я работал и в других местах, как например

  • Технологический отдел, с 350+ технологов, где 75% это женщины - инженеры и интриги это их основная деятельность - 3 года

  • В отделе ИТ при заводе, так же где 200+ человек - еще 3-4 года, админил ORACLE

  • На другом заводе админил ORACLE/MSSQL еще 8-9 лет и "пинал" программистов, за их код.

  • Сейчас работаю сам программистом в банке - и дивлюсь еще больше, какие же программисты бывают альтернативно одаренными

  • А еще и художественная сфера с которой все равно соприкасался, хоть и не работал

  • А еще всякие мелкие халтуры в ИТ, как то дизайн и программирование для "маленьких"... ох...

Подробнее..

Итеративный геймдизайн, Godot и мир маленьких планет

01.09.2020 20:19:15 | Автор: admin

Итеративный подход

Существуют различные подходы к организации геймдизайна. Я предпочитаю использовать итеративный способ, вернее путь к итоговым механикам и структурам через прототипирование ядра неполной концепции, с последующим многократным тестированием и дополнением. То есть под итерациями понимаются не просто новые слои улучшений, а и сама суть концепции видоизменяется под влиянием результатов её практического применения.

Можно представить себе ситуацию с созданием некоего здания. В одном случае у нас есть уже готовый просчитанный чертёж, по которому остаётся только выстроить запланированный объект, зная чего и сколько понадобится. В случае итеративного подхода, вместо точного чертежа у нас примерный образ, с намётками иерархической структуры, и некий набор инструментов, с помощью которого мы собираемся как-бы вырезать наше здание внутри скал, следуя за конфигурацией породы и вновь открывающимися обстоятельствами.

Естественно, для такой задачи мы тоже могли что-то просчитать заранее, просто в данном подходе мы за свой предварительный чертёж не особо держимся, исходя из того, что в процессе многое может сильно поменяться и даже ожидая этого. Просто сам наш чертёж будет как-бы формироваться в процессе, проходить эволюции от одной формы к другой, вслед за образным прорубанием проходов в скалах. То есть базово мы понимаем, что у нас будет некая точка входа в пещеру, точка выхода и связующий их тоннель. Соответственно сосредотачиваемся на поиске этих нужных мест и построении пути между ними, и расчётах с этим связанных, а к прорезанию полноценных чертогов подземного короля мы придём уже потом, на каком-то из следующих шагов.

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

Перейдём к большей конкретике. В разработке игры это всё означает, что приступая к более менее полноценному прототипу мы в первую очередь сфокусируемся на том, чтобы там работала какая-то самая стержневая механика и определимся с основными проблемами, которые требуют решения на ранних этапах. То есть, проектируя таким образом Марио, нам нужен условный объект-персонаж, который умеет прыгать и бегать в стороны, вот с его отображением и написанием кода прыжков-движения мы и будем разбираться. Для Квейка нам понадобится создать контроллер от первого лица и реализовать возможность создавать пули по нажатию кнопки. Для тактической стратегии - логику поведения фигурок-юнитов на поле сражения, возможность двигаться и атаковать.

Как видно, уже на данном этапе появляются различные вопросы и развилки. А так ли нужен Марио прыжок, должен ли он быть двойным (тройным, неограниченным), как быстро герой движется? Выстрелы в Квейке сделать в виде быстро летящих шариков или лучами, где закрепить камеру, как быстро она поворачивается? Всё тактическое поле боя представить в виде матрицы, хранящей все состояния клеток и положения юнитов внутри неё, или же сделать юниты полноценными отдельными сущностями, ограниченными картой, чтобы получить от такого подхода какой-то особый профит? Какой размер игрового поля, сколько участников?

Если ваше общее видение учитывало эти факторы или явно тяготеет к какому-то одному пути, то часть подобных вопросов решается сходу. В иных случаях вы можете исследовать те или иные варианты, чтобы лучше понять, на каком варианте остановиться. Какие-то вопросы можно отложить, как не особо важные на данном этапе (когда будет заготовка уровня, тогда и скорость движения настроим), или запланировать реализацию сразу несколько решений впоследствии (пусть оружие будет и бесконечное, и с патронами, и лучевое, и бензопила) а пока сделать то, которое проще. Либо упростить задачу и пойти по какому-то другому пути (вместо полноценной тактики на поле делать что-то более элементарное, с меньшим количеством героев, без передвижений и так далее).

Для того, чтобы в процессе разработки было проще маневрировать в ту или иную сторону стоит держать всё по возможности максимально простым, не ударяясь в написание какой-то там очень сложной структуры, которая никак не работает, пока не прописаны все её составные части. В первую очередь самый базовый функционал, с кубиками, пустышками, заглушками, который уже выполняется и передаёт данные, а визуал, декор прочие детали - вещи второстепенные, реализацию которых можно отложить.

Одна из первых целей - это собрать минимальную запускаемую вещь, с началом, серединой и концом. То есть банально окно входа в игру, основной игровой экран и кнопка/окошко выхода. Вход в пещеру, тоннель, свет в его конце. Минимальное приложение, которое уже работает, хотя внутри пока довольно пусто.

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

Среди приходящих новых идей отмечаем какие-то перспективные, на которые можно перейти сразу или в дальнейшем. Даже если они противоречат каким-то нашим векторам разработки и мы не будем ими пользоваться, всё-равно полезно их записать.

Прототипирование Microspace project в Godot engine

Итак, некоторое время назад я в общих чертах сформулировал концепцию rpg-игры, в которой можно собрать партию разумных звездолётиков и летать по секторам местного космоса, участвуя в жизни маленьких планеток. Подробнее тут:

Таким образом, требовалось собрать прототип, в котором на самом элементарном уровне были бы реализованы какие-то классические ингредиенты jrpg-жанра - режим глобальной карты, режим сражений. Чем я и занялся.

В качестве движка был выбран Godot engine, а конкретнее версия 3.2.1, язык GDScript и gles3 рендер. В целом данный проект относится к категории достаточно код-интенсивных, всё-таки это далеко не аркада, где можно обойтись вобще без программирования. Выбор GDScript'а не особо принципиален, просто на нём быстрее писать внутри редактора, без открытия лишних окон, а так - вся логика без каких-то особых проблем переносится на тот же C#. Gles3 тоже не принципиален, но я взял более мощный рендер в качестве целевой платформы, а на упрощённом всегда можно собрать отдельную версию, только потребуется переработать частицы.

Началось всё с набросков карты сектора и написания контроллера, чтобы добавить модель кораблика и полетать по получившемуся "космосу" (попутно придумалась музыкальная композиция для глобальной карты):

Да, я тут не ограничился совсем уж примитивами и уделил всё-таки некоторое время намёткам визуала. Далее стал добавляться уже более плотный код, касающийся параметров корабля и интерфейсных элементов, например, стало возможным открытие упрощённого окошка инвентаря. По задумке течение полёта с ним не подразумевались какие-то манипуляции, кроме просмотра текущего состояния, а возможность более основательно покопаться в инвентаре я хотел реализовать уже именно при посещении планет, внутри их интерфейса.

Прописывая скрипт для определения столкновений с планетками я подумал, что перед визитом будет сначала всплывать окошко с общими параметрами планеты (или прочего объекта, доступного для посещения), где можно согласиться на посещение либо пролететь мимо.

Подготавливая приблизительные иконки с персонажами/предметами для инвентаря я завёл пару текстурных атласов в формате png, размерами 512 на 512. Таким образом в каждом можно держать по 64 иконки размерами 64 на 64. Godot, кстати, сам умеет сшивать несколько выбранных картинок в атлас, но у меня почему-то эта его функция не срабатывает, поэтому набросал заготовки в графическом редакторе.

Далее был реализован экран сражения, а на карте появились видимые неподвижные враги, коснувшись которых кораблик переносится в сражение. Во время сражения у звездолётика накапливается шкала, после чего возникает пауза, пока не выбрано действие. У врага есть своя, скрытая шкала, к тому же они могут иметь не фиксированные промежутки для различных атак и приёмов. Кстати, отсюда выглядит интересной возможность для персонажа какими-то приёмами ускорять себе следующее действие - именно не разгон себе параметра "скорость" на несколько ходов, а конкретный бонус к скорости на следующее действие, когда совершаешь какую-то разовую утилитарную способность, которая сама по себе не несёт особого боевого эффекта, либо способность тратящую ресурс, которую ты не можешь делать часто.

В следующем ролике уже можно более явно разглядеть очертания планируемой концепции, хотя кроме моментов самого процесса тут есть перебивки на работу в редакторе:

Следующее обновление принесло ещё один важный момент, которого не хватало - собственно, партию героев, к основному звездолётику Wanderer добавились Spira и Vanguard. Появились новые враги, отображение получаемого урона, самописный ориентировочный трек сражения, доработки инвентаря и специальная станция, где можно отправить одного из героев с основного корабля на задние, а потом забрать его, после истечения срока.

Архитектура приложения

Теперь немного о том, как всё это устроенно за кадром. Godot представляет всё в виде иерархически связанных элементов, которые являются различными узлами либо сценами, в которые завёрнуты другие узлы и/или сцены. То есть, у нас, допустим, есть общая "сцена-океан", в которой содержится "узел-солнце" и "сцены-острова", в каждом из которых расклонированы "сцены-деревья" и так далее.

Собственно, про некоторые особенности движка Godot и я рассказывал вот в этой статье:

А внутренняя архитектура прототипа космической jrpg следующая: есть основная 2д сцена - стартовый экран, куда попадает пользователь. При выборе уровня к корню стартовой сцены крепится сцена космического сектора, в которую дочерним объектом крепится звездолётик и на него навешиваются слушатели некоторых сигналов. Сама стартовая сцена при этом скрывается, но её скрипт обрабатывает сигналы от кораблика - столкновение с врагом, открытие инвентаря, попадание в зону планеты. Когда игрок открывает инвентарь, то стартовая сцена снова показывается, но отображает не менюшку входа в игру, а окошко инвентаря.

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

Сам кораблик представляет собой объект, содержащий внутри себя сразу все возможные кораблики, и притворяясь то одним, то другим, в зависимости от того, какой кораблик выбран пользователем в качестве основного. По сути это такой элемент трёхмерного атласа звездолётиков. Вражеский объект - это тоже такая спрессованная общность всех возможных врагов, в её скрипте прописан идентификатор, глядя на который она показывает определённого врага.

Примерно таким же образом союзники и враги представлены внутри сражения, принимая вид корабликов партии и демонстрируя расстановку вражеских сил.

В Godot предусмотрена возможность заводить в отдельном окошке синглтоны, которые будут доступны глобально. Я использую один такой для простого хранения глобальных переменных и массивов.

Где брать идеи

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

Но в первую очередь это различные игры, в том числе полезно знакомство с достаточно базовыми - что-то вовсе из простых настольных, или текстовых, или карточных, или словесных. Это как раз те маленькие машинки, которые надо научиться разобрать и понимать, прежде чем переключиться на что-то более комплексное и большое. Тот самый базовый геймдизайнерский опыт.

В плане игр компьютерных полезно изучать их геймплей, понять общий смысл и думать над его возможными интерпретациями и областями применения. Отделять важное от второстепенного, видеть скрытую иерархию. Тем не менее в игре важны буквально все аспекты, даже не те, которые являются стержневыми и важными. Надо стараться раньше замечать подобные точки притяжения интереса игрока или вещи, с которыми он часто сталкивается, чтобы тоже уделить им внимание по возможности и просто лучше себе представлять какие второстепенные аспекты оказывают заметное влияние на общий игровой опыт.

Одна из практик - это смешивать механики из разных игр и смотреть, что каждая привнесенная механика может делать ещё, кроме первой своей функции, может ли стать стать более комплексной. В то же время не стоит тащить с собой чужие костыли, у нас и собственных образуется в процессе. То есть, имплементируя какую-то уже существующую механику в состав своей концепции стоит присмотреться - а так ли нужна она вся великом или достаточно лишь части. А может быть она будет использована для другого, чем это обычно принято.

Другая практика - ограничения. Можно пробовать убирать очевидные элементы, накладывая таким образом некие рамки, в которых может придуматься что-то оригинальное. Например, что если игра будет обходиться без текста, без стрельбы, без главного героя, без интерфейса, без определённых цветов, без смертей, без бонусов, без опыта, без перемещений, без смены локации, без прогрессии. Что если механика не поощряет привычные действия, что если игрок не контролирует персонажа и так далее. Из любой игры, кстати, довольно часто есть что убрать и упростить, даже не потеряв в геймплее. В то же время убранные вещи меняют так сказать, центр масс, игры и освободившееся место может быть дополнено чем то иным, развито в другом направлении.

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

В плане разработки стоит сосредоточиться на том, что вы реально сможете сделать сами, хотя планировать и задумывать можно и довольно сложные конструкции. Но лучше быть реалистами и именно в реализацию на практике брать что-то, хотя бы частично и в общих чертах, достигаемое. То есть не говорить что "вот был бы у меня движок А, а не Б", или "вот сделают мне ролики и крутые модели, тогда я и сваяю нетленку". А просто взять и что-то сделать. Хотя бы в тетрадке нарисовать, хотя бы приблизительно, хотя бы общий план. Нарисовать одного персонажа, а не триста. Написать не рассказ, но диалог. Это всё вроде бы мелкие и незначительные шаги, но они раз за разом формируют новые условия, от которых можно оттолкнуться ещё дальше, ещё дальше и ещё дальше.

Вот нам нужна игра про партию героев, которые сражаются с врагами, исследуют различные города, имеют систему развития, разные предметы... Начните с одного героя. Одного врага. Сражение с одной только опцией - удар. Вместо города несколько примитивов изображающих дом. Отображение пустого окошка с информацией о герое. И так далее. Потом героев станет два. В статистике появится имя. Врагов станет двое. Кроме ударить, появится вторая опция, пусть она даже сначала не работает. Коробок-домов станет несколько. Появится отображение содержимого сумки, пусть сначала только одна ячейка. Затем героев станет три, и можно будет менять их местами. Враги станут попадаться группами по 2 или 3. Появятся ещё боевые опции. Появится вторая область с "домиками", до которой можно добраться. Итак далее.

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

Время от времени переключаться на разные виды деятельности - тоже немаловажно. Так сохраняется нужный уровень интереса и процесс не превращается в скучную рутину. В конце концов мысли и состояния приходят определёнными циклами и ритмами - если неудержимо тянет именно сейчас отвлечься от первостепенных задач и поработать над чем-то не таким важным, но более интересным, то почему бы и нет, пока есть желание.

Всегда записывайте идеи. Они пригодятся не сразу, и, возможно, не для этого проекта. Или даже вовсе не пригодятся в итоге сами по себе, но всегда есть шансы, что позднее они соединяются в нечто цельное или натолкнут на следующую мысль по цепочке. Само их существование воздействует на вас, когда идею записали - это уже не одно и то же, что просто её подумать. Пробуйте, кстати, применять какие-то свои старые идеи к новым проектам, вдруг они неожиданно раскроются в этом новом окружении.

Н

Подробнее..

Идеи и советы по производству мерча для сотрудников

29.07.2020 14:20:10 | Автор: admin


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

Зачем вообще нужен мерч


В прямом смысле проект не зарабатывает, но он выполняет другие важные задачи. В нашем случае:

  • мотивирует сотрудников на активности и достижения в игровом формате: написал полезную статью накопил на классную вещь,
  • работает на hr-бренд: хочу мерч хочу быть роботом,
  • формирует чувство причастности к общему делу,
  • позволяет команде выразить себя во внутреннем проекте сделать все под себя и для себя.

Дождевик


Лето 2019 отличилось осадками, поэтому первыми мы сделали дождевики, решив, что это практичная вещь для нашего климата. Оказалось, что это не такая простая задача. Нам не нравился материал для изделий: в основном, предлагали либо тонкую пленку, либо очень жесткую ткань, образовывающую заломы.


Несколько недель мы ходили в торговые центры и искали образцы, которые понравились бы всей команде. В итоге купили дождевик в масс-маркете, который устроил по фасону и материалу, а подходящую ткань заказали в Корее.

С ней пришли на производство, где нам изготовили лекала под найденный дождевик, отшили пару образцов, которые мы кастомизировали под себя: к примеру, добавили карманы для удобства, а производство меняло лекала и вновь готовило нам образцы.

На что обратить внимание, если вы решили сделать брендированную верхнюю одежду:


  • Насколько ткань устойчива к влаге,
  • Насколько прочная ткань. Желательно устроить краш-тест: мять, тянуть, поливать водой и примерять на сотрудников,
  • Как смотрятся принты на ткани и как они ведут себя после стирки.




Для тестирования размеров мерча мы подобрали две типовые фигуры среди сотрудников. Так у лекал появились названия Женя и Полина. А Кристина была экстремальным пользователем, тестирующим пригодность размеров для миниатюрных фигур.

Для вещи с нуля запасайтесь примерно двумя месяцами:


  • 57 дней делают лекало и образец,
  • 34 дня доставка и тестирование образца,
  • 30 дней запуск в производство,
  • 14 дней пошив изделия.

Носки


Носки сделали в коллаборации с backend-разработчиками. Коллекция Redmadrobot X Back-end, включает изделия для выходных и праздников плюс входные носки для рабочих дней. Казалось, что носки достаточно популярный товар, поэтому с ним проблем быть не должно.


Но мы прошли Москву, МО, Питер, Нижний Новгород, сделали несколько тестовых образцов (стоимость одного от 1500 до 2500 рублей), и везде качество было не на высоте. Спасли Новосибирск и производство Stereo Socks.

На что обратить внимание при производстве трикотажа


  • Качество материала: ткань должна быть приятной к телу,
  • Качество резинки, особенно для спортивных моделей (чтобы не жало),
  • Как смотрятся вышивка и лого при растяжении: чтобы не было излишнего искажения изображения,
  • Насколько аккуратно выполнен внутренний шов,
  • Допустимые размеры шрифта для нанесения: нам пришлось сократить текст, чтобы он был читабелен.



Скотч


Скотч быстрый способ брендировать любую вещь. Кроме того, срок производства и цена радуют его можно сделать за одну-две недели. У нас получилась себестоимость в партии 216 рублей широкий и 360 рублей узкий. Вся партия составила 27 159 рублей.

Что ещё интересного


Не все вещи доставались нам через такие приключения, как скотч и дождевик. Например, значки сделать достаточно легко, они просто отливаются в фиксированной форме. Хорошие металлические значки сделали в питерском Pinhead.



Или самый популярный товар в магазине зарядка. Основа готовая модель. Мы выбрали Xiaomi качественные пауэрбанки, на которые можно делать нанесение (это возможно не на всех моделях), и они подходят для большинства телефонов. Примерка макета, не финальное нанесение:

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



Все макеты обязательно распечатывали и примеряли. Если размеры мерча варьировались (как, например, у толстовок), то дизайнер выбирал тот размер этикеток, который одинаково хорошо смотрелся бы и на маленькой, и на большой толстовке. Всё потому, что производить этикетки разного размера стоило бы дополнительных денег.

Чтобы сделать свитшоты, пришлось изменить дизайн шрифта. Мелкий текст постоянно просили увеличить, потому что вышить его было проблематично.

Техника жаккардовой вышивки, которую мы изначально планировали, требовала увеличить текст до 2 мм. Кажется, что это немного, но увеличивая пропорционально весь макет, получалось, что нашивка становится гигантской и непохожей на этикетку. К тому же, остальные предметы уже были произведены в нужном размере, концепцию менять было нельзя. Мы нашли подрядчика, у которого уже был опыт качественной печати небольших технических текстов. Дальше нужно было выбрать подходящую ткань.


Материал для нашивок важен, так как от него зависит качество печати. Заказывали в ГалаПолиграфе

Когда мы увидели палитры с образцами, оказалось, что вариантов у нас значительно меньше, чем мы думали. Ткань должна была удовлетворять как дизайнерским, так и техническим требованиям. В числе дизайнерских пожеланий были: нужный оттенок белого, тип плетения, материал, плотность.

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

Наконец, мы нашли единственный образец ленты, ширина которой была близка к нашим макетам и удовлетворяла всем дизайнерским требованиям. Так что нам оставалось в очередной раз (примерно 10-й по счету), но уже последний, подогнать макеты под нужный размер.

Факап с бутылкой для воды и что мы ещё не сделали


В запасе много идей, которые бы хотелось реализовать, но пока никак не можем найти образцы, которые нравились бы абсолютно. Например, не теряем надежду сделать маски для сна и белые обложки на паспорт.

Маски для сна, которые мы придумали, нетиповые, а новые лекала никто не запускает в производство небольшим тиражом (от 30 до 100 штук). Удивительно, но мы также не нашли белую обложку на паспорт, которая была бы хорошего качества приятная на ощупь и не жесткая.

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

Опечатка, отправившаяся в производство


Когда заказывали бутылку для воды, допустили ошибку в слове Гидравлического. Бутылки хотели подарить на летнем корпоративе, так что переделывать не было времени. Да и заметили опечатку мы не сразу. В следующей партии скорректируем.


Если очень присмотреться, то можно заметить

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

Восемь советов, как выпустить хороший мерч


Мерч и магазин мерча полноценный проект, с командой, менеджментом, бюджетом, KPI и целью.

  • В основе всего идея. Придумайте крепкую коммуникационную идею, которую можно масштабировать под разные товары.Тогда у вас будут не просто брендированные вещи, а целая история. Продумайте, как мерч работает с культурным кодом компании и какие ценности несет.
  • Мерч для сотрудников. Привлекайте коллег из разных отделов к работе над проектом. Например, ребята из разработки придумывали с нами носки. И на съемку мы пригласили наших сотрудников, потому что они и есть носители продукции.
  • Принцип 80/20. Основная работа подготовка. Сядьте, представьте вашу цель, напишите план, потом делайте. Не бойтесь перед пошивом десять раз примерить к одежде распечатанные лекала, чтобы убедиться что всё на своем месте.
  • Точно распределите роли, кто и что делает. Работа над магазином проект, и четкий менеджмент важен. Группа собирается не просто повеселиться: у нее есть дедлайны и задачи.
  • Хороший поставщик половина успеха. Если не нашли поставщика в своем городе, смотрите другие регионы. В большинстве случаев стоимость регионального производства ниже, и доставка себя окупает.
  • Правило семь раз отмерь, один раз отрежь применяется не только к пошиву, но и к формулировкам ТЗ. Производственные лекала достаточно дорогие, например, лекало дождевика стоило семь тысяч, поэтому комментарии к образцам нужно давать подробные, и когда вся команда их обсудила и уверена в своих пожеланиях. Пишите техническое задание для производства (вплоть до мелочей), но будьте готовы к диалогу с исполнителями: иногда они лучше тебя знают, как правильно сделать.
  • Делайте тестовые образцы. Мы переделывали вещи по три-четыре раза и это нормально. Тестируйте ткань и нанесение. Не стесняйтесь устраивать краш-тесты образцам: стирайте, гладьте, рвите и т. д. Если не нравятся образцы, ищите качественные вещи в продаже и потом показывайте их в качестве образца производству. А также обязательно примеряйте мерч на людях с разным ростом, разными типами фигур и даже с разными привычками (например, кто-то носит сумку через плечо, а кто-то на поясе).


И последний совет запаситесь пространством для хранения

Контакты производств



А у вас есть мерч? Как он выглядит? Если нет, то планируете?
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru