🔥 5 ошибок при составлении резюме
Чтобы привлекать внимание рекрутеров, нужно не только много уметь, но еще и «вкусно» это преподнести 🙂
Сегодня вместе с онлайн-университетом SF Education обсудили 5 типичных ошибок, которые встречаются в большинстве резюме.
Например:
✅ Старайтесь максимально указывать инструменты и технологии, с которыми вы работаете
Посудите сами - вариант «До»:
- Создание аналитической системы для отдела маркетинга
Вариант «После»:
+ Разработал аналитическую систему на основе Power BI и Airflow + Python + PostgreSQL в качестве хранилища
Остальные пункты читайте в карточках 😏
- - - - -
Кстати, о том, как «вкусно» упаковать свое резюме, подробно и с примерами мы рассказали в статье 👉🏻 https://vk.cc/cbvYHr
Чтобы привлекать внимание рекрутеров, нужно не только много уметь, но еще и «вкусно» это преподнести 🙂
Сегодня вместе с онлайн-университетом SF Education обсудили 5 типичных ошибок, которые встречаются в большинстве резюме.
Например:
✅ Старайтесь максимально указывать инструменты и технологии, с которыми вы работаете
Посудите сами - вариант «До»:
- Создание аналитической системы для отдела маркетинга
Вариант «После»:
+ Разработал аналитическую систему на основе Power BI и Airflow + Python + PostgreSQL в качестве хранилища
Остальные пункты читайте в карточках 😏
- - - - -
Кстати, о том, как «вкусно» упаковать свое резюме, подробно и с примерами мы рассказали в статье 👉🏻 https://vk.cc/cbvYHr
👍3🔥2❤1
🔥 CHANGELOG.md - IT Resume [Февраль]
Февраль хоть и короткий месяц, но мы много чего успели:
0. Готовим кое-что новое и крутое 😉
1. Упростили процедуру регистрации — теперь не придется городить сложные пароли
2. Исправили 50+ багов по задачам, добавили новые разборы и решения
3. Добавили несколько задач и тестовых заданий с собеседований
А также:
+ Тот самый Глеб Михайлов застримил у нас со своими леопардами 👉🏻 https://vk.cc/cbz2Hn
+ Собрали почти 30К просмотров и 100 комментариев на Хабре и все это на одной статье 👉🏻 https://vk.cc/cbz2OY
Stay tuned! 🙂
Февраль хоть и короткий месяц, но мы много чего успели:
0. Готовим кое-что новое и крутое 😉
1. Упростили процедуру регистрации — теперь не придется городить сложные пароли
2. Исправили 50+ багов по задачам, добавили новые разборы и решения
3. Добавили несколько задач и тестовых заданий с собеседований
А также:
+ Тот самый Глеб Михайлов застримил у нас со своими леопардами 👉🏻 https://vk.cc/cbz2Hn
+ Собрали почти 30К просмотров и 100 комментариев на Хабре и все это на одной статье 👉🏻 https://vk.cc/cbz2OY
Stay tuned! 🙂
🔥4👍2
💥Тотальный код ревью - разбираем решение на Python
Рассмотрим задачу:
Дан массив целых чисел
Пример:
Дано:
Кстати, попробуйте решить задачку сами 👉 https://vk.cc/cbz9ba
✅ Решение, которое предложил пользователь:
1. Избавимся от range
Начнем немного с конца. В последнем цикле пользователь предлагает цикл по
В целом, это логично - длина массивов
Сцепим два списка с помощью
2. Избавимся от лишних циклов
Вообще говоря, столько циклов тут и не нужно. Пользователь сначала пробегает по первой части списка, занося нужные элементы в новый список
Сходу в голову приходят 2 варианта:
- Пробежаться в цикле 1 раз и добавить проверку
1 вариант:
2 вариант:
Так давайте избавимся от них с помощью слайсинга и функции
3. Наведем красоту
Помимо исправлений по коду, несколько замечаний про внешнее оформление кода.
— Задание массивов лучше не растягивать на 3 строки, а оформить в виде одной:
Рассмотрим задачу:
Дан массив целых чисел
nums размерности 2n. Элементы массива расположены в следующем порядке: [x1, x2, ..., xn, y1, y2, …, yn]. Необходимо преобразовать массив к виду [x1, y1, x2, y2, …, xn, yn].Пример:
Дано:
nums = [2, 5, 1, 3, 4, 7], n = 3
Результат: [2, 3, 5, 4, 1, 7]
Давайте разберем решение одного из пользователей нашей платформы и сделаем его тотальный код-ревью. Кстати, попробуйте решить задачку сами 👉 https://vk.cc/cbz9ba
✅ Решение, которое предложил пользователь:
class Answer:Отметим, что поставленную задачу этот код действительно решает. Однако многое тут можно оптимизировать.
def shuffle(self, nums, n):
p = []
p1 = []
tot = []
for i in nums[0:n]:
p.append(i)
for i in nums[n:]:
p1.append(i)
for i in range(len(p)):
tot.append(p[i])
tot.append(p1[i])
return tot
1. Избавимся от range
Начнем немного с конца. В последнем цикле пользователь предлагает цикл по
i с помощью range(len(p)). В целом, это логично - длина массивов
p и p1 одинаковая, так что ошибок здесь нет. Но это же код на Python - давайте перепишем его на питонячем!Сцепим два списка с помощью
zip и проитерируем по ним одновременно. А чтобы пополнить список tot на очередной итерации, просто используем «+=». for el1, el2, in zip(p, p1):Можете проверить - результат будет такой же.
tot += [el1, el2]
2. Избавимся от лишних циклов
Вообще говоря, столько циклов тут и не нужно. Пользователь сначала пробегает по первой части списка, занося нужные элементы в новый список
p. Далее он делает аналогично с p1. Сходу в голову приходят 2 варианта:
- Пробежаться в цикле 1 раз и добавить проверку
if
- Сцепить 2 подмассива1 вариант:
for i, el in enumerate(nums):Тут у нас опять 2 массива. Чтобы от них избавиться, можно заглядывать «немного вперед»:
if i < n:
p.append(el)
else:
p1.append(el)
for i, el in enumerate(a):Но и тут как будто что-то не то. Немного смущают индексы.
if i < n:
tot += [el, a[i+n]]
2 вариант:
Так давайте избавимся от них с помощью слайсинга и функции
zip:for a, b in zip(nums[:n], nums[n:]):Вот это уже получше. Мы сразу избавились от 2 лишних циклов и от 2 дополнительных списков.
tot += [a, b]
3. Наведем красоту
Помимо исправлений по коду, несколько замечаний про внешнее оформление кода.
— Задание массивов лучше не растягивать на 3 строки, а оформить в виде одной:
p, p1, tot = [], [], []
— Между некоторыми блоками кода есть 2 пустые строки. Это не соответствует PEP8👍20
🗣 А где вы размещаете свое резюме?
Поиск работы - занятие очень интересное 😅 Расскажите - а где вы размещаете свое резюме? Используете только сайты с вакансиями (типа ХХ) или также задействуете профильные платформы (гитхаб, линкедин, твиттер и прочие)?
Кстати, если мы забыли какой-то вариант - поделитесь в комментариях 🙂
Поиск работы - занятие очень интересное 😅 Расскажите - а где вы размещаете свое резюме? Используете только сайты с вакансиями (типа ХХ) или также задействуете профильные платформы (гитхаб, линкедин, твиттер и прочие)?
Кстати, если мы забыли какой-то вариант - поделитесь в комментариях 🙂
🔥1
Где у вас размещено резюме?
Anonymous Poll
80%
35%
LinkedIn
5%
Superjob
3%
14%
Хабр Карьера
6%
GitHub
1%
Facebook
3%
Свой сайт
9%
Сторонние сервисы
👍2
🔥 3 уровня использования map в Python
0. Базовая информация
* Встроенная функция
* Результат такой функции - итератор.
* Чтобы получить из итератора список с результатом - используйте функцию
Задача:
Дан список, состоящий из строк. Нужно убрать пробелы из начала и конца каждой строки.
Решение:
А как насчет обработки сразу нескольких итерируемых объектов? Легко!
Задача:
Даны 2 списка -
Решение:
► Задачки по программированию и аналитике: IT Resume
0. Базовая информация
* Встроенная функция
map(<function>, <iterable>) используется для применения функции <function> к каждому элементу итерируемого объекта <iterable> (например, списку или кортежу).* Результат такой функции - итератор.
* Чтобы получить из итератора список с результатом - используйте функцию
list(): list(map(<function>, <iterable>))
1. Классическое использованиеmap - это кусочек функционального программирования в Python. Поэтому чаще всего ее используют вместе с лямбда-функциями. Задача:
Дан список, состоящий из строк. Нужно убрать пробелы из начала и конца каждой строки.
Решение:
list(map(lambda x: x.strip(), [' IT ', ' Resume ']))
# ['IT', 'Resume']
2. Продвинутое использованиеА как насчет обработки сразу нескольких итерируемых объектов? Легко!
Задача:
Даны 2 списка -
numbers и powers. Необходимо возвести numbers[i] в степень powers[i]. Решение:
numbers = [2, 3, 4]
powers = [0, 1, 2]
list(map(lambda x, y: x**y, numbers, powers))
# [1, 3, 16]
- - - ► Задачки по программированию и аналитике: IT Resume
👍20
🔥 Как правильно именовать объекты в Python?
1. Какие стили именования вообще бывают?
*
*
*
*
*
2. Как выбрать стиль для конкретного объекта?
Просто руководствуйтесь общим правилом:
* модули -
* Легко читаемыми: userToken
* Не слишком длинными: не userApiAccessToken, а userToken
* Достаточными для передачи смысла: token - слишком общее название, лучше уточнить - userToken или accessToken
* Общие имена тоже можно использовать, но только если из контекста и так все ясно. Например:
4. Как лучше - 'create\_user' или 'user\_creation'?
И тут есть парочка полезных рекомендаций:
* функции и методы → глаголы:
В именовании переменных есть волшебное правило, которое покрывает абсолютно все ситуации. И состоит оно всего из 3 пунктов:
* Названия должны быть такими, чтобы однозначно было понятно, что это и что там лежит
* Стили именования должны быть согласованы: можете использовать любой стиль, главное не мешайте их между собой
* Исключения из правил есть. Всегда. Например, shouldHideMobileMenu - и никуда тут не деться
В конце концов, руководствуйтесь здравым смыслом 😉
- - - - -
► Задачки по программированию и аналитике: IT Resume
1. Какие стили именования вообще бывают?
*
camelCase - первая буква первого слова маленькая, остальные - большие*
PascalCase или UpperCamelCase - все первые буквы большие*
snake_case - все маленькие, слова разделены _*
kebab-case - все маленькие, слова разделены -*
UPPER_SNAKE_CASE - все большие, разделены _2. Как выбрать стиль для конкретного объекта?
Просто руководствуйтесь общим правилом:
* модули -
snake_case
* классы - PascalCase
* функции/методы - snake_case
* переменные - snake_case или camelCase
* константы - UPPER_SNAKE_CASE
3. А какими должны быть имена переменных? * Легко читаемыми: userToken
* Не слишком длинными: не userApiAccessToken, а userToken
* Достаточными для передачи смысла: token - слишком общее название, лучше уточнить - userToken или accessToken
* Общие имена тоже можно использовать, но только если из контекста и так все ясно. Например:
def update_user(self, data):* Сокращения можно использовать только если переменная исчезает мгновенно. Например:
[self.user[k] = data[k] for k in data.keys()]
lambda a: a**2. 4. Как лучше - 'create\_user' или 'user\_creation'?
И тут есть парочка полезных рекомендаций:
* функции и методы → глаголы:
update_user, create_record
* булевые функции/переменные отвечают на вопрос «да/нет»: isGuest, shouldClear, hasRights, canAccess
* коллекции - множественное число: random_words, users_list
5. Универсальное правилоВ именовании переменных есть волшебное правило, которое покрывает абсолютно все ситуации. И состоит оно всего из 3 пунктов:
* Названия должны быть такими, чтобы однозначно было понятно, что это и что там лежит
* Стили именования должны быть согласованы: можете использовать любой стиль, главное не мешайте их между собой
* Исключения из правил есть. Всегда. Например, shouldHideMobileMenu - и никуда тут не деться
В конце концов, руководствуйтесь здравым смыслом 😉
- - - - -
► Задачки по программированию и аналитике: IT Resume
👍8🔥5
Расширяем свои знания в Python с помощью совместного материала с Selectel.
В новых карточках собрали 7 способов использовать функцию zip в Python.
Эта функция создает несколько кортежей из элементов коллекций, которые были ей переданы. Сегодня подробно рассмотрим, как обрабатывать коллекции разной длины, создавать словари и даже транспонировать матрицы с помощью zip.
В новых карточках собрали 7 способов использовать функцию zip в Python.
Эта функция создает несколько кортежей из элементов коллекций, которые были ей переданы. Сегодня подробно рассмотрим, как обрабатывать коллекции разной длины, создавать словари и даже транспонировать матрицы с помощью zip.
🔥19👍6😢1
🔥 Сортировка в Python - не все так просто
Часто возникает потребность отсортировать список. Многие используют для этого метод
1. In-place сортировка
Метод
Если вы попробуете отсортировать составной список, то вы получите ошибку. Например:
3. Кастомная сортировка
Хотите написать гибкий «сортер»? Для начала определите правило сортировки.
Несколько примеров таких правил:
* Сортируем по длине каждого элемента (число - длина 1, список - определяем длину списка)
* Если элемент простой (например, число), то берем его строковое отображение. Если элемент составной (например, список), то берем строковое отображение первого элемента
* Каждый элемент отображаем в виде строки и сортируем в лексикографическом порядке
* Сортируем по типам и по-отдельности для каждого типа данных
Пример реализации последнего подхода:
- - - - -
► Задачки по Python и не только: IT Resume
Часто возникает потребность отсортировать список. Многие используют для этого метод
sort:arr = [1, 3, 2]Но с этим методом не все так просто 😕
arr.sort()
print(arr)
# [1, 2, 3]
1. In-place сортировка
Метод
sort выполняет сортировку in-place. Другими словами, вы получаете не новый отсортированный список, а измененный исходный. Сам по себе метод возвращает None. По очевидным причинам, это не всегда удобно. arr = [1, 3, 2]2. Сортировка составного списка
print(arr.sort())
# None
print(arr)
# [1, 2, 3]
Если вы попробуете отсортировать составной список, то вы получите ошибку. Например:
arr = ['s', 'p', [[1], [2, 3]], 'isok', 2]Это вполне логично, потому что как сравнить строку и список - совершенно непонятно. Поэтому метод sort в таких ситуациях нам не поможет.
# TypeError: '<' not supported between instances of 'list' and 'str'
3. Кастомная сортировка
Хотите написать гибкий «сортер»? Для начала определите правило сортировки.
Несколько примеров таких правил:
* Сортируем по длине каждого элемента (число - длина 1, список - определяем длину списка)
* Если элемент простой (например, число), то берем его строковое отображение. Если элемент составной (например, список), то берем строковое отображение первого элемента
* Каждый элемент отображаем в виде строки и сортируем в лексикографическом порядке
* Сортируем по типам и по-отдельности для каждого типа данных
Пример реализации последнего подхода:
arr = ['s', 'p', [1], [2, 3], 'isok', 2]Здесь уже все зависит от вашей фантазии и навыков программирования 😉
# создаем словарь, разбивая все по типам данных
res = {}
for el in arr:
el_type = type(el)
if el_type not in res:
res[el_type] = []
res[el_type].append(el)
# сортируем для каждого типа отдельно
for k, v in res.items():
res[k] = sorted(v)
# формируем итоговый список
res = [el for subarr in res.values() for el in subarr]
print(res)
# ['isok', 'p', 's', [1], [2, 3], 2]
- - - - -
► Задачки по Python и не только: IT Resume
🔥11👍2
7 ошибок в коде на Python, которые flake8 вам точно подсветит 😢
Предлагаем простое упражнение: откройте любой свой код, запустите линтер (flake8) и посмотрите - какие ошибки он вам покажет. Уверены, что в большинстве случаев вы встретите 7 ошибок, описанных ниже.
Если вдруг ваш код уже вычищен, прошел code review и готов к продакшену - то просто откройте другой код :)
* trailing whitespace
Если ваша строка заканчивается не переносом строки, а пробелом - линтер вам об этом скажет.
* expected 2 blank lines, found 0
Отделили класс от другого кода не двумя строками, а одной? Непорядок.
* unexpected spaces around keyword / parameter equals
Если вы указываете аргументы по умолчанию, то вокруг знака = не должно быть пробелов.
* line too long (107 > 79 characters)
Наверняка у вас есть слишком длинные строки. Комментарии, длинные лямбда-выражения или много аргументов в функции. Flake8 вам об этом незамедлительно сообщит.
* blank line contains whitespace
Иногда в пустые строки, отделяющие части кода друг от друга, закрадываются лишние пробелы. Мелочь, но и это тоже будет подсвечено.
* block comment should start with '# '
Если вы написали однострочный комментарий - не забудьте поставить пробел после #.
* too many blank lines (3)
Все мы любим добавлять "воздуха" в код, чтобы отделять блоки друг от друга. Однако, это не всегда соответствует правилам - будьте осторожней.
Итог
Всегда ли нужно исправлять эти ошибки? Не всегда. Главное - подходить с умом и не игнорировать замечания линтера, если они действительно имеют смысл.
Кстати - хотите больше интересных материалов про code review, статический анализ и линтеры? 😏
- - - - - - - - - - -
► Тест на знание PEP8 и правил оформления кода: IT Resume
Предлагаем простое упражнение: откройте любой свой код, запустите линтер (flake8) и посмотрите - какие ошибки он вам покажет. Уверены, что в большинстве случаев вы встретите 7 ошибок, описанных ниже.
Если вдруг ваш код уже вычищен, прошел code review и готов к продакшену - то просто откройте другой код :)
* trailing whitespace
Если ваша строка заканчивается не переносом строки, а пробелом - линтер вам об этом скажет.
* expected 2 blank lines, found 0
Отделили класс от другого кода не двумя строками, а одной? Непорядок.
* unexpected spaces around keyword / parameter equals
Если вы указываете аргументы по умолчанию, то вокруг знака = не должно быть пробелов.
* line too long (107 > 79 characters)
Наверняка у вас есть слишком длинные строки. Комментарии, длинные лямбда-выражения или много аргументов в функции. Flake8 вам об этом незамедлительно сообщит.
* blank line contains whitespace
Иногда в пустые строки, отделяющие части кода друг от друга, закрадываются лишние пробелы. Мелочь, но и это тоже будет подсвечено.
* block comment should start with '# '
Если вы написали однострочный комментарий - не забудьте поставить пробел после #.
* too many blank lines (3)
Все мы любим добавлять "воздуха" в код, чтобы отделять блоки друг от друга. Однако, это не всегда соответствует правилам - будьте осторожней.
Итог
Всегда ли нужно исправлять эти ошибки? Не всегда. Главное - подходить с умом и не игнорировать замечания линтера, если они действительно имеют смысл.
Кстати - хотите больше интересных материалов про code review, статический анализ и линтеры? 😏
- - - - - - - - - - -
► Тест на знание PEP8 и правил оформления кода: IT Resume
👍5🔥2
🔥 Почему COALESCE в SQL - это важно?
Пример:
* Ситуация 1
Вы делаете email-рассылку по базе клиентов. У некоторых в поле fio стоит пропуск - таким людям придет письмо:
Вы делаете аналитику по товарам и используете функцию
Подробно разобрали
- - - - - - - - - -
► Подборка интересных задач по SQL: IT Resume
COALESCE - это функция, которая вычисляет по порядку каждый из своих аргументов и на выходе возвращает значение первого аргумента, который был не NULL.Пример:
SELECT COALESCE(NULL, NULL, 1, NULL)Применяется ли это на практике? Конечно! Рассмотрим 2 ситуации:
# 1
* Ситуация 1
Вы делаете email-рассылку по базе клиентов. У некоторых в поле fio стоит пропуск - таким людям придет письмо:
Добрый день, !
Несолидно, согласитесь? С помощью COALESCE эта проблема решилась бы элементарно:COALESCE(fio, 'дорогой друг')* Ситуация 2
# Добрый день, дорогой друг!
Вы делаете аналитику по товарам и используете функцию
COUNT(col). На основании вашего отчета начальство потом принимает важные решения. Но вы-то забыли, что COUNT(col) проигнорирует значения NULL...Подробно разобрали
COALESCE и что у нее под капотом в нашей статье 👉🏻 Синтаксический сахар SQL: функция COALESCE. - - - - - - - - - -
► Подборка интересных задач по SQL: IT Resume
🔥10👍3
🔥 Вакансия Python/Go Developer (Middle/Senior) в Akvelon
Наши друзья из Akvelon прислали свежую вакансию для питонистов. Выглядит соблазнительно 😏
Вилка: от 2500$ до 3700$
Опыт: от 3+ лет
Английский язык В1-В2+
Релокация с оф.трудоустройством в Сербии, Польше, Грузии или Армении.
Занятость: full-time, офис
Требования:
* Опыт работы с Go, Python, Scala, Java
* Знание GraphQL, REST, HTTP и возможности разработки поддерживаемых API
* Опыт разработки и внедрения производительных, стабильных и удобных в сопровождении интерфейсов API
Для отклика просто нажмите кнопку 👇🏻
Наши друзья из Akvelon прислали свежую вакансию для питонистов. Выглядит соблазнительно 😏
Вилка: от 2500$ до 3700$
Опыт: от 3+ лет
Английский язык В1-В2+
Релокация с оф.трудоустройством в Сербии, Польше, Грузии или Армении.
Занятость: full-time, офис
Требования:
* Опыт работы с Go, Python, Scala, Java
* Знание GraphQL, REST, HTTP и возможности разработки поддерживаемых API
* Опыт разработки и внедрения производительных, стабильных и удобных в сопровождении интерфейсов API
Для отклика просто нажмите кнопку 👇🏻
👍3