tag:blogger.com,1999:blog-59707354149505632372024-03-19T15:18:51.168+03:00Иван МаркеевПодводные грабли web, django, python.Ivan Markeevhttp://www.blogger.com/profile/16169121425536203686noreply@blogger.comBlogger486125tag:blogger.com,1999:blog-5970735414950563237.post-52042791069742132202023-07-07T18:30:00.004+03:002023-07-07T18:30:29.852+03:00Перевод руководства Lyft по написанию тех спек<p>Это перевд статьи <span style="color: #343541; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Ubuntu, Cantarell, "Noto Sans", sans-serif, "Helvetica Neue", Arial, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: 16px; white-space-collapse: preserve;"><a href="https://eng.lyft.com/awesome-tech-specs-86eea8e45bb9">https://eng.lyft.com/awesome-tech-specs-86eea8e45bb9</a>.</span></p><h3 style="text-align: left;">Рассмотрим следующие кошмарные сценарии. </h3><p>Вы собираетесь запустить новую функцию, над которой ваша команда работала несколько недель. Когда вы пытаетесь проверить ее на стадии стейджинга, ничего не работает так, как ожидалось. После изучения проблемы вы обнаруживаете, что ваша функция зависит от сервиса, который другая команда недавно упразднила.</p><p>Пытаясь интегрировать клиентскую и серверную работу для новой функции в вашем приложении, вы обнаруживаете, что инженер-клиент работал на основе устаревшей технической спецификации, что обесценивает недели его работы.</p><p>После объявления о том, что ваша команда работает над новой функцией, вы получаете множество запросов на расширение области проекта. Загруженный новыми требованиями, вы начинаете сомневаться, будет ли функция когда-либо внедрена в производство.</p><p>Что общего у этих кошмарных сценариев? Каждый из них мог бы быть предотвращен благодаря потрясающей технической спецификации: документу, обычно написанному инженером, который описывает, как будет работать функция, проект или сервис с технической точки зрения.</p><p>Сама идея технической спецификации может казаться противоречащей этике Кремниевой долины. Двигайтесь быстро - ломайте вещи - быстро итерируйте - будьте исполнителем. Зачем тратить время на написание, распространение и обновление технической спецификации, когда это время можно было бы потратить на ее реальное создание?</p><p>Но технические спецификации имеют больше пользы, чем осознают большинство инженеров. Обдуманная, хорошо написанная техническая спецификация открывает множество преимуществ, таких как:</p><h4 style="text-align: left;">(Почти) Безбаговые релизы</h4><p>Тщательная техническая спецификация раскрывает широкие идеи (и часто детали низкоуровневой реализации, такие как имена конечных точек и коды ошибок) для широкой аудитории, максимизируя вероятность того, что баг или регрессия будут обнаружены раньше, а не позже. Всегда есть неожиданные баги, но хорошая техническая спецификация может устранить большинство из них, привлекая множество глаз к вашему предложению.</p><h4 style="text-align: left;">Документация</h4><p>Ваша техническая спецификация служит документацией как во время реализации функции, так и после запуска функции. Во время реализации функции она указывает, какая именно работа должна быть выполнена. После запуска она помогает неподготовленным инженерам быстро разобраться во внутреннем устройстве функции и вовлеченных компромиссах.</p><p>Конечно, документация полезна только тогда, когда она доступна. В Lyft есть коллекция технических спецификаций, которые любой инженер может просмотреть и к которым может внести свой вклад, организованных в рамках рассылки. Многие инженеры используют ее для получения обратной связи, повышения осведомленности о новых проектах и сотрудничества между командами. Другие используют коллекцию для лучшего понимания существующих функций и сервисов. Ее высокая видимость и прозрачность позволяют даже самым младшим инженерам строить с уверенностью.</p><h4 style="text-align: left;">Быстрая итерация</h4><p>Достижение консенсуса по дизайну и реализации функции на стадии технической спецификации означает меньше споров в дальнейшем - это бесценно, когда вы находитесь под давлением, пытаясь запустить функцию. После запуска техническая спецификация служит ценным справочником, где заинтересованные стороны могут быстро найти точную информацию - например, почему были приняты определенные решения по реализации, какова область проекта и как он интегрируется с другими платформами и сервисами.</p><p>Прочитав это руководство, вы будете готовы создавать полностью разработанные технические спецификации, которые поднимут ваши функции и команду на новый уровень. Вы поблагодарите нас позже!</p><h3 style="text-align: left;">Прежде чем вы начнете писать - дайте вашей технической спецификации цель</h3><p>Принцип Парето - что только 20% ввода обычно приводят к 80% вывода - количественно определяет то, что большинство людей интуитивно понимают: некоторые виды использования времени более эффективны, чем другие. То же правило применимо к написанию технических спецификаций. Рациональное использование вашего времени и усилий принесет вам большие дивиденды позже. Хорошо продуманная техническая спецификация - это инструмент, который работает от вашего имени, облегчая вашу работу и делая вашу функцию лучше. У него есть цель - например, улучшение внутрикомандной коммуникации или прогнозирование и решение проблем заинтересованных сторон. Техническая спецификация без цели? Это пустая трата времени.</p><p>Чтобы максимизировать пользу от вашей технической спецификации, определите ее цель, прежде чем начинать писать. Спросите себя: "Чего я хочу достичь с помощью этой технической спецификации?" Принятие этого решения заранее упрощает процесс написания и гарантирует, что спецификация будет полезна для ее читателей (и, следовательно, для вас). Ваш ответ будет основой вашей технической спецификации, определяя такие атрибуты, как технические детали. Эта сетка представляет несколько общих целей для технических спецификаций и то, как эти цели отражаются в окончательной технической спецификации:</p><p>По мере изменения вашего проекта и цели, ваша спецификация тоже будет меняться. Ранние стадии проекта могут потребовать высокоуровневой спецификации, предназначенной для получения поддержки заинтересованных сторон. После того, как поддержка получена, вы можете преобразовать вашу спецификацию в документ более низкого уровня, который описывает всю инженерную работу, необходимую для завершения проекта, включая конкретные API, ошибки и аналитику.</p><h3 style="text-align: left;">Написание технической спецификации - ключевые разделы</h3><p>Хотя каждая техническая спецификация выглядит по-разному, начиная с шаблона, вы можете использовать известные передовые практики. Здесь мы представим свободный шаблон для технических спецификаций, проходя через спецификацию для гипотетического проекта под названием Spot the Bot - Twitter-бот, который будет твитить милые картинки щенков.</p><p>Если это применимо - например, для работы с фронтендом или клиентом - добавьте основной макет или скриншот в верхнюю часть документа, чтобы читатели могли получить интуитивное, визуальное представление о проекте.</p><h4 style="text-align: left;">Резюме</h4><p>Это абстрактная часть вашей технической спецификации: кто/что/когда/где/почему вашего всего предложения, сделанного кратким.</p><p></p><blockquote><p>Spot the bot - это твиттер-бот, который твитит картинки собак на предопределенных хронологических интервалах. Изображения собак получаются с помощью GET-запроса к Dog API.</p><p></p></blockquote><h4 style="text-align: left;">Контекст</h4><p>Контекстуализируйте свой проект: зачем его строить? Какова мотивация? Какие пользовательские проблемы вы пытаетесь решить? Какие предыдущие попытки, если таковые были, были предприняты для решения этой проблемы?</p><p></p><blockquote><p>Мы стремимся расширить наш бренд в сегменте миллениалов. Spot the Bot будет ориентирован на аудиторию миллениалов, предоставляя мгновенный доступ к высококачественным, кураторски отобранным картинкам собак. Мы отличимся от конкурентов, предлагая картинки более высокого качества.</p><p></p></blockquote><h4 style="text-align: left;">Цели</h4><p>Выделите все результаты, которые, по вашем мнению, должны быть достигнуты в результате успешного выполнения проекта. Это могут быть как качественные, так и количественные цели.</p><p></p><blockquote><p>1. Увеличить нашу аудиторию в Twitter на 20% в течение следующих трех месяцев.</p><p>2. Получить 500 ретвитов на каждый твит в течение первого месяца.</p><p>3. Получить положительные отзывы от пользователей о качестве изображений.</p><p></p></blockquote><h4 style="text-align: left;">Нефункциональные требования</h4><p>Нефункциональные требования - это ограничения, которые накладываются на вашу систему или ожидания, которые у вас есть от вашей системы, но которые не относятся к функциональности. Это может включать в себя ожидания относительно производительности, безопасности, доступности, локализации и т.д.</p><p></p><blockquote><p>1. Spot the Bot должен быть доступен 99,99% времени.</p><p>2. Spot the Bot должен поддерживать минимум 500 запросов в минуту.</p><p>3. Spot the Bot должен поддерживать английский, испанский, французский и немецкий языки.</p><p></p></blockquote><h4 style="text-align: left;">Обзор дизайна</h4><p>В этом разделе вы должны представить общий обзор того, как будет работать ваша система. Это должно быть высокоуровневым описанием, которое включает в себя все основные компоненты системы и то, как они взаимодействуют друг с другом.</p><blockquote><p>Spot the Bot будет работать на основе сервера, который будет делать GET-запросы к Dog API каждые 30 минут. Каждый запрос вернет изображение собаки, которое затем будет твитнуто на нашем аккаунте в Twitter.</p></blockquote><h4 style="text-align: left;">Детали дизайна</h4><p>В этом разделе вы должны войти в детали о том, как будет работать ваша система. Это должно включать в себя все детали, которые важны для понимания того, как система будет работать, включая, но не ограничиваясь, информацией о том, какие API будут использоваться, какие данные будут храниться, какие алгоритмы будут использоваться, и т.д.</p><p></p><blockquote><p>1. Сервер будет написан на Python и будет использовать библиотеку Tweepy для взаимодействия с Twitter API.</p><p>2. Сервер будет делать GET-запросы к Dog API с использованием библиотеки requests.</p><p>3. Сервер будет запущен на AWS и будет использовать DynamoDB для хранения информации о каждом твите, чтобы избежать повторения изображений.</p><p></p></blockquote><h4 style="text-align: left;">Тестирование</h4><p>Опишите, как вы планируете тестировать вашу систему, чтобы убедиться, что она работает правильно. Это должно включать в себя информацию о том, какие типы тестирования вы планируете использовать (например, модульное тестирование, интеграционное тестирование, нагрузочное тестирование), а также о том, какие сценарии вы планируете тестировать.</p><p></p><blockquote><p>1. Мы напишем модульные тесты для каждой функции нашего сервера, используя библиотеку unittest.</p><p>2. Мы напишем интеграционные тесты, чтобы убедиться, что наш сервер правильно взаимодействует с Twitter API и Dog API.</p><p>3. Мы проведем нагрузочное тестирование, чтобы убедиться, что наш сервер может обрабатывать ожидаемую нагрузку.</p></blockquote><p></p><h4 style="text-align: left;">Развертывание и мониторинг</h4><p>Опишите, как вы планируете развернуть вашу систему и как вы планируете ее мониторить после развертывания. Это должно включать в себя информацию о том, как вы планируете отслеживать ошибки, как вы планируете отслеживать производительность системы, как вы планируете обновлять систему и т.д.</p><p></p><blockquote><p>1. Мы будем использовать AWS CodeDeploy для развертывания нашего сервера.</p><p>2. Мы будем использовать AWS CloudWatch для мониторинга ошибок и производительности нашего сервера.</p><p>3. Мы будем использовать AWS CodePipeline для автоматического обновления нашего сервера при каждом изменении кода.</p></blockquote><p></p><h4 style="text-align: left;">Сроки и владелец</h4><p>Укажите, кто будет владельцем этого проекта и когда он будет завершен. Это поможет управлять ожиданиями и обеспечит ответственность.</p><p></p><blockquote><p>Владелец проекта: John Doe</p><p>Ожидаемая дата завершения: 1 июня 2023 года</p><p></p></blockquote><h3 style="text-align: left;">Вывод</h3><p>Технические спецификации - это мощный инструмент, который может улучшить вашу работу и работу вашей команды. Они могут помочь предотвратить баги, улучшить коммуникацию внутри команды, ускорить итерацию и служить ценной документацией. Но чтобы получить все эти преимущества, вы должны уделить время и усилия на написание хорошей технической спецификации. Надеемся, что это руководство поможет вам в этом процессе. Удачи!</p>Ivan Markeevhttp://www.blogger.com/profile/16169121425536203686noreply@blogger.com0tag:blogger.com,1999:blog-5970735414950563237.post-87554622783196514432023-07-07T12:33:00.003+03:002023-07-07T12:38:48.266+03:00Разбираемся с эстимациями: как они могут сделать вашу команду разработки непобедимой<p>В мире разработки программного обеспечения, где сроки и ресурсы часто ограничены, эффективная оценка задач становится критически важной. Это не просто вопрос о том, сколько времени потребуется на выполнение задачи, но и о том, как это время будет использовано, какие ресурсы будут задействованы, и как эти факторы влияют на общий проект.</p><p>Оценка задач в Agile разработке - это искусство, требующее понимания и опыта. Она включает в себя не только оценку времени, необходимого для выполнения задачи, но и учет сложности задачи, рисков, связанных с ней, и возможных препятствий на пути к ее выполнению.</p><p>Существует несколько методик оценки задач в Agile, каждая из которых имеет свои преимущества и недостатки. Некоторые из наиболее популярных методик включают в себя покер планирования, метод T-shirt sizes, и метод бакетов. </p><p>Покер планирования использует карточную систему для оценки сложности задач, в то время как метод T-shirt sizes использует размеры одежды (S, M, L, XL) для оценки сложности. Метод бакетов, с другой стороны, группирует задачи по их сложности.</p><p>В этой статье мы подробно рассмотрим каждую из этих методик, а также обсудим, как выбрать наиболее подходящую методику для вашей команды и проекта.</p><h3 style="text-align: left;">Покер планирования</h3><p>Покер планирования, также известный как Scrum покер, является одной из самых популярных методик оценки задач в Agile. Этот метод был разработан и популяризован в 2002 году Джеймсом Греннингом и с тех пор стал стандартом в индустрии.</p><h4 style="text-align: left;">Принцип работы</h4><p>Основная идея покера планирования заключается в использовании колоды карт для оценки сложности задач. Каждый участник команды получает колоду карт, где каждая карта представляет определенное количество "очков" сложности. Обычно используются последовательные числа в геометрической прогрессии, например, 0, 1, 2, 3, 5, 8, 13, 21, и так далее, что позволяет учесть неопределенность и риск в более сложных задачах.</p><p>Когда команда обсуждает задачу, каждый участник выбирает карту, которая, по его мнению, наиболее точно отражает сложность задачи. Все карты открываются одновременно, чтобы избежать влияния мнения одного участника на других. Если оценки сильно различаются, команда обсуждает различия в восприятии сложности и повторяет процесс, пока не будет достигнуто согласие.</p><h4 style="text-align: left;">Преимущества и недостатки</h4><p>Одним из основных преимуществ покера планирования является то, что он привлекает все команду к процессу оценки и позволяет учесть различные точки зрения. Это способствует лучшему пониманию задачи и увеличивает точность оценки.</p><p>Однако этот метод также имеет свои недостатки. Он может быть времязатратным, особенно если команда не может быстро прийти к соглашению. Кроме того, он может быть неэффективным для очень больших или очень маленьких задач, где сложность очевидна.</p><p>В целом, покер планирования - это мощный инструмент для оценки задач, который может быть очень полезен для команд, работающих по методологии Agile.</p><h3 style="text-align: left;">Метод T-Shirt Sizes</h3><p>Метод T-Shirt Sizes - это еще один популярный подход к оценке задач в Agile. Этот метод использует размеры одежды - S (Small), M (Medium), L (Large), и XL (Extra Large) - для оценки сложности задач.</p><h4 style="text-align: left;">Принцип работы</h4><p>Вместо использования числовых значений, как в покере планирования, метод T-Shirt Sizes использует размеры одежды для оценки сложности задач. Это делает его более абстрактным и менее формальным, что может быть полезно для команд, которые предпочитают более гибкий подход к оценке.</p><p>Как и в покере планирования, каждый член команды выбирает размер, который, по его мнению, наиболее точно отражает сложность задачи. Затем команда обсуждает выбор каждого участника и приходит к соглашению.</p><h4 style="text-align: left;">Преимущества и недостатки</h4><p>Одним из преимуществ метода T-Shirt Sizes является его простота и наглядность. Он легко понятен и не требует сложных расчетов или детального планирования.</p><p>Однако этот метод также имеет свои недостатки. Он менее точен, чем другие методы, и может быть сложно перевести размеры одежды в конкретные временные рамки. Кроме того, он может быть неэффективным для очень сложных или уникальных задач, которые не легко укладываются в стандартные размеры.</p><p>В целом, метод T-Shirt Sizes - это удобный и гибкий инструмент для оценки задач, который может быть особенно полезен для команд, которые предпочитают менее формальные и более гибкие подходы к планированию.</p><h3 style="text-align: left;">Метод бакетов</h3><p>Метод бакетов, также известный как метод бакетной сортировки, представляет собой еще один подход к оценке задач в Agile. Этот метод основан на группировке задач по их сложности.</p><h4 style="text-align: left;">Принцип работы</h4><p>В методе бакетов задачи сортируются по "бакетам" или категориям, каждая из которых представляет определенный уровень сложности. Эти бакеты могут быть маркированы числами, буквами, размерами одежды или любыми другими маркерами, которые имеют смысл для команды.</p><p>Каждый член команды затем независимо размещает задачи в бакеты, основываясь на своем понимании сложности каждой задачи. После того, как все задачи распределены, команда обсуждает размещение задач и приходит к соглашению.</p><h4 style="text-align: left;">Преимущества и недостатки</h4><p>Одним из преимуществ метода бакетов является то, что он позволяет команде быстро и интуитивно оценить большое количество задач. Это делает его особенно полезным для больших проектов или для команд, которые работают с большим количеством задач.</p><p>Однако этот метод также имеет свои недостатки. Он может быть менее точным, чем другие методы, и может быть сложно согласовать оценки между членами команды, особенно если у них разное понимание сложности задач.</p><p>В целом, метод бакетов - это эффективный инструмент для оценки задач, который может быть особенно полезен для команд, работающих с большим количеством задач или большими проектами.</p><h3 style="text-align: left;">Метод точных оценок</h3><p>Метод точных оценок - это еще один подход к оценке задач в Agile. Этот метод основан на прямой оценке времени, необходимого для выполнения задачи.</p><h4 style="text-align: left;">Принцип работы</h4><p>В методе точных оценок каждый член команды независимо оценивает, сколько времени потребуется на выполнение каждой задачи. Это может быть выражено в часах, днях или даже неделях, в зависимости от размера и сложности задачи.</p><p>После того, как все оценки собраны, команда обсуждает их и приходит к соглашению. Это может включать в себя обсуждение различий в оценках и корректировку оценок, если это необходимо.</p><h4 style="text-align: left;">Преимущества и недостатки</h4><p>Одним из преимуществ метода точных оценок является его простота и прямолинейность. Он не требует сложных систем оценки или абстрактных маркеров, что делает его легко понятным и доступным для всех членов команды.</p><p>Однако этот метод также имеет свои недостатки. Он может быть менее точным, чем другие методы, особенно для больших или сложных задач. Кроме того, он может быть подвержен проблемам, связанным с недооценкой или переоценкой задач, особенно если члены команды не имеют достаточного опыта или понимания задачи.</p><p>В целом, метод точных оценок - это простой и прямой инструмент для оценки задач, который может быть особенно полезен для команд, которые предпочитают прямой и простой подход к оценке.</p><h3 style="text-align: left;">Метод аналоговых оценок</h3><p>Метод аналоговых оценок - это подход, используемый в Agile, который основан на сравнении новых задач с похожими задачами, которые команда уже реализовывала в прошлом.</p><h4 style="text-align: left;">Принцип работы</h4><p>В методе аналоговых оценок команда смотрит на новую задачу и пытается найти похожую задачу, которую они уже выполнили. Они затем используют эту "аналоговую" задачу как основу для оценки новой задачи. Если новая задача кажется сложнее, они увеличивают оценку, если она кажется проще - уменьшают.</p><h4 style="text-align: left;">Преимущества и недостатки</h4><p>Одним из преимуществ метода аналоговых оценок является то, что он использует реальные данные из прошлого, что может улучшить точность оценок. Он также может помочь командам лучше понять и анализировать свою производительность и процессы.</p><p>Однако этот метод также имеет свои недостатки. Он зависит от наличия подходящих "аналоговых" задач, и может быть неэффективным, если команда столкнулась с новым типом задачи или технологией. Кроме того, он может быть подвержен проблемам, связанным с переоценкой или недооценкой задач, особенно если аналоговые задачи были неправильно оценены.</p><p>В целом, метод аналоговых оценок - это полезный инструмент для оценки задач, который может быть особенно полезен для команд, которые имеют большой опыт работы и много данных о прошлых проектах.</p><h3 style="text-align: left;">Метод Affinity Estimation</h3><p>Метод Affinity Estimation - это еще один подход к оценке задач в Agile, который особенно полезен при работе с большими объемами задач.</p><h4 style="text-align: left;">Принцип работы</h4><p>В методе Affinity Estimation все задачи или истории пользователей размещаются на стене или на большом столе. Затем команда работает вместе, чтобы "отсортировать" задачи по сложности. Задачи, которые кажутся более сложными, перемещаются в одну сторону, а задачи, которые кажутся менее сложными, - в другую.</p><p>Этот процесс продолжается, пока все задачи не будут отсортированы по сложности. Затем команда может присвоить каждой группе задач числовую оценку или использовать другой метод оценки для определения сложности каждой группы.</p><h4 style="text-align: left;">Преимущества и недостатки</h4><p>Одним из преимуществ метода Affinity Estimation является то, что он позволяет команде быстро оценить большое количество задач. Это делает его особенно полезным для начального планирования или для проектов с большим количеством неизвестных.</p><p>Однако этот метод также имеет свои недостатки. Он может быть менее точным, чем другие методы, и может быть сложно согласовать оценки между членами команды. Кроме того, он может быть неэффективным для очень сложных или уникальных задач, которые не легко сравнить с другими задачами.</p><p>В целом, метод Affinity Estimation - это эффективный инструмент для оценки задач, который может быть особенно полезен для команд, работающих с большим количеством задач или большими проектами.</p><h3 style="text-align: left;">Метод Delphi</h3><p>Метод Delphi - это еще один подход к оценке задач в Agile, который основан на анонимных оценках и итеративном процессе для достижения консенсуса.</p><h4 style="text-align: left;">Принцип работы</h4><p>В методе Delphi каждый член команды независимо и анонимно оценивает каждую задачу. Затем эти оценки собираются и анализируются, обычно с использованием среднего значения или медианы.</p><p>Если оценки сильно различаются, команда обсуждает задачу и затем повторяет процесс оценки. Этот процесс повторяется до тех пор, пока не будет достигнуто согласие или пока не будет достигнута достаточная степень согласия.</p><h4 style="text-align: left;">Преимущества и недостатки</h4><p>Одним из преимуществ метода Delphi является то, что он позволяет учесть мнение каждого члена команды и может помочь избежать проблемы "громкого меньшинства", когда мнение одного или нескольких членов команды доминирует над остальными.</p><p>Однако этот метод также имеет свои недостатки. Он может быть времязатратным, особенно если требуется много итераций для достижения согласия. Кроме того, он может быть сложным для управления и требует строгого следования процессу.</p><p>В целом, метод Delphi - это мощный инструмент для оценки задач, который может быть особенно полезен для команд, которые ценят демократический подход и стремятся к справедливому учету мнений всех членов команды.</p><h3 style="text-align: left;">Покер планирования: Подробная инструкция</h3><p>Покер планирования - это популярный метод оценки задач в Agile, который помогает командам достичь консенсуса относительно сложности и времени выполнения задач. Вот подробная инструкция о том, как провести сессию покер планирования:</p><h4 style="text-align: left;">Шаг 1: Подготовка</h4><p>Перед началом сессии покер планирования убедитесь, что у каждого участника есть колода карт покер планирования. Эти карты обычно представляют собой набор чисел, который используется для оценки сложности задачи. Обычно используются числа Фибоначчи (1, 2, 3, 5, 8, 13, 21 и т.д.), поскольку они отражают неопределенность и риск в более сложных задачах.</p><h4 style="text-align: left;">Шаг 2: Обсуждение задачи</h4><p>Выберите задачу для оценки и обсудите ее с командой. Важно, чтобы все члены команды понимали задачу и ее требования. Обсуждение должно включать в себя описание задачи, ее цели и любые потенциальные проблемы или препятствия.</p><h4 style="text-align: left;">Шаг 3: Оценка</h4><p>После обсуждения каждый участник команды выбирает карту из своей колоды, которая, по его мнению, наиболее точно отражает сложность задачи. Важно, чтобы все участники выбрали свои карты независимо и не обсуждали свой выбор до того, как все карты будут открыты.</p><h4 style="text-align: left;">Шаг 4: Показ карт</h4><p>Когда все участники выбрали свои карты, они одновременно показывают их. Это помогает избежать влияния мнения одного участника на других.</p><h4 style="text-align: left;">Шаг 5: Обсуждение</h4><p>Если оценки сильно различаются, команда обсуждает различия в восприятии сложности. Это может включать в себя дополнительное обсуждение задачи, ее требований или потенциальных проблем.</p><h4 style="text-align: left;">Шаг 6: Повторная оценка</h4><p>После обсуждения команда повторяет процесс оценки (шаги 3-5), пока не будет достигнуто согласие. Согласие означает, что все участники команды согласны с оценкой сложности задачи.</p><h4 style="text-align: left;">Шаг 7: Запись оценки</h4><p>Когда согласие достигнуто, оценка записывается и используется для планирования и отслеживания работы.</p><p>Помните, что цель покер планирования - не достичь "правильной" оценки, а помочь команде достичь общего понимания задачи и ее сложности.</p><p><br /></p><table style="--tw-border-spacing-x: 0px; --tw-border-spacing-y: 0px; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: #f7f7f8; border-color: inherit; border-image: initial; border-spacing: var(--tw-border-spacing-x) var(--tw-border-spacing-y); border-style: solid; border-width: 0px; color: #374151; font-family: Söhne, ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Ubuntu, Cantarell, "Noto Sans", sans-serif, "Helvetica Neue", Arial, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: 0.875em; line-height: 1.71429; margin-bottom: 0px; margin-top: 0px; table-layout: auto; text-indent: 0px; white-space-collapse: preserve; width: 100%;"><thead style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-th-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;"><tr style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box;"><th style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: rgba(236, 236, 241, 0.2); border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-top-left-radius: 0.375rem; border-width: 1px 0px 1px 1px; box-sizing: border-box; color: var(--tw-prose-headings); padding: 0.25rem 0.75rem; vertical-align: bottom;">Метод</th><th style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: rgba(236, 236, 241, 0.2); border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 1px 0px 1px 1px; box-sizing: border-box; color: var(--tw-prose-headings); padding: 0.25rem 0.75rem; vertical-align: bottom;">Преимущества</th><th style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: rgba(236, 236, 241, 0.2); border-top-right-radius: 0.375rem; border: 1px solid rgb(217, 217, 227); box-sizing: border-box; color: var(--tw-prose-headings); padding: 0.25rem 0.75rem; vertical-align: bottom;">Недостатки</th></tr></thead><tbody style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border: 0px solid rgb(217, 217, 227); box-sizing: border-box;"><tr style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;"><td style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;">Покер планирования</td><td style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;">Позволяет достичь консенсуса, учитывает мнение каждого участника команды</td><td style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;">Может быть времязатратным, требует активного участия всех членов команды</td></tr><tr style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;"><td style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;">T-Shirt Sizes</td><td style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;">Простота и наглядность, не требует сложных расчетов</td><td style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;">Менее точен, сложно перевести в конкретные временные рамки</td></tr><tr style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;"><td style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;">Метод бакетов</td><td style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;">Позволяет быстро оценить большое количество задач, полезен для больших проектов</td><td style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;">Менее точен, может быть сложно согласовать оценки между членами команды</td></tr><tr style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;"><td style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;">Точные оценки</td><td style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;">Простота и прямолинейность, не требует сложных систем оценки</td><td style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;">Может быть менее точным для больших или сложных задач, подвержен проблемам с недооценкой или переоценкой</td></tr><tr style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;"><td style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;">Аналоговые оценки</td><td style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;">Использует реальные данные из прошлого, помогает командам лучше понять и анализировать свою производительность</td><td style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;">Зависит от наличия подходящих "аналоговых" задач, может быть неэффективным для новых типов задач</td></tr><tr style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px 0px 1px; box-sizing: border-box;"><td style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;">Affinity Estimation</td><td style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;">Позволяет быстро оценить большое количество задач, полезен для больших проектов</td><td style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;">Менее точен, может быть сложно согласовать оценки между членами команды</td></tr><tr style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-color: var(--tw-prose-td-borders); border-image: initial; border-left-color: rgb(217, 217, 227); border-right-color: rgb(217, 217, 227); border-style: solid; border-top-color: rgb(217, 217, 227); border-width: 0px; box-sizing: border-box;"><td style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-left-radius: 0.375rem; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;">Метод Delphi</td><td style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;">Позволяет учесть мнение каждого члена команды, избегает проблемы "громкого меньшинства"</td><td style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgba(69,89,164,.5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 transparent; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 transparent; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 transparent; --tw-shadow: 0 0 transparent; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-bottom-right-radius: 0.375rem; border-color: rgb(217, 217, 227); border-image: initial; border-style: solid; border-width: 0px 1px 1px; box-sizing: border-box; padding: 0.25rem 0.75rem; vertical-align: baseline;">Может быть времязатратным, требует строгого следования процессу</td></tr></tbody></table>Ivan Markeevhttp://www.blogger.com/profile/16169121425536203686noreply@blogger.com0tag:blogger.com,1999:blog-5970735414950563237.post-66915869033222502532023-07-06T15:09:00.001+03:002023-07-06T15:09:00.142+03:007 характеристик эффективного ревью кода<p>Проверка кода (ревью кода), иногда называемая коллегиальной проверкой, включает в себя систематическое изучение исходного кода коллегой-программистом. В прошлый раз я предложил свою точку зрения на <a href="https://blog.markeyev.ru/2023/07/blog-post.html" target="_blank">важность Code Review</a>. Но каковы основные характеристики эффективного код-ревью?</p><h3 style="text-align: left;">Полнота</h3><p>Эффективный процесс проверки кода гарантирует, что ни одна часть кода не будет проигнорирована или упущена из виду. Он охватывает все аспекты кодовой базы, включая логику, дизайн и структуру. Это гарантирует, что ошибки, недостатки дизайна или несоответствия будут обнаружены на ранних этапах цикла разработки, что предотвратит их распространение в конечном продукте.</p><h3 style="text-align: left;">Своевременность</h3><p>Оперативная обратная связь имеет решающее значение в код-ревью. Задержки могут нарушить рабочий процесс разработки и привести к смещению сроков проекта. Таким образом, эффективный процесс проверки кода гарантирует, что проверки проводятся своевременно, а действенная обратная связь предоставляется быстро.</p><h3 style="text-align: left;">Конструктивная реакция</h3><p>Цель ревью кода — не критиковать или находить ошибки, а совместно улучшать кодовую базу. Обратная связь должна быть конструктивной, четко сформулированной и ориентированной на решение. Это способствует созданию позитивной рабочей атмосферы и побуждает разработчиков рассматривать процесс рецензирования как возможность для обучения и совершенствования, а не как критику своей работы.</p><h3 style="text-align: left;">Инклюзивность</h3><p>В эффективном процессе проверки кода участвуют все члены команды разработчиков. Это обеспечивает более широкое понимание кодовой базы, способствует совместному владению кодом и способствует развитию культуры сотрудничества и обучения.</p><h3 style="text-align: left;">Регулярность</h3><p>Проверка кода не должна быть разовой или редкой деятельностью. Регулярные проверки кода могут помочь выявить проблемы на ранней стадии и закрепить лучшие практики в команде. Он сохраняет кодовую базу чистой, поддерживаемой и согласованной.</p><h3 style="text-align: left;">Сосредоточьтесь на общей картине</h3><p>Хотя важно убедиться, что код не содержит ошибок и оптимизирован, эффективные проверки кода также фокусируются на более крупных проблемах, таких как архитектура, шаблоны проектирования и потенциальные уязвимости безопасности. Хороший процесс проверки кода учитывает не только непосредственную задачу, но и то, как изменения вписываются в общий проект или систему.</p><h3 style="text-align: left;">Использование инструментов</h3><p>В эффективных проверках кода используются доступные инструменты и технологии, облегчающие процесс, такие как системы контроля версий, инструменты автоматизированного тестирования и платформы проверки кода. Эти инструменты помогают оптимизировать процесс, вести учет изменений и комментариев и, в конечном счете, сделать процесс рецензирования более эффективным и действенным.</p><p>Таким образом, эффективный процесс проверки кода должен быть всеобъемлющим, своевременным, регулярным и всеобъемлющим. Он делает упор на конструктивную обратную связь, рассматривает более широкую картину и использует соответствующие инструменты, чтобы помочь процессу. Благодаря такому процессу команды могут поддерживать высокое качество кода, способствовать непрерывному обучению и обеспечивать успешное выполнение своих проектов.</p>Ivan Markeevhttp://www.blogger.com/profile/16169121425536203686noreply@blogger.com0tag:blogger.com,1999:blog-5970735414950563237.post-84228364179628122252023-07-05T14:57:00.005+03:002023-07-05T14:57:29.246+03:00Ключевая роль ревью кода в создании программного обеспечения<p>В динамичном, быстро развивающемся мире инженерии программного обеспечения, эффективность, качество и сотрудничество являются основой каждого успешного проекта. Одной из практик, которая приобрела огромную популярность и признание в облегчении этих характеристик, является код ревью. Ревью кода включает в себя систематический анализ исходного кода другим программистом. Но почему эта практика так важна для процесса разработки программного обеспечения? Давайте разберемся в этом вопросе.<br /></p><h3 style="text-align: left;">Обеспечение качества кода</h3><p></p><p>Главная причина проведения ревью кода - улучшение качества кода. Даже самые опытные разработчики иногда могут упустить ошибки или более эффективные способы реализации определенной функциональности. Свежий взгляд дает возможность обнаружить эти недочеты до того, как они станут частью окончательного кода. Эта проверка способствует созданию надежного, чистого и эффективного кода, минимизируя вероятность ошибок, которые могут появиться позже в жизненном цикле программного обеспечения.</p><h3 style="text-align: left;">Способствование сотрудничеству и обучению</h3><p>Ревью кода способствует созданию атмосферы обмена знаниями и сотрудничества в команде. Это платформа для обмена опытом и навыками между разработчиками. Начинающие разработчики имеют возможность узнать и освоить лучшие практики, используемые их более опытными коллегами, в то время как последние могут извлечь пользу из новых идей или подходов, предлагаемых первыми. Этот итерационный и интерактивный процесс ускоряет рост навыков, укрепляет сплоченность команды и, в конечном итоге, повышает общую эффективность команды разработки программного обеспечения.</p><h3 style="text-align: left;">Поддержание консистентности</h3><p>Консистентность кода - это значительный фактор, который часто пренебрегают, но его важность нельзя недооценивать. Консистентность кода связана с использованием одних и тех же соглашений об именовании, структуре кода и стандартах кодирования по всей кодовой базе. Консистентный код проще читать, понимать и поддерживать. Ревью кода обеспечивает консистентность, приводя подход всей команды к стандартам кодирования, стилистическим руководствам и архитектурному дизайну к единому знаменателю, что делает будущее обслуживание менее сложной задачей.</p><h3 style="text-align: left;">Распространение знания</h3><p>Когда разработчики постоянно проверяют код друг друга, они знакомятся не только с той частью, над которой работают, но и с другими областями кодовой базы. Это широкое понимание позволяет членам команды развить более целостный взгляд на проект, лучше понять, как взаимодействуют различные компоненты, и вмешаться, если кто-то из коллег недоступен или нуждается в помощи.</p><h3 style="text-align: left;">Снижение рисков</h3><p>Чем раньше найдена ошибка, тем дешевле ее исправление. Ревью - это эффективный способ обнаружения потенциальных проблем на ранней стадии разработки, предотвращающий их проникновение в окончательный релиз и причинение вреда. Они также помогают соблюдать регулятивные нормы, руководства по безопасности и предотвратить возможное включение вредоносного или небезопасного кода, тем самым снижая риск, связанный с разработкой программного обеспечения.</p><h3 style="text-align: left;">Содействие владению кодом</h3><p>Code ownership - это концепция, когда отдельные разработчики или команды берут на себя ответственность за определенные части кодовой базы. Несмотря на то, что это полезно с точки зрения ответственности и компетентности, это может привести к формированию знаний в "бункере", или изолированных областей. Ревью кода разрушает эти "бункеры", гарантируя, что ни одна часть кодовой базы не "принадлежит" или не "понимается" только одним человеком. Это необходимо в таких ситуациях, как ротация команды или увольнение сотрудника.</p><p>В заключение, ревью кода - это больше, чем просто дополнительный шаг в процессе разработки программного обеспечения. Это бесценная практика, которая повышает качество программного обеспечения, улучшает работу команды и содействует культуре обучения. Она служит тонким ситом, которое отсеивает потенциальные проблемы, обеспечивая соответствие конечного продукта стандартам качества команды и организации. Несмотря на затраты времени и усилий, выгоды, полученные от всестороннего процесса ревью кода, с лихвой окупают вложения.</p>Ivan Markeevhttp://www.blogger.com/profile/16169121425536203686noreply@blogger.com0tag:blogger.com,1999:blog-5970735414950563237.post-63124371312032027562023-06-06T12:59:00.001+03:002023-06-06T12:59:00.150+03:00За что отвечает Machine Translation Engineer?<p>Ранее я <a href="https://blog.markeyev.ru/2018/12/data-analyst-vs-data-scientist-vs-data.html">писал ролях в ML</a>. Сегодня напишу о еще одной роли.</p><p>В разработке программного обеспечения существует множество разных ролей и специализаций по нескольким причинам:</p><p>1. Разделение обязанностей: Проекты по разработке программного обеспечения могут быть сложными и масштабными, требующими сотрудничества между большим числом людей. Разделение обязанностей на различные роли позволяет распределить работу и управлять проектом более эффективно.</p><p>2. Экспертиза и специализация: Каждая роль обычно требует определенных знаний, навыков и опыта. Разделение на разные роли позволяет людям развивать экспертизу и специализироваться в определенных областях, что способствует более высокому качеству и эффективности работы.</p><p>3. Работа в команде: Разные роли в разработке программного обеспечения часто взаимодействуют и сотрудничают друг с другом в рамках команды. Каждая роль вносит свой вклад и выполняет свои задачи, чтобы достичь общих целей проекта.</p><p>4. Широкий спектр задач: Разработка программного обеспечения включает в себя множество различных задач и аспектов, таких как проектирование, разработка, тестирование, управление проектом, анализ требований, интеграция и т. д. Разные роли позволяют эффективно управлять и выполнять все эти задачи.</p><p>Наличие разных ролей в разработке программного обеспечения способствует более эффективному и организованному процессу разработки, позволяет лучше использовать ресурсы и экспертизу команды, а также обеспечивает достижение высокого качества и успешную реализацию проекта.</p><p><b>Machine Translation Engineer (инженер машинного перевода)</b> - это специалист, который занимается разработкой, настройкой и поддержкой систем автоматического машинного перевода. Они работают с технологиями и алгоритмами, которые позволяют компьютерам переводить текст с одного языка на другой.</p><p>Роль Machine Translation Engineer включает следующие обязанности:</p><p>1. Разработка алгоритмов и моделей: Инженеры машинного перевода разрабатывают и оптимизируют алгоритмы и модели машинного перевода. Они исследуют различные подходы, используют статистические и нейронные методы, а также улучшают существующие модели для повышения качества перевода.</p><p>2. Техническая интеграция: Инженеры машинного перевода работают над интеграцией систем машинного перевода в различные платформы и приложения. Они создают API (Application Programming Interface) и разрабатывают программное обеспечение, которое позволяет другим системам использовать функции машинного перевода.</p><p>3. Оценка и улучшение качества перевода: Инженеры машинного перевода занимаются оценкой качества перевода и разработкой метрик для измерения эффективности системы. Они анализируют результаты перевода, выявляют проблемы и предпринимают меры для улучшения качества перевода.</p><p>4. Обучение моделей: Инженеры машинного перевода участвуют в процессе обучения моделей машинного перевода. Они используют большие наборы данных, обучающие алгоритмы и модели, чтобы система могла "учиться" переводить тексты на различные языки.</p><p>5. Тестирование и отладка: Инженеры машинного перевода проводят тестирование системы машинного перевода и отлаживают ее, чтобы исправить ошибки и проблемы, которые могут возникать в процессе перевода текста.</p><p>Роль Machine Translation Engineer требует глубоких знаний в области компьютерной лингвистики, машинного обучения, статистики и алгоритмов. Они также должны быть знакомы с различными языками и культурами, чтобы понимать особенности перевода между ними.</p>Ivan Markeevhttp://www.blogger.com/profile/16169121425536203686noreply@blogger.com0tag:blogger.com,1999:blog-5970735414950563237.post-56432775354171612222023-06-05T19:00:00.002+03:002023-07-05T15:16:55.310+03:00Что такое Staff Software Engineer?<div>В связи с постоянным поступлением предложений о предоставлении программистов в штат компании через LinkedIn, я считаю важным объяснить смысл роли Staff Software Engineer.</div><div><br /></div><div>Роль Staff Software Engineer, или Ведущий Инженер-программист, обычно относится к позиции старшего уровня в команде разработчиков программного обеспечения. Эта роль отвечает за предоставление технического руководства и экспертизы, а также вклад в разработку и доставку программных продуктов или проектов. Хотя конкретные обязанности могут варьироваться в зависимости от организации и отрасли, вот несколько типичных ожиданий и отличий для роли Staff Software Engineer по сравнению с другими инженерными должностями.</div><h3 style="text-align: left;">Техническая экспертиза</h3><div>Ведущий Инженер-программист должен обладать глубоким пониманием и опытом в области технологий разработки программного обеспечения, фреймворков и лучших практик. Он часто обладает широким кругозором и может предоставлять руководство в различных технических областях, включая архитектуру, шаблоны проектирования, оптимизацию производительности, масштабируемость и безопасность.</div><div><br /></div><h3 style="text-align: left;">Лидерство и наставничество</h3><div>Ведущий Инженер-программист часто занимается руководством и наставничеством других членов инженерной команды. Он может отвечать за руководство и коучинг младших инженеров, проведение ревью кода и предоставление технической поддержки и руководства для обеспечения качества программного обеспечения.</div><div><br /></div><h3 style="text-align: left;">Принятие решений</h3><div>Staff Software Engineer участвует в принятии важных технических решений, которые могут повлиять на общую направленность и успех проекта. Он тесно сотрудничает с менеджерами продукта, дизайнерами и другими заинтересованными сторонами, чтобы понять требования, предложить технические решения и принять обоснованные решения, соответствующие целям проекта.</div><div><br /></div><div><h3 style="text-align: left;">Проектирование системы и архитектуры</h3>Ведущий Инженер-программист часто участвует в проектировании сложных программных систем. Он должен учитывать факторы, такие как масштабируемость, удобство сопровождения и производительность, и принимать проектировочные решения, соответствующие технической стратегии и долгосрочным целям организации.</div><div><br /></div><h3 style="text-align: left;">Сотрудничество и коммуникация</h3><div>Staff Software Engineer часто взаимодействует с командами, включая менеджеров продукта, дизайнеров и других инженеров. Он участвует в совещаниях, предоставляет технические исследования и общается эффективно, чтобы обеспечить согласованность всех участников в отношении целей и сроков проекта.</div><div><br /></div><h3 style="text-align: left;">Техническая инновация</h3><div>Ведущий Инженер-программист часто вносит вклад в техническую инновацию и улучшение практик разработки программного обеспечения внутри организации. Он может исследовать новые технологии, оценивать инструменты и фреймворки, а также предлагать инновационные решения для улучшения эффективности разработки или решения технических проблем.</div><div><br /></div><div>Важно отметить, что конкретные обязанности и ожидания от Staff Software Engineer могут варьироваться в различных организациях. Объем и уровень сеньорности роли могут отличаться в зависимости от размера компании, отрасли и организационной структуры.<br /></div>Ivan Markeevhttp://www.blogger.com/profile/16169121425536203686noreply@blogger.com0tag:blogger.com,1999:blog-5970735414950563237.post-50475216471025559282018-12-24T16:06:00.003+03:002018-12-24T16:06:37.269+03:00Data Analyst VS Data Scientist VS Data EngineerЭти 3 роли во много пересекаются и не всегда очевидно как они связаны с Machine Learning и чем отличаются друг от друга?<br /><div>
Итак, модели для машинного обучения довольно сложно строить без базового понимания принципов обработки и сэмплинга сырых и/или больших наборов данных. Большинство отличий между ролями в том, какую часть работы они выполняют для получения конечного результата. Результатом может быть не один найденный ответ на какой-то бизнес вопрос, но и процесс непрерывано обрабатывающий данные.</div>
<div>
<b>Data Analyst</b> - находит в данных новые ответы и смыслы, и доносит эти смыслы до бизнеса, визуализируя найденное (еще проще "делает правильные запросы к хранилищу данных" и "рисует графики").</div>
<div>
<b>Data Scientist</b> - анализирует данные и моделирует системы использую статические методы и машинное обучение. Этот "парень" умеет в <i>SQL</i>, <i>R</i>, <i>Python</i> (еще проще "умеет <i>machine learning</i>").</div>
<div>
<b>Data Engineer</b> - создает и поддерживает системы обработки данных больших и/или не структурированных данных. Это такой админ / devops, который умеет построить pipeline на правильных инструментах. Часто он делает возможной работу Data Analyst и Data Scientist, решая задачи по получению, обработке, очистке и нормализации, хранению данных, в виде пригодном для анализа.</div>
Ivan Markeevhttp://www.blogger.com/profile/16169121425536203686noreply@blogger.com0tag:blogger.com,1999:blog-5970735414950563237.post-71710356679512048992018-11-04T12:00:00.000+03:002018-11-04T12:00:10.329+03:00Находки недели [9].<h2>
Python</h2>
<br />
<ol>
<li><a href="https://www.zdnet.com/article/twelve-malicious-python-libraries-found-and-removed-from-pypi/" rel="nofollow" target="_blank">Twelve malicious Python libraries found and removed from PyPI</a>.</li>
<li><a href="https://blog.insightdatascience.com/generating-custom-photo-realistic-faces-using-ai-d170b1b59255" rel="nofollow" target="_blank">Generating custom photo-realistic faces using AI</a>.</li>
<li><a href="https://medium.com/geoai/house-hunting-the-data-scientist-way-b32d93f5a42f" rel="nofollow" target="_blank">House hunting — the data scientist way</a>.</li>
<li><a href="https://pynative.com/python-secrets-module/" rel="nofollow" target="_blank">Python Secrets Module to Generate secure random numbers for managing secrets</a>.</li>
<li><a href="https://medium.com/@tanmayee92/visualizing-youtube-videos-using-seaborn-and-wordcloud-in-python-b24247f70228" rel="nofollow" target="_blank">Visualizing YouTube videos using Seaborn and WordCloud in Python</a>.</li>
<li><a href="https://github.com/ChrisKnott/Algojammer" rel="nofollow" target="_blank">Algojammer</a> - An experimental code editor for writing algorithms.</li>
<li><a href="https://www.zerynth.com/blog/from-sensor-to-the-cloud-in-just-15-lines-of-python/" rel="nofollow" target="_blank">From sensor to the Cloud in just 15 lines of Python</a>.</li>
<li><a href="https://realpython.com/python-boto3-aws-s3/" rel="nofollow" target="_blank">Python, Boto3, and AWS S3: Demystified</a>.</li>
<li><a href="http://jakevdp.github.io/blog/2018/09/13/waiting-time-paradox/" rel="nofollow" target="_blank">The Waiting Time Paradox, or, Why Is My Bus Always Late?</a></li>
<li><a href="https://www.youtube.com/watch?v=GcyCWodqrKo&list=PLMrPHnpQRHYY23mWiF7415gvVOXi1G83d" rel="nofollow" target="_blank">PyCon APAC 2018</a> - YouTube Playlist.</li>
<li><a href="https://storiesinmypocket.com/articles/pathlib-my-new-favorite-module/" rel="nofollow" target="_blank">Pathlib: my new favorite module</a>.</li>
</ol>
<h2>
GCP</h2>
<div>
<ol>
<li><a href="https://cloud.google.com/blog/products/application-development/go-1-11-is-now-available-on-app-engine" rel="nofollow" target="_blank">Go 1.11 is now available on App Engine</a>.</li>
<li><a href="https://cloud.google.com/iot/docs/how-tos/device-logs" rel="nofollow" target="_blank">Viewing Device Logs</a> - Cloud IoT Core can optionally send device activity logs to Stackdriver Logging.</li>
</ol>
<h2>
Other</h2>
</div>
<div>
<ol>
<li><a href="https://code.fb.com/virtual-reality/oculus-connect-5-tech-talks-roundup/" rel="nofollow" target="_blank">Oculus Connect 5: Tech talks roundup</a>.</li>
<li><a href="https://code.fb.com/ml-applications/under-the-hood-facebook-marketplace-powered-by-artificial-intelligence/" rel="nofollow" target="_blank">Under the hood: Facebook Marketplace powered by artificial intelligence</a>.</li>
</ol>
</div>
Ivan Markeevhttp://www.blogger.com/profile/16169121425536203686noreply@blogger.com0tag:blogger.com,1999:blog-5970735414950563237.post-47458665628812992902018-10-29T08:00:00.000+03:002018-10-29T08:00:04.521+03:00Находки недели [8].<h2>
Python</h2>
<ol>
<li><a href="https://realpython.com/python-testing/" rel="nofollow" target="_blank">Getting Started With Testing in Python</a> и <a href="https://alysivji.github.io/testing-101-introduction-to-testing.html" rel="nofollow" target="_blank">Testing 101: Introduction to Testing</a> - отличные буквари по тестирванию.</li>
<li><a href="https://stackoverflow.com/questions/101268/hidden-features-of-python" rel="nofollow" target="_blank">Hidden features of Python</a>.</li>
<li><a href="https://www.machinelearningplus.com/nlp/gensim-tutorial/" rel="nofollow" target="_blank">Gensim Tutorial – A Complete Beginners Guide</a>.</li>
<li><a href="http://tech.marksblogg.com/working-with-hdfs.html" rel="nofollow" target="_blank">Working with the Hadoop Distributed File System</a>.</li>
<li><a href="https://pynative.com/python-secrets-module" rel="nofollow" target="_blank">Python Secrets Module to Generate secure random numbers for managing secrets</a>.</li>
<li><a href="https://pynative.com/python-uuid-module-to-generate-universally-unique-identifiers" rel="nofollow" target="_blank">Python UUID Module to Generate Universally Unique Identifiers</a>.</li>
<li><a href="https://www.tutorialdocs.com/article/best-python-graphics-libraries.html" rel="nofollow" target="_blank">The Interesting Python Graphics Libraries for Python Programmers</a>.</li>
</ol>
<div>
<h2>
ML</h2>
</div>
<div>
<ol>
<li><a href="https://eng.uber.com/michelangelo-pyml/" rel="nofollow" target="_blank">Michelangelo PyML: Introducing Uber’s Platform for Rapid Python ML Model Development</a>.</li>
<li><a href="https://www.pyimagesearch.com/2018/10/22/object-tracking-with-dlib/" rel="nofollow" target="_blank">Object tracking with dlib</a>.</li>
</ol>
<h2>
GCP</h2>
<div>
<ol>
<li><a href="https://medium.com/google-cloud/the-google-cloud-developer-cheat-sheet-429775bd6d11" rel="nofollow" target="_blank">The Google Cloud Developer Cheat Sheet</a>.</li>
<li><a href="https://cloud.google.com/blog/products/application-development/announcing-cloud-tasks-a-task-queue-service-for-app-engine-flex-and-second-generation-runtimes" rel="nofollow" target="_blank">Announcing Cloud Tasks, a task queue service for App Engine flex and second generation runtimes</a>.</li>
<li><a href="https://cloud.google.com/security/deletion/" rel="nofollow" target="_blank">Data deletion on Google Cloud Platform</a>.</li>
<li><a href="https://cloud.google.com/blog/products/containers-kubernetes/digging-into-kubernetes-1-12" rel="nofollow" target="_blank">Digging into Kubernetes 1.12</a>.</li>
<li><a href="https://cloud.google.com/blog/products/data-analytics/unlock-insights-with-ease-data-studio-and-cloud-dataprep-are-now-generally-available" rel="nofollow" target="_blank">Unlock insights with ease: Data Studio and Cloud Dataprep are now generally available</a>.</li>
<li><a href="https://cloud.google.com/blog/products/storage-data-transfer/designing-and-implementing-your-disaster-recovery-plan-using-gcp" rel="nofollow" target="_blank">Designing and implementing your disaster recovery plan using GCP</a>.</li>
<li><a href="https://tech.namshi.io/blog/2018/09/25/syncing-millions-of-records-a-day-to-bigquery-our-experience-moving-from-gae-to-gke/" rel="nofollow" target="_blank">Syncing millions of records a day to BigQuery: our experience moving from GAE to GKE</a>.</li>
</ol>
</div>
<h2>
Other</h2>
</div>
<div>
<ol>
<li><a href="https://medium.com/octopus-ventures/whats-it-like-to-sell-your-start-up-to-a-tech-giant-ba85dec3babd" rel="nofollow" target="_blank">What’s it like to sell your start up to a tech giant?</a></li>
</ol>
</div>
Ivan Markeevhttp://www.blogger.com/profile/16169121425536203686noreply@blogger.com0tag:blogger.com,1999:blog-5970735414950563237.post-3048082117339905382018-10-24T22:39:00.003+03:002018-10-24T22:39:59.075+03:00DigitalOcean Managed Databases<a href="https://try.digitalocean.com/dbaas-beta/" rel="nofollow" target="_blank">DigitalOcean запускает Managed Databases</a>. Пока только PostgreSQL, но позднее будет еще и MySQL. Решение называется DBaaS - DB as service по аналогии с PaaS.<br />
Набор функций похож на GCP CloudSQL:<br />
<br />
<ul>
<li>кластеризация</li>
<li>много баз внутри одного кластера</li>
<li>дублирование кластера (для быстрой настройки стейджей, например)</li>
<li>автоматизированная отказоустойчивость</li>
<li>объелинение соединений в пул</li>
<li>автоматизированные бэкапы</li>
<li>one-click обновление до новой версии СУБД</li>
<li>горизонтальное масштабирование для чтения</li>
<li>легкое переключение и перенос между ДЦ</li>
<li>шифрование на диске и при передаче по сети</li>
<li>модный мониторинг</li>
</ul>
<div>
Предполагается, что DigitalOcean будет дешевле аналогов, но убедится в этом пока нельзя. По скриншоту также можно предположить, что для кластера можно будет выбирать мощность узлов (CPU, RAM, HDD, etc).</div>
<div>
У DigitalOcean есть Cloud амбиции. Недавно был анонс запуска поддержки kubernetes, теперь вот DBaaS.</div>
Ivan Markeevhttp://www.blogger.com/profile/16169121425536203686noreply@blogger.com0tag:blogger.com,1999:blog-5970735414950563237.post-79360913028736996752018-10-22T19:59:00.001+03:002018-10-22T19:59:04.262+03:00Находки недели [7].<h2>
Python</h2>
<br />
<ul>
<li><a href="https://sinxloud.com/python-cheat-sheet-beginner-advanced/" rel="nofollow" target="_blank">Python Cheat Sheet for Beginners and Experts</a>.</li>
<li><a href="http://charlesleifer.com/blog/multi-process-task-queue-using-redis-streams/" rel="nofollow" target="_blank">Multi-process task queue using Redis Streams</a>.</li>
<li><a href="https://www.machinelearningplus.com/nlp/gensim-tutorial/" rel="nofollow" target="_blank">Gensim Tutorial – A Complete Beginners Guide</a>.</li>
<li><a href="https://erikbern.com/2018/10/08/the-hackers-guide-to-uncertainty-estimates.html" rel="nofollow" target="_blank">The hacker's guide to uncertainty estimates</a>.</li>
<li><a href="https://snarky.ca/clarifying-pep-518/" rel="nofollow" target="_blank">Clarifying PEP 518</a>.</li>
<li><a href="https://chase-seibert.github.io/blog/2015/06/25/python-mocking-cookbook.html" rel="nofollow" target="_blank">Python Mock Cookbook</a>.</li>
</ul>
<h2>
Data Science & ML.</h2>
<ul>
<li><a href="https://www.datasciencecentral.com/profiles/blogs/large-collection-of-neural-networks-ml-numpy-pandas-matplotlib-sc" rel="nofollow" target="_blank">Large Collection of Neural Nets, Numpy, Pandas, Matplotlib, Scikit and ML Cheat Sheets</a>.</li>
<li><a href="https://www.pyimagesearch.com/2018/10/15/deep-learning-hydroponics-and-medical-marijuana/" rel="nofollow" target="_blank">Deep learning, hydroponics, and medical marijuana</a>.</li>
<li><a href="https://towardsdatascience.com/find-where-to-park-in-real-time-using-opencv-and-tensorflow-4307a4c3da03" rel="nofollow" target="_blank">Find where to park in real time using OpenCV and Tensorflow</a>.</li>
<li><a href="https://medium.com/dair-ai/medical-imaging-analysis-mri-cnn-pytorch-4877e64e7303" rel="nofollow" target="_blank">Medical Imaging Analysis using PyTorch</a>.</li>
<li><a href="https://heartbeat.fritz.ai/detecting-the-language-of-a-persons-name-using-pytorch-rnn-29a9090c20f2" rel="nofollow" target="_blank">Detecting the Language of a Person’s Name using a PyTorch RNN</a>.</li>
</ul>
<h2>
Docker</h2>
<div>
<ul>
<li><a href="https://medium.com/@kinghuang/docker-compose-anchors-aliases-extensions-a1e4105d70bd" rel="nofollow" target="_blank">Don’t Repeat Yourself with Anchors, Aliases and Extensions in Docker Compose Files</a>.</li>
<li><a href="https://nickjanetakis.com/blog/docker-tip-69-avoid-running-out-of-disk-space-from-container-logs" rel="nofollow" target="_blank">Avoid Running Out of Disk Space from Container Logs</a>.</li>
</ul>
</div>
Ivan Markeevhttp://www.blogger.com/profile/16169121425536203686noreply@blogger.com0tag:blogger.com,1999:blog-5970735414950563237.post-41305267991798785272018-10-15T22:07:00.002+03:002018-10-15T22:07:53.341+03:00Находки недели [6].<br />
<div>
<h2>
Python</h2>
</div>
<ol>
<li><a href="https://blog.piwheels.org/how-to-work-out-the-missing-dependencies-for-a-python-package/" rel="nofollow" target="_blank">How to work out the missing dependencies for a Python package</a>.</li>
<li><a href="https://hackernoon.com/timsort-the-fastest-sorting-algorithm-youve-never-heard-of-36b28417f399" rel="nofollow" target="_blank">Timsort — the fastest sorting algorithm you’ve never heard of</a>.</li>
<li><a href="http://pbpython.com/pandas-crosstab.html" rel="nofollow" target="_blank">Pandas Crosstab Explained</a>.</li>
<li><a href="http://charlesleifer.com/blog/redis-streams-with-python/" rel="nofollow" target="_blank">Introduction to Redis streams with Python</a>.</li>
<li><a href="https://py.checkio.org/blog/how-to-publish-a-package-on-pypi/" rel="nofollow" target="_blank">How To Publish A Package On PyPI</a>.</li>
<li><a href="http://treyhunner.com/2018/10/asterisks-in-python-what-they-are-and-how-to-use-them/" rel="nofollow" target="_blank">Asterisks in Python: what they are and how to use them</a>.</li>
<li><a href="https://chase-seibert.github.io/blog/2015/06/25/python-mocking-cookbook.html" rel="nofollow" target="_blank">Python Mock Cookbook</a>.</li>
</ol>
<h2>
GCP</h2>
<div>
<ol>
<li><a href="https://cloud.google.com/resource-manager/docs/cloud-asset-inventory/overview" rel="nofollow" target="_blank">Introduction to Cloud Asset Inventory</a> - storage service that keeps a five week history of Google Cloud Platform (GCP) asset metadata. It allows you to export all asset metadata at a certain timestamp or timeframe.</li>
</ol>
</div>
<div>
<h2>
Other</h2>
</div>
<div>
<ol>
<li><a href="https://arxiv.org/pdf/1810.03770.pdf" rel="nofollow" target="_blank">Unsupervised Object Matching for Relational Data</a>.</li>
</ol>
</div>
Ivan Markeevhttp://www.blogger.com/profile/16169121425536203686noreply@blogger.com0tag:blogger.com,1999:blog-5970735414950563237.post-71358211278251842352018-10-08T15:33:00.000+03:002018-10-08T15:33:01.327+03:00Находки недели [5].Я пропустил выпуск прошлой недели из-за своего дня рождения, поэтому далее ссылки за 2 недели.<br />
<h2>
Python</h2>
<ol>
<li><a href="https://dev.nextthought.com/blog/2018/09/getting-started-with-pgsql-plpythonu.html" rel="nofollow" target="_blank">Getting Started With Python inside PostgreSQL</a>.</li>
<li><a href="https://blog.yellowant.com/create-your-chatbot-using-python-nltk-88809fa621d1" rel="nofollow" target="_blank">Create your chatbot using Python NLTK</a>.</li>
<li><a href="https://www.twilio.com/blog/what-is-public-key-cryptography" rel="nofollow" target="_blank">What is Public Key Cryptography?</a></li>
<li><a href="https://tmont.es/2018/the-mystery-behind-del-paren-and-why-it-works/" rel="nofollow" target="_blank">The mystery behind del() and why it works</a>.</li>
<li><a href="https://www.dataquest.io/blog/understanding-regression-error-metrics/" rel="nofollow" target="_blank">Understanding Regression Error Metrics</a>.<br />
</li>
<li><a href="https://medium.com/@cgarciae/making-an-infinite-number-of-requests-with-python-aiohttp-pypeln-3a552b97dc95" rel="nofollow" target="_blank">Making an Unlimited Number of Requests with Python aiohttp + pypeln</a>.<br />
</li>
<li><a href="https://medium.mybridge.co/python-open-source-of-the-month-v-sep-2018-3136ac55f230" rel="nofollow" target="_blank">Python Open Source of the Month (v.Sep 2018)</a>.</li>
<li><a href="https://keyboardinterrupt.org/multiprocessing-using-python-3-7/" rel="nofollow" target="_blank">Multiprocessing using Python 3.7</a>.</li>
</ol>
<div>
<h2>
ML</h2>
</div>
<div>
<ol>
<li><a href="https://www.dataoptimal.com/machine-learning-from-scratch/" rel="nofollow" target="_blank">6 Steps To Write Any Machine Learning Algorithm From Scratch: Perceptron Case Study</a>.<br />
</li>
<li><a href="https://opensource.com/article/18/9/quiet-log-noise-python-and-machine-learning" rel="nofollow" target="_blank">Quiet log noise with Python and machine learning</a>.<br />
</li>
<li><a href="https://towardsdatascience.com/illustrated-guide-to-lstms-and-gru-s-a-step-by-step-explanation-44e9eb85bf21" rel="nofollow" target="_blank">Illustrated Guide to LSTM’s and GRU’s: A step by step explanation</a><br />
</li>
</ol>
</div>
<div>
<h2>
Docker</h2>
<ol>
<li><a href="https://medium.com/lucjuggery/even-the-smallest-side-project-deserves-its-ci-cd-pipeline-281f80f39fdf" rel="nofollow" target="_blank">Even the smallest side project deserves its CI/CD pipeline</a>.<br />
</li>
</ol>
</div>
<div>
<h2>
GCP</h2>
</div>
<ol>
<li><a href="https://cloud.google.com/blog/products/gcp/7-best-practices-operating-containers" rel="nofollow" target="_blank">7 best practices for operating containers</a>.<br />
</li>
<li><a href="https://medium.com/@bamnet/cloud-source-repositories-gitlab-2fdcf1a8e50c" rel="nofollow" target="_blank">Cloud Source Repositories + GitLab</a>.<br />
</li>
<li><a href="https://cloud.google.com/blog/products/ai-machine-learning/announcing-updates-to-cloud-speech-to-text-and-general-availability-of-cloud-text-to-speech" rel="nofollow" target="_blank">Announcing updates to Cloud Speech-to-Text and the general availability of Cloud Text-to-Speech</a>.</li>
<li><a href="https://cloud.google.com/blog/products/gcp/introducing-headless-chrome-support-in-cloud-functions-and-app-engine" rel="nofollow" target="_blank">Introducing headless Chrome support in Cloud Functions and App Engine</a>.<br />
</li>
<li><a href="https://cloud.google.com/blog/products/application-development/introducing-new-cloud-source-repositories" rel="nofollow" target="_blank">Introducing new Cloud Source Repositories</a>.</li>
</ol>
<h2>
Other</h2>
<ol>
<li><a href="https://www.cncf.io/announcement/2018/08/29/cncf-receives-9-million-cloud-credit-grant-from-google/" rel="nofollow" target="_blank">Cloud Native Computing Foundation Receives $9 Million Cloud Credit Grant from Google Cloud to Fund Kubernetes Development, Empower Community.</a></li>
<li><a href="https://hackernoon.com/50-data-structure-and-algorithms-interview-questions-for-programmers-b4b1ac61f5b0" rel="nofollow" target="_blank">50+ Data Structure and Algorithms Interview Questions for Programmers</a>.</li>
<li><a href="https://www.youtube.com/watch?v=amYgzS0Y8HA" rel="nofollow" target="_blank">Unleashing the Power of Redis</a>.<br />
</li>
<li><a href="https://www.technologyreview.com/s/611902/google-just-gave-control-over-data-center-cooling-to-an-ai/" rel="nofollow" target="_blank">Google just gave control over data center cooling to an AI</a>.</li>
<li><a href="https://medium.com/de-correspondent/financial-transparency-956ab828d61f" rel="nofollow" target="_blank">How being open about your financials can help grow your reader-funded publication</a>.</li>
<li><a href="https://medium.com/everproof/what-you-think-you-know-is-hurting-your-products-success-eb44d346c838" rel="nofollow" target="_blank">Think your startup idea will work? Run a premortem for the best chance at success</a>.</li>
</ol>
Ivan Markeevhttp://www.blogger.com/profile/16169121425536203686noreply@blogger.com0tag:blogger.com,1999:blog-5970735414950563237.post-73041171365021031102018-09-24T11:13:00.002+03:002018-09-24T11:45:38.424+03:00Находки недели [4].<span id="goog_1341851389"></span><a href="https://draft.blogger.com/"></a><span id="goog_1341851390"></span><br />
<h2>
Python</h2>
<ol>
<li><a href="https://github.com/maebert/python-fails" rel="nofollow" target="_blank">How to Shoot Yourself in the Foot with Python</a>. Common pitfalls and misunderstandings.<br />
</li>
<li><a href="https://www.pyimagesearch.com/2018/09/17/opencv-ocr-and-text-recognition-with-tesseract/" rel="nofollow" target="_blank">OpenCV OCR and text recognition with Tesseract</a>. Как использовать OpenCV OCR (и Tesseract) для распознавания текстов.</li>
<li><a href="https://blog.pm2.io/managing-python-application-with-pm2/" rel="nofollow" target="_blank">Managing Python Processes with PM2</a>.<br />
</li>
<li><a href="https://xon.sh/" rel="nofollow" target="_blank">Xonsh</a> - кросс-платформенная shell на python.<br />
</li>
<li><a href="https://blog.alpaca.markets/blog/2018/9/19/python-library-to-run-quantopian-algorithm-inlive" rel="nofollow" target="_blank">Python Library To Run Quantopian Algorithm In Live</a>. Статья с код-примерами и кучищей полезных ссылок внутри.</li>
<li><a href="https://testdriven.io/running-flask-on-kubernetes" rel="nofollow" target="_blank">Running Flask on Kubernetes</a>.<br />
</li>
<li><a href="https://realpython.com/absolute-vs-relative-python-imports/" rel="nofollow" target="_blank">Absolute vs Relative Imports in Python</a>.<br />
</li>
<li><a href="https://github.com/python-trio/trio-asyncio" rel="nofollow" target="_blank">trio-asyncio</a>. Asyncio использующий <a href="https://trio.readthedocs.io/en/latest/index.html" rel="nofollow" target="_blank">Trio</a>.<br />
</li>
</ol>
<h2>
GCP</h2>
<ol>
<li><a href="https://cloud.google.com/ml-engine/docs/tensorflow/using-gpus" rel="nofollow" target="_blank">Using GPUs for Training Models in the Cloud</a>. Как запросить машинку с GPU? В документации обновления про это и даже про новую <a href="https://cloud.google.com/blog/products/compute/tesla-v100-gpus-are-now-generally-available" rel="nofollow" target="_blank">Tesla V100 GPUs</a>.<br />
</li>
<li><a href="https://cloud.google.com/blog/products/application-development/automatic-documentation-for-your-cloud-endpoints-api-now-in-ga" rel="nofollow" target="_blank">Automatic documentation for your Cloud Endpoints API, now in GA</a>. Супер фича вышла из беты.<br />
</li>
<li><a href="https://cloudplatform.googleblog.com/2018/06/GCP-arrives-in-the-Nordics-with-a-new-region-in-Finland.html" rel="nofollow" target="_blank">GCP arrives in the Nordics with a new region in Finland</a>. Возможно это самый северный cloud DC в Европе.</li>
</ol>
<div>
<h2>
AWS</h2>
</div>
<div>
<ol>
<li><a href="https://blog.sqreen.io/streaming-data-amazon-kinesis/" rel="nofollow" target="_blank">Streaming data with Amazon Kinesis</a>.<br />
</li>
</ol>
<div>
<h2>
Docker</h2>
</div>
</div>
<div>
<ol>
<li><a href="https://medium.com/@isurunuwanthilaka/deploying-images-from-bitbucket-to-docker-hub-b62d90f9eedd?mkt_tok=eyJpIjoiTldFMlpETTNaV0UzWldJeCIsInQiOiJ4STZYTk9zRUc1NnFOa3hsMERzTGlCcm5LeFFLQzJ1S2ZBb1NiT0dQakNSandiOVpMbytyTHhaaE1tQUdGVVRLaFRRd1wvY1B5ckoxXC9HNDBMeDB5VWduWU9lTFo4a1RuMFZKT285S0cxVWVkYVdMV1hDRGY5OEFHZGtZUjJEM1hwIn0%3D" rel="nofollow" target="_blank">Deploying images from Bitbucket to Docker Hub</a>.<br />
</li>
</ol>
</div>
<div>
<h3>
Other</h3>
На этот раз деление на категории для некоторых ссылок весьма условное - в other полно python и ML. Пусть деление будет по принципу главенства кода над объяснениями для Python-категории.</div>
<div>
<ol>
<li><a href="https://youtu.be/hNDkjy2rXG4" rel="nofollow" target="_blank">AI evolves to play Super Mario Bros!</a> 9-минутное youtube-видео со ссылками на <a href="https://github.com/vivek3141/super-mario-neat" rel="nofollow" target="_blank">сорцы</a>.<br />
</li>
<li><a href="https://techcrunch.com/2018/09/17/mumford-sons-beware-an-ai-can-now-write-indie-music/" rel="nofollow" target="_blank">Mumford & Sons beware! An AI can now write indie music</a>.</li>
<li><a href="http://firstround.com/review/future-founders-heres-how-to-spot-and-build-in-nonobvious-markets/" rel="nofollow" target="_blank">Future Founders, Here’s How to Spot and Build in Nonobvious Markets</a>.<br />
</li>
</ol>
</div>
Ivan Markeevhttp://www.blogger.com/profile/16169121425536203686noreply@blogger.com0tag:blogger.com,1999:blog-5970735414950563237.post-30101417485465896742018-09-16T20:31:00.001+03:002018-09-16T20:31:57.632+03:00Находки недели [3].<h2>
Python / ML</h2>
<ol>
<li><a href="https://www.turbowhale.com/posts/analyze_flickr_stream_pandas/" rel="nofollow" target="_blank"><b>Analyzing a photographer's flickr stream using pandas</b></a>.</li>
<li><a href="https://www.analyticsvidhya.com/blog/2018/09/deep-learning-video-classification-python/" rel="nofollow" target="_blank">Deep Learning <b>Tutorial to Calculate the Screen Time of Actors in any Video</b> (with Python codes)</a>.</li>
<li><a href="https://developers.google.com/edu/python/" rel="nofollow" target="_blank">Google's <b>Python Class</b></a>.</li>
</ol>
<h2>
GCP</h2>
<ol>
<li><a href="https://chrome.google.com/webstore/detail/superquery-bigquery-ai-op/lfckfngaeoheoppemkocjjebloiamfdc" rel="nofollow" target="_blank">superQuery - <b>BigQuery</b> AI optimization engine</a>.<br />
Расширение для Chrome, добавляющее редактору запросов в BigQuery разные крутые оптимизации, подсветку индекса и прочее. Автор называет расширение - мощной<b> IDE с искусственным интеллектом</b> (<a href="https://web.superquery.io/product/" rel="nofollow" target="_blank">сайт</a> автора).</li>
</ol>
<h2>
AWS </h2>
<ol>
<li><a href="https://medium.freecodecamp.org/a-beginners-guide-to-the-new-aws-python-sdk-for-alexa-105c0ed45f4e" rel="nofollow" target="_blank">A Beginner’s guide to the new <b>AWS Python SDK for Alexa</b></a>.</li>
</ol>
<h3>
Other </h3>
<ol>
<li><a href="https://stackoverflow.blog/2018/09/05/developer-salaries-in-2018-updating-the-stack-overflow-salary-calculator/" rel="nofollow" target="_blank">Developer Salaries in 2018: Updating the <b>Stack Overflow Salary Calculator</b></a>.<br />
Stack Overflow запустил инструмент для сравнения зарплат программистов в 2018 году. Данные собираются через опрос девелоперов. <a href="https://stackoverflow.com/jobs/salary">https://stackoverflow.com/jobs/salary</a>.</li>
<li><b>JetBrains</b> запустили <a href="https://plugins.jetbrains.com/marketplace" rel="nofollow" target="_blank"><b>marketplace</b></a> для продажи плагинов, а Яндекс только анонсировал вместе с запуском cloud сервиса marketplace облачных решений (срок осень 2018).</li>
</ol>
Ivan Markeevhttp://www.blogger.com/profile/16169121425536203686noreply@blogger.com0tag:blogger.com,1999:blog-5970735414950563237.post-63402743314784432652018-09-10T14:28:00.003+03:002018-09-10T14:29:05.018+03:00Находки недели [2].<h2>
Python</h2>
<ol>
<li><b>CheckIO запустили отдельный сайт остров лорда Эшера <a href="https://escher.checkio.org/" rel="nofollow" target="_blank">https://escher.checkio.org/</a>.</b>Если кто-то вдруг не в курсе, CheckIO - супер проект для практики решения кодинг-задач на Python или JavaScript.</li>
<li><a href="https://www.pyxll.com/blog/tools-for-working-with-excel-and-python/" rel="nofollow" target="_blank">Tools for Working with Excel and Python</a>.<br />
Статья-сравнение библиотек для работы с Excel-таблицами из Python.</li>
<li><a href="https://technology.cloverhealth.com/better-postgresql-testing-with-python-announcing-pytest-pgsql-and-pgmock-d0c569d0602a" rel="nofollow" target="_blank">Better PostgreSQL testing with Python: announcing pytest-pgsql and pgmock</a><br />
Как тестировать моками таблиц с pgmock?</li>
<li><a href="https://guide.esciencecenter.nl/best_practices/language_guides/python.html" rel="nofollow" target="_blank">Netherlands eScience Center Python coding guide</a>.</li>
<li><a href="https://blog.esciencecenter.nl/irregular-data-in-pandas-using-c-88ce311cb9ef" rel="nofollow" target="_blank">50 times faster data loading for Pandas: no problem</a>.</li>
<li><a href="https://www.pyimagesearch.com/2018/09/03/semantic-segmentation-with-opencv-and-deep-learning/" rel="nofollow" target="_blank">Semantic segmentation with OpenCV and deep learning</a>.</li>
<li><a href="https://www.jetbrains.com/research/devecosystem-2018/python/" rel="nofollow" target="_blank">The State of Developer Ecosystem Survey in 2018</a>.</li>
<li><a href="https://engineering.citymapper.com/profiling-python-memory-leaks-with-doctor-thread.html" rel="nofollow" target="_blank">Profiling Python Memory Leaks with Doctor Thread</a>.<br />
</li>
<li><a href="https://nealcaren.github.io/python-tutorials/" rel="nofollow" target="_blank">Learning Python for Social Scientists</a>.</li>
</ol>
<h2>
ML</h2>
<ol>
<li><a href="https://medium.com/@adarsh_menon_/linear-regression-using-least-squares-a4c3456e8570" rel="nofollow" target="_blank">Linear Regression Using Least Squares</a>.</li>
<li><a href="https://github.com/playgrdstar/financial_data_viz/blob/master/Visualising%20Financial%20Data.ipynb" rel="nofollow" target="_blank">Visualising Financial Data - Returns, Volatilties and Value at Risk</a>.</li>
<li><a href="https://medium.com/vickdata/four-feature-types-and-how-to-transform-them-for-machine-learning-8693e1c24e80" rel="nofollow" target="_blank">Feature Transformation for Machine Learning, a Beginners Guide</a>.</li>
</ol>
<h2>
GCP</h2>
<ol>
<li><a href="https://cloud.google.com/blog/products/gcp/introducing-app-engine-second-generation-runtimes-and-python-3-7" rel="nofollow" target="_blank">Introducing App Engine Second Generation runtimes and Python 3.7</a>.</li>
<li><a href="https://cloud.google.com/blog/products/identity-security/deploy-only-what-you-trust-introducing-binary-authorization-for-google-kubernetes-engine" rel="nofollow" target="_blank">Binary Authorization for Google Kubernetes Engine</a>.</li>
</ol>
<h2>
Other</h2>
<ol>
<li><a href="https://a16z.com/2018/09/02/sales-startups-technical-founders/" rel="nofollow" target="_blank">16 Mini-Lessons for Startup Founders</a>.<br />
</li>
<li><a href="https://medium.com/swlh/the-power-of-culture-how-to-hire-and-attract-amazing-people-fd9e37b6d520" rel="nofollow" target="_blank">The power of culture: how to hire and attract amazing people</a>.</li>
<li><a href="https://medium.com/@sgblank/is-the-lean-startup-dead-71e0517294a0" rel="nofollow" target="_blank">Is the Lean Startup Dead?</a></li>
</ol>
Ivan Markeevhttp://www.blogger.com/profile/16169121425536203686noreply@blogger.com0tag:blogger.com,1999:blog-5970735414950563237.post-47885617122265939912018-09-02T21:21:00.001+03:002018-09-10T11:37:13.542+03:00Находки недели [1].<h2>
Python</h2>
Видео с <a href="https://www.youtube.com/playlist?list=PLs4CJRBY5F1KrUr7z_2mur2QdAKXyh-k3" rel="nofollow" target="_blank">PyCon Australia 2018</a>.<br />
<br />
DOOM-like шутер на python - <a href="https://maxwellsalmon.itch.io/duga" rel="nofollow" target="_blank">DUGA</a>.<br />
<br />
GitHub <a href="https://github.com/haskellcamargo/sclack" rel="nofollow" target="_blank">sclack</a> - консольный клиент для мессенджера slack.<br />
<br />
<a href="https://www.youtube.com/playlist?list=PLEDYD952XcG7RwWeshln0dGYdfwqt24Ps" rel="nofollow" target="_blank">Серия видео</a> о создании эмулятора Game boy на python.<br />
<br />
<a href="https://realpython.com/python-pandas-tricks/" rel="nofollow" target="_blank">Python Pandas: Tricks & Features You May Not Know</a>.<br />
Статья о не очень популярных но полезных возможностях Pandas.<br />
<br />
<a href="https://blog.cambridgespark.com/50-free-machine-learning-datasets-sentiment-analysis-b9388f79c124" rel="nofollow" target="_blank">50 free Machine Learning datasets: Sentiment Analysis</a>.<br />
<h2>
Docker</h2>
<a href="https://medium.com/analytics-vidhya/how-to-use-tensorflow-serving-docker-container-for-model-testing-and-deployment-80a5e66322a5" rel="nofollow" target="_blank">How to use ‘Tensorflow Serving’ docker container for model testing and deployment</a> и <a href="https://blog.usejournal.com/machine-learning-environment-setup-within-10min-515c34ee33f3" rel="nofollow" target="_blank">Machine learning environment setup within 10min!!!</a><br />
Описание docker контейнеров, Tensorflow и короткое walk-through по их использованию.<br />
<br />
<a href="https://medium.com/the-code-review/docker-rm-how-to-stop-and-delete-containers-via-the-command-line-6a8fc2cc3f39" rel="nofollow" target="_blank">How to delete Docker containers from the command line</a>.<br />
Пост о том что делать если твой docker не умеет docker prune и в твоем brew нельзя поставить docker-clean.<br />
<br />
<a href="https://medium.com/@jimmyadaro/build-a-ci-cd-pipeline-with-docker-and-gitlab-f351585a5c83" rel="nofollow" target="_blank">Build a CI/CD Pipeline with Docker and GitLab</a>.<br />
Walk-through по настройке сабж.<br />
<h2>
Google Cloud Platform</h2>
<a href="https://cloud.google.com/developers/startups/" rel="nofollow" target="_blank">Google Cloud for Startups</a>.<br />
Оказывается Google дает не только $300 для пробы GCP для всех, но и от $2000 до $100000 для старпатов. Да, там много условий, но если у вас стартап, почему нет?<br />
<br />
Все <a href="https://www.youtube.com/user/googlecloudplatform/playlists?flow=grid&view=50&shelf_id=23" rel="nofollow" target="_blank">видео с Cloud Next 2018</a> разбитые по темам.<br />
<br />
<a href="https://cloudplatform.googleblog.com/2018/07/istio-reaches-1-0-ready-for-prod.html" rel="nofollow" target="_blank">Istio reaches 1.0: ready for prod</a> on GCP.<br />
Istio - Open Source решение для управления миркросервисами (о нем уже <a href="https://habr.com/company/jugru/blog/340442/" rel="nofollow" target="_blank">писали на Хабре</a>).<br />
<h2>
Прочее</h2>
Google Translate поет:<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/AiosKUO7oqo/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/AiosKUO7oqo?feature=player_embedded" width="320"></iframe></div>
<br />Ivan Markeevhttp://www.blogger.com/profile/16169121425536203686noreply@blogger.com0tag:blogger.com,1999:blog-5970735414950563237.post-505022885793453422016-07-25T14:22:00.003+03:002016-07-25T14:22:37.120+03:00В GitLab 8.10 появилась возможность запустить CD таск ручками (полезно для QA).В конфиге pipeline теперь можно написать условие:<br />
<span style="background-color: #f9f2f4; color: #c7254e; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 14.4px; line-height: 21.6px;"><br /></span>
<span style="background-color: #f9f2f4; color: #c7254e; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 14.4px; line-height: 21.6px;">when: manual</span><br />
<br />
И deploy будет совершенно после ручного запуска (читай проверки тестировщиком стэйдж версии). На мой взгляд, это идеальный баланс между автоматикой и ручным тестированием в Continuous delivery (CD).<br />
<br />
В релизе еще куча всего интересного <a href="https://about.gitlab.com/2016/07/22/gitlab-8-10-released/">https://about.gitlab.com/2016/07/22/gitlab-8-10-released/</a>. Например wildcard'ы вместо строгого соответствия для защищенных веток.Ivan Markeevhttp://www.blogger.com/profile/16169121425536203686noreply@blogger.com0tag:blogger.com,1999:blog-5970735414950563237.post-24934821227930946222016-06-06T11:21:00.004+03:002016-06-06T11:21:58.609+03:00Истерика по поводу Vim (холиварненько)Всегда испытывал иррациональное уважение к людям кодирующим только в Vim. Какая потрясающая самодостаточность, думал я. Но за последние 6 месяцев накопилось примеров от 4 совершенно разных разработчиков, которые подчеркнуто используют только Vim.<div>
Самые типичные ошибки мэтров консоли, которые не совершают IDE-шники:<br /><ul>
<li>не используемые импорты</li>
<li>переменные, которые никогда не используются</li>
<li>ошибочные изменения в следствии замены поиском</li>
<li>очепятки (орфография)</li>
<li>дублирование функций / классов</li>
<li>pep8</li>
</ul>
<div>
Если вы ведете более одной кодовой базы с разными командами разработчиков, используйте IDE! Вообще, по любому другому поводу лучше используйте PyCharm для python.</div>
</div>
Ivan Markeevhttp://www.blogger.com/profile/16169121425536203686noreply@blogger.com6tag:blogger.com,1999:blog-5970735414950563237.post-22286464873712860532016-02-14T12:55:00.003+03:002016-02-14T12:55:48.908+03:00Спорные моменты PEP8Наверное больше всего споров в pep8 вызывает история с максимальной длинной строки. 79 символов - маловато для современного редактора и монитора. Альтернативный довод про структурированные мысли и читаемость, которая автоматически повышается у людей пытающихся ограничить строку 79 символами, лично я считаю не необходимым условием. Достаточным, возможно.<br />
По статистике пакета для проверки <a href="https://pypi.python.org/pypi/pep8" rel="nofollow" target="_blank">pep8</a> следующее по популярности не соблюдаемое правило - количество пустых строк (н-р определение класса или первое определение в модуле).<br />
Исключения кодов E301, E302 и E501 встречаются в большинстве виденных мной выступлений на конференциях, в которых упоминался пакет для проверки pep8.<br />
<br />
А какие моменты pep8 вы считаете устаревшими / надуманными / не нужными?Ivan Markeevhttp://www.blogger.com/profile/16169121425536203686noreply@blogger.com7tag:blogger.com,1999:blog-5970735414950563237.post-47360987317340611222015-07-31T18:04:00.002+03:002015-07-31T18:04:23.893+03:00Jenkins скушал логами все свободное место на диске?На VPS'ке (<a href="http://blog.markeyev.ru/2015/05/digital-ocean-continuous-integration.html" target="_blank">Digital Ocean для Continuous Integration! Gitlab + Jenkins [tutorial]</a>) появилась проблема: за несколько часов ночью jenkins зафлудил логами все свободное место на диске. Решается добалвением в файл /etc/default/jenkins агрумента "-Dhudson.DNSMultiCast.disabled=true" в переменную JAVA_ARGS.<div>
В моей файле JAVA_ARGS стал выглядеть так:</div>
<div>
<br /></div>
<div>
JAVA_ARGS="-Djava.awt.headless=true -Dhudson.DNSMultiCast.disabled=true"</div>
Ivan Markeevhttp://www.blogger.com/profile/16169121425536203686noreply@blogger.com0tag:blogger.com,1999:blog-5970735414950563237.post-153004367279225042015-05-11T16:38:00.003+03:002015-05-11T16:43:39.765+03:00Digital Ocean для Continuous Integration! Gitlab + Jenkins [tutorial].<div>
В седые времена на настройку команды разработчиков уходило много времени и сил. Мало было просто поселить в голову отдельного разработчика идеи о TDD и его пользе. Ещё нужны были администраторы с руками растущими из правильных мест (ну это те, у которых кофта заправлена в джинсы и на лице густая борода), и нужно они были не один разок, а постоянно. Сейчас все иначе. Имея базовые знания можно, развернуть весь <a href="https://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D0%BF%D1%80%D0%B5%D1%80%D1%8B%D0%B2%D0%BD%D0%B0%D1%8F_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D1%8F" target="_blank">continuous integration</a> (CI) не открываясь от <a href="http://hipstertest.ru/" target="_blank">смузи</a>.</div>
<div>
<br />
Итак, нам потребуется: <b>$10 в месяц</b> на оплату собственного VPS (на нем же можно хостить MVP вашего стартапа, и еще много всякого - например VPN-шлюз для маскировки под американскую компанию), 2 опсосных проекта и некоторое количество свободного времени.<br />
<div>
<br /></div>
<div>
<a href="https://about.gitlab.com/" target="_blank">Gitlab</a> - это такой открытый Github у вас на сервере. Можно конечно обойтись <a href="https://bitbucket.org/" target="_blank">Bitbucket'ом</a> с <a href="https://confluence.atlassian.com/display/BITBUCKET/Bitbucket+Teams" target="_blank">закрытой группой</a> (team), но это во первых не круто =), а во-вторых, стартап должен параноидально охранять свою супер новую уникальную социальную сеть "Водноклассников Мир".</div>
<div>
<br /></div>
<div>
<a href="https://jenkins-ci.org/" target="_blank">Jenkins</a> - инструмент непрерывной интеграции, написанный на Java. Есть много разных альтернатив, но вот что нужно запомнить про них про все (субъективно):</div>
<div>
<ul>
<li>если инструмент имеет продвинутый функционал - он написан на java</li>
<li>если инструмент написан не на java, скорее всего из коробки он умеет очень мало, а настройка всего дополнительного - боль</li>
<li>настройка любых метрик в любой CI - это тоже боль</li>
<li>каждая команда имеет свой совершенно уникальный процесс разработки, нет двух одинаковых CI-процессов</li>
<li>каждая команда стремится создать свой уникальный deploy-процесс, но автоматизировать нужно только то, в чем админы реально не принимают никакого участия (читай: и не несут никакой ответственности). Выкладка новой версии внутренней python-библиотеки в закрытый репозиторий компании - хороший пример такой работы</li>
<li>и самое главное: невозможно один раз настроить CI и никогда больше к нему не возвращаться. Поддержание работоспособности CI - это отдельная настоящая работа, которой тоже нужно заниматься. Постоянно. Правда, всё потраченное время и силы вернутся сторицей.</li>
</ul>
<div>
<a href="https://www.digitalocean.com/?refcode=e16041a7fe90" target="_blank">Digital Ocean</a> (DO) - очень модный продавец VPS'ок, который держит нос исключительно "по ветру". Цены у них может быть и не самые низкие, но: API, хранение и дистрибуция слепков, куча дата-центров по всему миру, и настройка в один клик - безусловно доставляют.</div>
<div>
<br /></div>
<div>
Теперь о том, как все это соединить без напрягов.</div>
</div>
<div>
<br /></div>
<div>
<b>1. Создаем сервер с GitLab на борту при помощи one-click-install</b></div>
<div>
Не вижу никакого смысла повторять или переводить туториал написанный DO: <a href="https://www.digitalocean.com/community/tutorials/how-to-use-the-gitlab-one-click-install-image-to-manage-git-repositories" target="_blank">How To Use the GitLab One-Click Install Image to Manage Git Repositories</a>.<br />
DO не рекомендует устанавливать Gitlab на дроплет за 5 долларов - слишком уж мало там памяти. $10 - будет вполне достаточно. Но если очень хочется сэкономить, можно просто увеличить <a href="https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-ubuntu-14-04" target="_blank">swap</a> - для машинки с такими утилитарными задачами LA не критичен, как по мне. При заходе на one-click install с регистрации вам не дадут использовать $5 дроплет для gitlab, но если зарегистрироваться и уже из кабинета начать создавать дроплет (точно так, как описано в tutorial выше), то такого ограничения нет.</div>
<div>
<br /></div>
<div>
<b>2. Устанавливаем Jenkins.</b></div>
<div>
Для этого случая, что не удивительно, у Digital Ocean Community тоже уже есть tutorial: <a href="https://www.digitalocean.com/community/tutorials/how-to-install-and-use-jenkins-on-ubuntu-12-04">https://www.digitalocean.com/community/tutorials/how-to-install-and-use-jenkins-on-ubuntu-12-04</a>. От версии ubuntu в этом руководстве вообще ничего не зависит, так что смело используйте и для 14ой убунту. Заходите на VPS по ssh и далее все как в tutorial.</div>
<div>
По умолчанию Jenkins попытается использовать порт 8080, который уже занял gitlab. Нужно в файле /etc/default/jenkins заменить этот порт на какой-нибудь другой. Например, 9090.</div>
<div>
<br /></div>
<div>
Далее, наверняка захочется настроить для jenkins какое-нибудь приятное доменное имя, например ci.v-odnoklassnikov-moi-mir.ru. Для этого нам вполне хватит nginx, который установился вместе с gitlab. Его настройки лежат в каталоге /var/opt/gitlab/nginx/conf/.</div>
<div>
Создадим файл /var/opt/gitlab/nginx/conf/jenkins.conf с содержимым из туториала jenkins: <a href="https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+behind+an+NGinX+reverse+proxy">Jenkins behind an NGinX reverse proxy</a>. Обратите внимание, что в нашем случае proxy_pass смотрит на "http://localhost:9090/;".</div>
<div>
Только что написанный конфиг нужно "подцепить" в nginx GitLab'а. Данный процесс описан <a href="https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/settings/nginx.md#inserting-custom-settings-into-the-nginx-config">тут</a>. Суть статьи по ссылке: нужно в файле /etc/gitlab/gitlab.rb, добавить строку:<br />
<div class="hlcode" style="background-color: white; font-family: 'PT Sans', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif; font-size: 14px;">
<div class="syntax" style="clear: both;">
<pre style="background: rgb(240, 240, 240); border-radius: 2px; border: 1px solid rgb(204, 204, 204); font-family: Consolas, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 13px; letter-spacing: 0.015em; line-height: 15.6000003814697px; overflow-x: auto; overflow-y: hidden; padding: 0.5em;">nginx<span class="o" style="color: #666666;">[</span><span class="s1" style="color: #4070a0;">'custom_nginx_config'</span><span class="o" style="color: #666666;">]</span> <span class="o" style="color: #666666;">=</span> <span class="s2" style="color: #4070a0;">"include /var/opt/gitlab/nginx/conf/jenkins.conf;"</span></pre>
</div>
</div>
Не уверен, что файл /var/opt/gitlab/nginx/conf/jenkins.conf не похерится во время обновления gitlab. Будем посмотреть...</div>
<div>
<br /></div>
<div>
Вот и все. В этом посте осознанно не останавливаюсь на настройках проектов в Jenkins, чтобы не ограничиваться целями конкретного проекта / платформы. Я использую дженкинс для авто-тестов python-проектов, но в нем есть все для тестирования мобильных приложений и еще много-много всякого.</div>
<div>
Думаю, полезно было бы рассказать как при запросах на мердж jenkins умеет создавать отдельные проекты и тесты, как здорово использовать хуки gitlab'а, чтобы всегда иметь актуальную картину тестов, но все этом потом.</div>
<div>
<br /></div>
<div>
P. S. В комментах к посту помимо "<все не так>" и "<я тоже умный>" прошу написать: <b>что еще по теме поста интересно лично тебе, мой дорогой подписчик?</b></div>
<div>
<br /></div>
</div>
<div>
P. P. S. Лучшей благодарностью будет зарегистрироваться в <a href="https://www.digitalocean.com/?refcode=e16041a7fe90" target="_blank">Digital Ocean</a> по моей реферальной ссылке <a href="https://www.digitalocean.com/?refcode=e16041a7fe90">https://www.digitalocean.com/?refcode=e16041a7fe90</a>. Вам не сложно, а мне приятно.</div>
Ivan Markeevhttp://www.blogger.com/profile/16169121425536203686noreply@blogger.com2tag:blogger.com,1999:blog-5970735414950563237.post-35287787138690880512015-05-04T19:22:00.003+03:002015-05-11T22:24:55.856+03:00Django-jenkins и COVERAGE_EXCLUDES_FOLDERSВозился минут 10 пытаясь подобрать правильный способ прописать каталоги исключенные из coverage отчета для jenkins, залез в код и выяснил, что правильно определять полный путь до каталога, а не как в обсуждении на <a href="http://stackoverflow.com/questions/14451442/how-to-exclude-directory-or-files-from-coverage-report" rel="nofollow" target="_blank">stackoverflow</a>. Пора бы уже привыкнуть лезть в код раньше, чем на стэк =).<br />
Вот кусок конфига для django + django-jenkins с покрытием:<br />
<pre style="background: rgb(240, 240, 240); border-radius: 2px; border: 1px solid rgb(204, 204, 204); font-family: Consolas, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 13px; letter-spacing: 0.015em; line-height: 15.6000003814697px; overflow-x: auto; overflow-y: hidden; padding: 0.5em;"><span class="kn" style="color: #007020; font-weight: bold;">import</span> <span class="nn" style="color: #0e84b5; font-weight: bold;">os</span>
<span class="n">BASE_DIR</span> <span class="o" style="color: #666666;">=</span> <span class="n">os</span><span class="o" style="color: #666666;">.</span><span class="n">path</span><span class="o" style="color: #666666;">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">os</span><span class="o" style="color: #666666;">.</span><span class="n">path</span><span class="o" style="color: #666666;">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">__file__</span><span class="p">))</span>
<span class="c" style="color: #60a0b0; font-style: italic;"># ...</span>
<span class="n">PROJECT_APPS</span> <span class="o" style="color: #666666;">=</span> <span class="p">(</span><span class="s" style="color: #4070a0;">'myapp'</span><span class="p">,</span> <span class="p">)</span>
<span class="n">JENKINS_TASKS</span> <span class="o" style="color: #666666;">=</span> <span class="p">(</span>
<span class="s" style="color: #4070a0;">'django_jenkins.tasks.run_pylint'</span><span class="p">,</span>
<span class="s" style="color: #4070a0;">'django_jenkins.tasks.run_pep8'</span><span class="p">,</span>
<span class="s" style="color: #4070a0;">'django_jenkins.tasks.run_pyflakes'</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">COVERAGE_EXCLUDES_FOLDERS</span> <span class="o" style="color: #666666;">=</span> <span class="p">[</span>
<span class="n">os</span><span class="o" style="color: #666666;">.</span><span class="n">path</span><span class="o" style="color: #666666;">.</span><span class="n">join</span><span class="p">(</span><span class="n">BASE_DIR</span><span class="p">,</span> <span class="s" style="color: #4070a0;">'myapp'</span><span class="p">,</span> <span class="s" style="color: #4070a0;">'tests'</span><span class="p">)</span>
<span class="p">]</span></pre>
<br />
Запускаются такие тесты так:<br />
<div class="hlcode" style="background-color: white; font-family: 'PT Sans', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif; font-size: 14px;">
<div class="syntax" style="clear: both;">
<pre style="background: rgb(240, 240, 240); border-radius: 2px; border: 1px solid rgb(204, 204, 204); font-family: Consolas, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 13px; letter-spacing: 0.015em; line-height: 15.6000003814697px; overflow-x: auto; overflow-y: hidden; padding: 0.5em;">python manage.py jenkins --enable-coverage</pre>
</div>
</div>
Ivan Markeevhttp://www.blogger.com/profile/16169121425536203686noreply@blogger.com1tag:blogger.com,1999:blog-5970735414950563237.post-16386852956764739772015-04-14T13:39:00.001+03:002015-04-14T13:39:09.622+03:00Moscow Django MeetUpНе мало воды утекло с тех пор, как я посещал последний раз это мероприятие. С удовольствием констатирую, что качество докладов сильно выросло: <a href="https://moscowdjango.ru/meetup/26/" rel="nofollow" target="_blank">Moscow Django MeetUp № 26</a>.Ivan Markeevhttp://www.blogger.com/profile/16169121425536203686noreply@blogger.com0tag:blogger.com,1999:blog-5970735414950563237.post-683027809808415602015-03-05T13:00:00.001+03:002015-03-05T13:02:08.783+03:00Интересный способ привлечь внимание пользователей bitbucketСегодня ночью мне пришло письмо от bitbucket, о том что не знакомый мне человек дает мне грант на запись в репозиторий. В названии репозитория доменное имя, по которому замещен интернет-магазин.<br />
Грант, очевидно, был отозван сразу. Мне естественно, стало интересно посмотреть что там на сайте. Тему этого сайта для себя считаю закрытой, но какая-то более специализированная история, могла бы меня заинтересовать. Например, так можно раскручивать сервис непрерывной интеграции или аутсорс тестирования.<br />
Для того что бы выдать грант пользователю достаточно знать его ФИ или username. Такие данные не сложно получить с помощью API bitbucket'а <a href="http://restbrowser.bitbucket.org/">http://restbrowser.bitbucket.org/</a>.Ivan Markeevhttp://www.blogger.com/profile/16169121425536203686noreply@blogger.com0