Девман для питонистов
532 subscribers
144 photos
3 videos
186 links
Веб-разработка на Python. Канал от практиков.

Сайт школы Девман: https://dvmn.org/
Контакт для связи: @yulya_devman
Download Telegram
Обязательной частью онлайн курса «Профессия Middle Python/Django разработчик» от Devman является стажировка на коммерческом проекте. Стажировка подходит внутри нашей компании, в соседнем подразделении. В этом году подразделение заказной разработки получило свое название PelidTeam, логотип и и отдельный сайт

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

🚀 Звездолёты
PelidTeam практически не занимается простыми типовыми проектами. Большинство проектов — это разработка с нуля, сложные, высоконагруженные веб-сервисы. И уровень наших выпускников как раз позволяет такие продукты делать. Большинство стажеров уже в течение первых двух месяцев получают не просто задачи по исправлению мелких багов, но разрабатывают новые фичи, активно участвуют в проектировании.

📈 Активный рост
PelidTeam за прошедший год вырос в 10 раз по выручке. За последние 3 месяца 10 выпускников Devman устроились к нам в компанию как бэкенд-разработчики на фулл-тайм. Это около 30% от количества выпускников, прошедших стажировку за прошедший год.

⚡️Своя методика
Как и в обучении, мы не пошли обычным путем и разработали свою методику для проектирования и управления разработкой ПО. Методика получила название ProductFlow и, если вы будете участвовать в стажировке, то познакомитесь с ней. ProductFlow позволяет объективно отслеживать прогресс, проводить приемку работ, описывать контекст задачи и прорабатывать критически важные детали. ProductFlow позволяет разрабатывать большие и сложные программные продукты, удобные пользователю.

🧑‍💻Трудоустройство
Мы ценим сообщество, которое образовалось вокруг курсов Devman, и при найме отдаем предпочтение именно нашим ученикам. Сообщите нам, если заинтересованы стать частью постоянной команды PelidTeam.

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

➡️ А пока рекомендуем присоединиться и послушать дискуссию о влиянии AI на индустрию разработки ПО. В дискуссии участвуют Евгений Евсеев — учредитель и технический директор компании, и Артем Каменев — операционный директор PelidTeam

Подключиться можно по ссылкам:
- Трансляция на Ютуб
- Ретрансляция на VK (появится в группе автоматически)
🔥8👍3
❗️ Вчера мы обсудили влияние AI на индустрию разработки ПО

Говорили о:

⚡️ Реальности угрозы замены программистов на AI на базе o1
⚡️ Изменении роли программиста в связи с появлением подобных систем и навыках, которые потребуются разработчикам в будущем
⚡️ Ограничениях у AI на базе o1 в контексте реальной разработки ПО
⚡️ Возможных изменениях на рынке труда программистов в ближайшие 5-10 лет
⚡️ Стратегии адаптации для разработчиков, чтобы оставаться востребованными в новых условиях

Делимся ссылками на записи трансляции для тех, кто не смог подключиться вчера!
Запись на YouTube
Запись в VK

Позже будет текстовая версия на Хабре. Мы пришлем ссылку на нее.

Были вчера на дискуссии? Делитесь впечатлениями в комментариях ➡️
🔥1
А вы уже разобрались как работают операторы is и == в Python?

Выберите вариант ответа, не запуская код:

a = 5
b = 5
c = 16789
d = 16789
print(a == b, a is b, sep=', ')
print(c == d, c is d, sep=', ')


➡️ Пишите в комментариях, почему выбрали именно этот вариант, а мы вернемся завтра с правильным ответом и описанием механизма работы операторов!
🔥1
К сожалению, опросник не поддерживает форматирование с переносом строк, поэтому продулирую сюда более читаемые варианты:
Вариант А.
>>>print(a == b, a is b, sep=', ')
True, False
>>> print(c == d, c is d, sep=', ')
True, False

Вариант B.
>>>print(a == b, a is b, sep=', ')
True, True
>>> print(c == d, c is d, sep=', ')
True, False

Вариант C.
>>>print(a == b, a is b, sep=', ')
True, True
>>> print(c == d, c is d, sep=', ')
True, True
🔥1
🥳 Итак, правильный ответ - B!

Оператор == вызывает магический метод __eq__() объекта и проверяет равенство значений объектов. Если этот метод не реализован у кастомного класса объектов, то == по умолчанию сравнивает адреса памяти двух объектов, т.е. проверяет идентичность объектов. А значит, результат сравнения может быть неожиданным для программиста.

c = 16789
d = 16789
>>> print(c == d)
True

Оператор is проверяет идентичность объектов. В Python все является объектом, а каждый объект размещается в памяти по определенному адресу. Оператор is проверяет, ссылаются ли две переменные на один и тот же объект в памяти. Для проверки адреса, используйте функцию id():

>>> id(a)
9776800
>>> id(b)
9776800
>>> id(c)
139766195519312
>>> id(d)
139766195945264


Но почему же c и d указывают на разные объекты в памяти, а a и b на один и тот же? Здесь включается механизм интернирования объектов Python, иначе он называется кэшированием объектов.

Для экономии ресурсов самые часто используемые объекты хранятся в фиксированном месте памяти в единственном экземпляре. Пример — сколько бы переменных вы не создали со значением 2, все они будут привязаны к одному и тому же адресу памяти. По умолчанию в CPython интернируются следующие типы объектов:
- None,
- True, False
- простые строки
- числа от -5 до 256

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

>>> str1 = 'hello world'
>>> str2 = 'hello world'
>>> str1 is str2
False
>>> str1 = intern(str1)
>>> str2 = intern(str2)
>>> str1 is str2
True


