Когда горит проект
Недавно проводил опрос "Как бы вы поступили на месте руководителя проекта, когда поняли, что проект горит" и решил задать этот же вопрос профессионалу. Олег Мохов руководитель службы разработки интерфейсов в Екатеринбургском Яндексе. Ещё он ведёт канал "Про руководство разработчиками" @teamleading. Передаю микрофон Олегу.
Спасибо, Дима. Отличный вопрос. Совсем недавно я общался с несколькими своими сотрудниками как раз на эту тему.
Нулевое правило. Руководитель в любом случае виноват и вся ответственность на нём. Даже если самодур разработчик ушёл в пьяный загул и увёл всю команду. Даже если косячили внешние подрядчики. Даже если дизайн выдали на 5 месяцев позже. Даже если случилось землятресение, ураган и нашествие инопланетян. Ответственность всегда на руководителе. Я считаю важным про это регулярно говорить с разработчиками, даже в тех проектах где нависают сроки, что вы отвечаете за сроки, а разработчики отвечают за написание кода.
Итак, сроки профакаплены. Что делать? Сначала нужно довести задачу до конца, а дальше выяснять почему возникли проблемы и делать выводы. Т.е сначала приложить все усилия чтобы устранить проблему. Если нужно остаться ночью, то я буду первым кто останется ночью. Если нужно поковыряться в базе, то я сяду рядом с разработчиком и буду смотреть, даже если я сам нифига не понимаю. Если разработчик сидит удалённо, то я всё равно буду онлайн. Т.е нужно сделать всё, чтобы решить задачу
Когда проблема решена, нужно понять почему она возникла, и что мы можем сделать в следующий раз, чтобы её не было. Я, обычно, провожу ретроспективы, где в командном формате мы решаем дальше, что можно поменять в процессе.
Надо сказать, что сроки в том или ином виде продалбываются регулярно. 6 лет назад я участвовал в одном спецпроекте Яндекса, запустить который нужно было точно в указанное время. Мы допустили кучу разных ошибок на всех этапах, но не могли не запуститься. За два часа до связанного события мы выкатили первую версию, на которую пошел трафик, облегченно вздохнули, и даже смогли немного поспать. Через четыре часа нам позвонили админы и сказали что сервис 500-тит. Наше достижение здесь в том, что никто массово этого не заметил, а для этого мы приложили максимум усилий.
В фильме «Москва слезам не верит» главная героиня Катя, будучи директором, говорит замечательную фразу: «Меня не интересует почему нет, меня интересует что вы сделали чтобы было да». Я очень часто говорю эту фразу, например, когда кто-то говорит мне о внешних проблемах, то я всегда по максимуму узнаю что именно он ещё сделал, чтобы решить проблему. «Там уже в тикете не отвечают два дня!». «А ты звонил им?». «Может отправить им кого-то из менеджеров в Москве?», «Может командировку оформить, лично приедешь?» – это пример проблемы, и примеры вопросов, которые я задаю. Если проблема ограничилась «проблема не на моей стороне» – мы идём и разговариваем с разработчиком про это. И я рассказываю ему в который раз, что решить задачу не означает сделать только свою работу. И если задача не решена, то не бывает «я всё сделал, а они нет», т.к важно только что задача не решена.
Недавно проводил опрос "Как бы вы поступили на месте руководителя проекта, когда поняли, что проект горит" и решил задать этот же вопрос профессионалу. Олег Мохов руководитель службы разработки интерфейсов в Екатеринбургском Яндексе. Ещё он ведёт канал "Про руководство разработчиками" @teamleading. Передаю микрофон Олегу.
Спасибо, Дима. Отличный вопрос. Совсем недавно я общался с несколькими своими сотрудниками как раз на эту тему.
Нулевое правило. Руководитель в любом случае виноват и вся ответственность на нём. Даже если самодур разработчик ушёл в пьяный загул и увёл всю команду. Даже если косячили внешние подрядчики. Даже если дизайн выдали на 5 месяцев позже. Даже если случилось землятресение, ураган и нашествие инопланетян. Ответственность всегда на руководителе. Я считаю важным про это регулярно говорить с разработчиками, даже в тех проектах где нависают сроки, что вы отвечаете за сроки, а разработчики отвечают за написание кода.
Итак, сроки профакаплены. Что делать? Сначала нужно довести задачу до конца, а дальше выяснять почему возникли проблемы и делать выводы. Т.е сначала приложить все усилия чтобы устранить проблему. Если нужно остаться ночью, то я буду первым кто останется ночью. Если нужно поковыряться в базе, то я сяду рядом с разработчиком и буду смотреть, даже если я сам нифига не понимаю. Если разработчик сидит удалённо, то я всё равно буду онлайн. Т.е нужно сделать всё, чтобы решить задачу
Когда проблема решена, нужно понять почему она возникла, и что мы можем сделать в следующий раз, чтобы её не было. Я, обычно, провожу ретроспективы, где в командном формате мы решаем дальше, что можно поменять в процессе.
Надо сказать, что сроки в том или ином виде продалбываются регулярно. 6 лет назад я участвовал в одном спецпроекте Яндекса, запустить который нужно было точно в указанное время. Мы допустили кучу разных ошибок на всех этапах, но не могли не запуститься. За два часа до связанного события мы выкатили первую версию, на которую пошел трафик, облегченно вздохнули, и даже смогли немного поспать. Через четыре часа нам позвонили админы и сказали что сервис 500-тит. Наше достижение здесь в том, что никто массово этого не заметил, а для этого мы приложили максимум усилий.
В фильме «Москва слезам не верит» главная героиня Катя, будучи директором, говорит замечательную фразу: «Меня не интересует почему нет, меня интересует что вы сделали чтобы было да». Я очень часто говорю эту фразу, например, когда кто-то говорит мне о внешних проблемах, то я всегда по максимуму узнаю что именно он ещё сделал, чтобы решить проблему. «Там уже в тикете не отвечают два дня!». «А ты звонил им?». «Может отправить им кого-то из менеджеров в Москве?», «Может командировку оформить, лично приедешь?» – это пример проблемы, и примеры вопросов, которые я задаю. Если проблема ограничилась «проблема не на моей стороне» – мы идём и разговариваем с разработчиком про это. И я рассказываю ему в который раз, что решить задачу не означает сделать только свою работу. И если задача не решена, то не бывает «я всё сделал, а они нет», т.к важно только что задача не решена.
Что посмотреть на выходных
Доклад о Spring Boot’е ч. 1
https://youtu.be/yy43NOreJG4
Доклад о Spring Boot’е ч. 2
https://youtu.be/7Cq5zEm2wq0
Интервью основателя Revolut
https://youtu.be/srX8NrtZg7k
#чтопосмотреть
Доклад о Spring Boot’е ч. 1
https://youtu.be/yy43NOreJG4
Доклад о Spring Boot’е ч. 2
https://youtu.be/7Cq5zEm2wq0
Интервью основателя Revolut
https://youtu.be/srX8NrtZg7k
#чтопосмотреть
Принципы ООП
Абстракция – выделение функциональности, которая нужна для решения задачи, и отсечение всего лишнего. Например, интерфейс и его реализации.
Инкапсуляция – сокрытие реализации. Объект имеет внутреннее состояние, которое нельзя менять извне, и поля, с которыми могут взаимодействовать другие объекты. В Джаве инкапсуляция реализована с помощью модификаторов доступа.
Наследование – передача свойств и поведения родительского класса дочернему. В Джаве наследование реализовано с помощью ключевого слова extends.
Полиморфизм – один интерфейс, множество реализаций. Пример – с помощью переменной родительского типа можно оперировать объектами дочернего типа.
Вопросы на закрепление:
- особенности наследования в Джаве
- примеры нарушения инкапсуляции
- примеры абстракции
- примеры полиморфизма
Абстракция – выделение функциональности, которая нужна для решения задачи, и отсечение всего лишнего. Например, интерфейс и его реализации.
Инкапсуляция – сокрытие реализации. Объект имеет внутреннее состояние, которое нельзя менять извне, и поля, с которыми могут взаимодействовать другие объекты. В Джаве инкапсуляция реализована с помощью модификаторов доступа.
Наследование – передача свойств и поведения родительского класса дочернему. В Джаве наследование реализовано с помощью ключевого слова extends.
Полиморфизм – один интерфейс, множество реализаций. Пример – с помощью переменной родительского типа можно оперировать объектами дочернего типа.
Вопросы на закрепление:
- особенности наследования в Джаве
- примеры нарушения инкапсуляции
- примеры абстракции
- примеры полиморфизма
Интерфейс
Минимум, который нужно знать об интерфейсе:
• Интерфейс - ссылочный тип
• Может наследоваться от нескольких интерфейсов
• Переменные по умолчанию public static final
• Методы по умолчанию public abstract
• С восьмой Джавы есть default методы, которые имеют реализацию
• Может хранить вложенные интерфейсы
• Нельзя создать экземпляр интерфейса
• Класс может реализовывать несколько интерфейсов
Вопросы на закрепление:
- Перечислить отличия абстрактного класса от интерфейса
- Что произойдет, если класс реализует два интерфейса с методами, у которых одинаковая сигнатура
Минимум, который нужно знать об интерфейсе:
• Интерфейс - ссылочный тип
• Может наследоваться от нескольких интерфейсов
• Переменные по умолчанию public static final
• Методы по умолчанию public abstract
• С восьмой Джавы есть default методы, которые имеют реализацию
• Может хранить вложенные интерфейсы
• Нельзя создать экземпляр интерфейса
• Класс может реализовывать несколько интерфейсов
Вопросы на закрепление:
- Перечислить отличия абстрактного класса от интерфейса
- Что произойдет, если класс реализует два интерфейса с методами, у которых одинаковая сигнатура
Дизайн-принципы Intercom
Сегодня посетил митап Кости Горского. Костя – дизайн-менеджер в Intercom, в прошлом дизайн-директор Яндекса.
Мне запомнились дизайн-принципы, которым в какой-то степени могут следовать и разработчики:
1. Правильно поставить задачу важнее, чем правильно её решить
2. Переиспользование вместо изобретения
3. Простота важнее функциональности
4. Человечность важнее технологичности
5. Неважно, что ты нарисовал. Важно, что мы запустили
Сегодня посетил митап Кости Горского. Костя – дизайн-менеджер в Intercom, в прошлом дизайн-директор Яндекса.
Мне запомнились дизайн-принципы, которым в какой-то степени могут следовать и разработчики:
1. Правильно поставить задачу важнее, чем правильно её решить
2. Переиспользование вместо изобретения
3. Простота важнее функциональности
4. Человечность важнее технологичности
5. Неважно, что ты нарисовал. Важно, что мы запустили
Наследование
С помощью наследования мы можем создавать иерархии типов, которые обладают теми же свойствами типов, от которых мы их наследовали. Существующий класс, от которого наследовались, мы называют суперкласс, базовый или родительский. Новый класс – подкласс, производный или дочерний.
Два вида наследования: одиночное и множественное. Одиночное – когда у класса только один родитель. Множественное – когда у класса может быть несколько предков.
Джава поддерживает одиночное наследование. То есть мы можем создавать классы, которые наследуются только от одного суперкласса. Но классы могут реализовывать сколько угодно интерфейсов.
С помощью наследования мы можем создавать иерархии типов, которые обладают теми же свойствами типов, от которых мы их наследовали. Существующий класс, от которого наследовались, мы называют суперкласс, базовый или родительский. Новый класс – подкласс, производный или дочерний.
Два вида наследования: одиночное и множественное. Одиночное – когда у класса только один родитель. Множественное – когда у класса может быть несколько предков.
Джава поддерживает одиночное наследование. То есть мы можем создавать классы, которые наследуются только от одного суперкласса. Но классы могут реализовывать сколько угодно интерфейсов.
Обучение на зверях
Самое тупое, что есть в обучении программированию – это примеры наследования с кошечками и собачками.
Самое тупое, что есть в обучении программированию – это примеры наследования с кошечками и собачками.
Что посмотреть на выходных
Доклад о Java 8
https://youtu.be/7Iy1hVEXxsU
Неадекватные вопросы на собеседовании
https://youtu.be/AR9dtVaEUSM
Варламов «Почему Россия проиграет войну США»
https://youtu.be/8wz8OBcgsn8
#чтопосмотреть
Доклад о Java 8
https://youtu.be/7Iy1hVEXxsU
Неадекватные вопросы на собеседовании
https://youtu.be/AR9dtVaEUSM
Варламов «Почему Россия проиграет войну США»
https://youtu.be/8wz8OBcgsn8
#чтопосмотреть
Методы Object
На собеседованиях Java Junior’ов часто просят перечислить методы класса Object. Если сходу вспомнил все – ставь рок 🤘
На собеседованиях Java Junior’ов часто просят перечислить методы класса Object. Если сходу вспомнил все – ставь рок 🤘
Приведение типов
Приведение типа показывает использование объекта одного типа, как объект другого типа.
Неявное приведение типа:
Явное приведение:
Приведение типа показывает использование объекта одного типа, как объект другого типа.
Неявное приведение типа:
String s = “java_dev”;
Object o = s;
Явное приведение:
String t = (String) o;
Преобразование примитивов
Автоматическое приведение типов возможно, когда выполняются два условия:
— оба типа совместимы;
— размер исходного типа меньше размера типа, который хотим получить.
Числовые типы: целочисленные и с плавающей точкой, совместимы друг с другом. Но не существует автоматического преобразования числовых типов в тип
Так как целочисленные константы по дефолту
Во время вычислений происходит повышение типа.
— Тип всех значений
— Если один операнд имеет тип
Пример:
Примеры явного приведения:
Прочитать:
— 3 главу у Шилдта. Типы данных, переменные и массивы
— Подробная статья о преобразовании примитивов
https://bit.ly/2NYFxcr
Автоматическое приведение типов возможно, когда выполняются два условия:
— оба типа совместимы;
— размер исходного типа меньше размера типа, который хотим получить.
Числовые типы: целочисленные и с плавающей точкой, совместимы друг с другом. Но не существует автоматического преобразования числовых типов в тип
char
и boolean
. Так как целочисленные константы по дефолту
int
, то Джава выполняет автоматическое преобразование типов при их сохранении в переменные типа byte
, short
, long
или char
. Пример:byte b = 127;
Во время вычислений происходит повышение типа.
— Тип всех значений
byte
, short
, char
повышается до int
.— Если один операнд имеет тип
long
, тип всего выражения повышается до long
. Если один операнд имеет тип float
, тип всего выражения повышается до float
. Если один операнд имеет тип double
, тип всего выражения повышается до double
. Сокращенно:int -> long -> float -> double
Пример:
byte b = 1;
b = b * 2; // compile error
int i = b * 2; // ok
Примеры явного приведения:
byte b = (byte) 300;
0000 0001 0010 1100 -> 0010 1100
byte b = (byte) 128;
0000 0000 1000 0000 -> 1000 0000
Прочитать:
— 3 главу у Шилдта. Типы данных, переменные и массивы
— Подробная статья о преобразовании примитивов
https://bit.ly/2NYFxcr
Переопределение и сокрытие
Метод переопределяет метод суперкласса, если они оба нестатические, и у них совпадают сигнатуры. Вызвать метод родителя можно с помощью ключевого слова
Статический метод скрывает метод суперкласса, когда у методов совпадают сигнатуры и параметры, которые относятся к возвращаемому типу, оператору
Метод переопределяет метод суперкласса, если они оба нестатические, и у них совпадают сигнатуры. Вызвать метод родителя можно с помощью ключевого слова
super
.Статический метод скрывает метод суперкласса, когда у методов совпадают сигнатуры и параметры, которые относятся к возвращаемому типу, оператору
throws
и доступности.Подкаст про трудоуйстройство
Недавно познакомился с крутейшим подкастом об Android разработке. Линк на 68-й выпуск, который послушал https://soundcloud.com/leonid-bogolubov/68a
Ведущие вместе с гостем, опытным hr, обсуждали тему найма. Какую зарплату получают в России Android и iOS разработчики. Как разговаривать с начальством о повышении зарплаты. Что такое оффер и контр-оффер. Что hr ожидает увидеть в резюме. Как грамотно составить резюме.
Ведущие выкладывают выпуски в @androiddevpodcast_news. Плюс там же публикуют полезные линки: примеры резюме, вопросы для Android-разработчиков, свежие новости.
Ставь рок, если за материалы и рекомендации на тему Android.
Недавно познакомился с крутейшим подкастом об Android разработке. Линк на 68-й выпуск, который послушал https://soundcloud.com/leonid-bogolubov/68a
Ведущие вместе с гостем, опытным hr, обсуждали тему найма. Какую зарплату получают в России Android и iOS разработчики. Как разговаривать с начальством о повышении зарплаты. Что такое оффер и контр-оффер. Что hr ожидает увидеть в резюме. Как грамотно составить резюме.
Ведущие выкладывают выпуски в @androiddevpodcast_news. Плюс там же публикуют полезные линки: примеры резюме, вопросы для Android-разработчиков, свежие новости.
Ставь рок, если за материалы и рекомендации на тему Android.
Private
• компоненты не наследуются у суперкласса
• доступны через унаследованные
• у вложенного класса есть доступ к
•
• компоненты не наследуются у суперкласса
• доступны через унаследованные
public
или protected
методы• у вложенного класса есть доступ к
private
полям и методам своего внешнего класса•
private
компоненты неявно доступны через унаследованный вложенный класс10 правил проведения эффективных встреч
В большой компании эффективность встреч имеет большой смысл. Иногда обсуждения занимают целый день, а результат от этого нулевой. Сегодня в одной из переговорок увидел лист с правилами для тех, кто дорожит временем.
1. 😎 Назначил – отвечай
Организатор отвечает за эффективность встречи
2. 🎯 Нет цели – нет встречи
Можете решить вопрос без встречи? Решайте
3. 📝 Повестка
Составляйте повестку и список вопросов с таймингом
4. 📣 Нужен – зови
Приглашайте только тех участников, кто действительно нужен
5. 🚶🏻♂️Бесполезен – уйди
Если на встрече чувствуете себя бесполезным, то можете её покинуть
6. ⛔️ Отказал – объясни
Если отклонили встречу, аргументируйте отказ чётко и понятно для организатора
7. 📆 Готовность один день
Приглашение и материалы встречи отправляйте минимум за день
8. ⏰ Начинайте вовремя
Заранее подключайте презентацию к монитору и удаленных участников по видео и телефонной связи
9. ⏳Минус 5 минут
Завершайте встречу за 5 минут до конца, чтобы успеть на следующую
10. 🙌🏻 Итоги
После встречи отправляйте участникам короткое резюме
В большой компании эффективность встреч имеет большой смысл. Иногда обсуждения занимают целый день, а результат от этого нулевой. Сегодня в одной из переговорок увидел лист с правилами для тех, кто дорожит временем.
1. 😎 Назначил – отвечай
Организатор отвечает за эффективность встречи
2. 🎯 Нет цели – нет встречи
Можете решить вопрос без встречи? Решайте
3. 📝 Повестка
Составляйте повестку и список вопросов с таймингом
4. 📣 Нужен – зови
Приглашайте только тех участников, кто действительно нужен
5. 🚶🏻♂️Бесполезен – уйди
Если на встрече чувствуете себя бесполезным, то можете её покинуть
6. ⛔️ Отказал – объясни
Если отклонили встречу, аргументируйте отказ чётко и понятно для организатора
7. 📆 Готовность один день
Приглашение и материалы встречи отправляйте минимум за день
8. ⏰ Начинайте вовремя
Заранее подключайте презентацию к монитору и удаленных участников по видео и телефонной связи
9. ⏳Минус 5 минут
Завершайте встречу за 5 минут до конца, чтобы успеть на следующую
10. 🙌🏻 Итоги
После встречи отправляйте участникам короткое резюме
Передача данных по ссылке и по значению
По значению - выполняется копирование самого значения, то есть образуются две независимые друг од друга копии. Примитивы передаются по значению.
По ссылке - копируется только ссылка на объект. Так как переменные будут ссылаться на один объект, то они все будут аффектить один объект при изменениях.
По значению - выполняется копирование самого значения, то есть образуются две независимые друг од друга копии. Примитивы передаются по значению.
По ссылке - копируется только ссылка на объект. Так как переменные будут ссылаться на один объект, то они все будут аффектить один объект при изменениях.
Вопрос про анонимные классы. Какие из этих утверждений верны?
A. Анонимный класс может указывать абстрактный класс в качестве своего базового типа.
B. Анонимный класс может указывать интерфейс в качестве своего базового типа.
С. Анонимный класс может указывать одновременно абстрактный класс и интерфейс в качестве своих базовых типов.
D. Анонимный класс всегда может быть заменен лямбда-выражением.
E. Анонимному классу нужен конструктор без аргументов для своего родительского класса.
A. Анонимный класс может указывать абстрактный класс в качестве своего базового типа.
B. Анонимный класс может указывать интерфейс в качестве своего базового типа.
С. Анонимный класс может указывать одновременно абстрактный класс и интерфейс в качестве своих базовых типов.
D. Анонимный класс всегда может быть заменен лямбда-выражением.
E. Анонимному классу нужен конструктор без аргументов для своего родительского класса.
Статистика языков программирования
Сотрудники HeadHunter провели исследование и вычислили самые востребованные языки программирования в России. Они посчитали упоминания в вакансиях и резюме, вычислили средние зарплаты и разложили всё по табличкам. Короч получилась интересная статья
https://habr.com/company/hh/blog/418079/
Коротко: Джава в топах, в Москве и Питере сосредоточились больше половины вакансий для программистов
Сотрудники HeadHunter провели исследование и вычислили самые востребованные языки программирования в России. Они посчитали упоминания в вакансиях и резюме, вычислили средние зарплаты и разложили всё по табличкам. Короч получилась интересная статья
https://habr.com/company/hh/blog/418079/
Коротко: Джава в топах, в Москве и Питере сосредоточились больше половины вакансий для программистов
Почему
Самый главный вопрос, который должен задавать разработчик - «почему?» Почему технология так устроена? Почему в проекте используется именно эта либа? Почему метод так работает?
Умение задавать себе и окружающим вопрос «почему?» помогает докапываться до первопричины и расти, как специалисту. И наоборот, если не искать причин и полагаться на магию, то крутым спецом не стать.
Самый главный вопрос, который должен задавать разработчик - «почему?» Почему технология так устроена? Почему в проекте используется именно эта либа? Почему метод так работает?
Умение задавать себе и окружающим вопрос «почему?» помогает докапываться до первопричины и расти, как специалисту. И наоборот, если не искать причин и полагаться на магию, то крутым спецом не стать.