Рекомендуется использовать оператор is для сравнения с None вместо оператора ==. Он не только быстрее, поскольку сравнивает адреса памяти, но и безопаснее, поскольку не зависит от логики каких либо методов __eq__() класса.

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

c = 5
d = 3

if c > d is True:
do_something()

# высушим код, но получим тот же результат
if c > d:
do_something()

result = c > d # True


Подведем итоги:
Используйте операторы Python == и != для сравнения равенства объектов.
Используйте операторы Python is и is not для сравнения с None. Сравнивать с None по адресу памяти быстрее и безопаснее, чем с помощью методов класса.
Используйте операторы Python is и is not, если хотите сравнить идентификатор объекта, т.е. указывают ли переменные на один и тот же адрес в памяти
Избегайте сравнений с True/False, используйте готовые результаты логических операций, чтобы высушить код.
🔥4
Курсам Девмана уже 8 лет. Изначально они появились как решение собственной проблемы дефицита программистов для заказной разработки, необходимости долго и дорого дообучать новых сотрудников. Поэтому в приоритете было качество и высокая доходимость до конца.

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

➡️ Шаги и модули. Добавили в уроки шаги — сложность снизилась. Разбили уроки на тематические мини-курсы. Проходить стало легче, но ученики часто терялись, учились медленно, часто забрасывали.

➡️ Менторы. Прорыв случился в 2021 году, когда мини-курсы объединили в единый трек и добавили менторов. Доходимость ступени курса «Профессия Middle Python/Django разработчик» длительностью 5 месяцев увеличилась до 60% даже с учётом времени ожидания код-ревью, локальных проблем с уроками и проектами при доработке курса и из-за изменений условий использования сторонних веб-сервисов, используемых в уроках.

➡️ Проблема выделения времени. И все ещё ученики уходят с курса по схожим причинам — не выделяют время на обучение, теряют мотивацию и силы.

С менторами собрали частные ошибки, которые значительно влияют на на шансы дойти до конца курс:
👍1
Обязательная часть техинтервью — Live coding. Live coding позволяет дать оценку способности кандидата разбираться с основными концепциями языка или фреймворка, применять алгоритмический подход к решению задач, а также оценить навыки отладки и тестирования кода. И один из самых распространенных видов задач — алгоритмические. И тут важно регулярно тренироваться, т.к. такие задачки не встречаются в реальной практике и нужно набить руку для успешного прохождения собеса.

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

☑️ Задача

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

👉 Примеры палиндромов:
«Шалаш»
«А роза упала на лапу Азора»
«И темен город. Мороз, узором дорог не мети»
«Кинь лед зебре, бобер — бездельник!»

➡️Рекомендации для нашего интерактива и для реального собеса:
Постарайтесь решить задачу без импортов библиотек, даже стандартных – на собеседованиях они часто запрещены
Не забудьте про нейминг и чистоту кода
Задайте вопросы, если не до конца понятна задача или критерии приемки
Не жульничайте — попытка загуглить решение или воспользоваться ChatGPT может закончится разоблачением и провалом собеса
Смотреть документацию можно
По возможности добавьте тесты, хотя бы те же assert
🔥3
☑️ Возвращаемся к вам с нашим вариантом решения:

def is_palindrome(input_line: str) -> bool:
cleared_line = ''.join([symbol for symbol in input_line.lower() if symbol.isalpha()])
return len(cleared_line) > 1 and cleared_line == cleared_line[::-1]

test_palindromes = [
'Шалаш',
'А роза упала на лапу Азора',
'И темен город. Мороз, узором дорог не мети.',
'Кинь лед зебре, бобер - бездельник!',
]
test_not_palindromes = [
'Шалаши',
'12f21',
'Кинь лед зебре, бобер - крутой зверь!',
]

for palindrome in test_palindromes:
assert is_palindrome(palindrome)

for not_palindrome in test_not_palindromes:
assert not is_palindrome(not_palindrome)


Это не единственная возможная реализация решения.

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


У @LuSP7 получился отличный вариант, близкий к нашему. Вынос чистки от лишних символов в отдельную функцию приветствуем и оставляем обоим вариантам право на существование. Спасибо всем, кто поделился идеями здесь и в ВК!

На курсе «Профессия Middle Python/Django разработчик» мы готовим к прохождению технического интервью и разбираем похожие задачки.

➡️ Был опыт live coding на технических интервью? Делитесь своим опытом в комментариях!
👍1
⚡️ 17-19 октября примем участие в форуме Innovation week и расскажем о том, как сделать свою рабочую систему контрактов и не сойти с ума 🔥

От нас выступают спикерами Евгений Евсеев — основатель и технический директор Devman и Артем Каменев — операционный директор подразделения заказной разработки PelidTeam

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

🔣Дата мероприятия: 17-19 октября.

🔣Место: Москва, ВЭБ центр. Новинский бульвар д.31

➡️ Будете там же? Отмечайтесь в комментариях и увидимся на форуме!
🔥3
Каждый разработчик-бэкендер на Python умеет и регулярно пользуется Git-ом. В консоли, в десктопном клиенте или встроенным в IDE интерфейсе. Git позволяет управлять исходным кодом:
➡️ не перетирать изменения других разработчиков,
➡️ иметь несколько версий кода, смотреть предыдущие версии,
➡️ служит дополнительной документацией и помогает делиться кодом.

Об умении работать с Git спрашивают почти на каждом собеседовании на вакансию разработчика.

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

👉 Изучить работу с Git и Github можно в нашем мини-курсе
🔥51👍1