DevIO | IT | GameDev – Telegram
DevIO | IT | GameDev
31 subscribers
9 photos
3 videos
1 file
18 links
Привет! Я разработчик, а это мой авторский канал про АйТи и разработку.

Автор: Панкрашов Дмитрий
Сайт: https://dev-io.ru
Download Telegram
Channel created
Про начало карьеры и обучение в IT

Первой моей серьезной работой была региональная электросетевая компания. Несмотря на то, что диплом был получен по специальности "Информационная безопасность", устроился все же в ИТ-отдел. Если вы не знаете, то ИТ-отделы на предприятиях - это такие ребята, которые чинят всё. От мышек и картриждей до сетей и серверов. Заниматься приходилось настолько "всем", что однажды даже пришлось оклеивать таблички с должностью и Ф.И.О. для кабинетов менеджмента разной величины. Со временем стало понятно, что на такой работе много денег не заработать. Нервный тик - запросто, а вот деньги - это вы не по адресу обратились. Что делать в такой ситуации? Уходить! Куда? В разработку! Там и интересенее, и задачи масштабнее, и платят больше. И "работа отсюда и до обеда" как-то реже встречается, по субъективным ощущениям.

С разработкой в целом я связался гораздо раньше. История знакома многим: искрене полюбил игровые приставки в детстве, в школе начал изучть BASIC (QBASIC под DOS), потом началась эпоха игр на свежеприобретенном родителями компьютере, с появлением интернета (через телефонную линию и модем) познакомился с вебом, PHP, HTML, затем кто-то принес в школу распечатки статей по Linux (это же система для хакеров!), основы C++, C# и SQL изучил уже в университете. То есть бэкграунд на момент выхода из института был, но течением занесло именно в ту, "другую" айтишку.

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

Сейчас, на момент написания этого поста, я работаю в Сбере Python-разработчиком. С момента увольнения из электроэнергетики и начала карьеры разработчика прошло более 7 лет, IT-индустрия сильно изменилась, появилось больше направлений для развития, да и само обучение стало самостоятельным направлением бизнеса, а слово "вайтишник" стало мемом.

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

#мюсли
1🔥1
❤‍🔥1👍1
Курица не птица, 1Сник не программист?

Слышали шутку "На паралимпиаду по программированию приглашаются программисты 1С"? Бытует мнение, что 1С - это не программирование, и есть какое-то другое, настоящее программирование, где на созвонах молоденькие девочки HRы только топлес обсуждают сложные архитектурные вопросы, а не "как сформировать отчёт". Я несколько лет работал в своеобразном франчайзи (правда мы внедряли и допиливали не 1С, а систему электронного документооборота Directum), и таки имею шо сказать за описываемое явление.

Вкратце - оно называется "прикладная разработка". Есть веб-программирование (с ним все понятно, REST'ы, CRUD'ы и т.д.), системное программирование (чтобы это не значило), и прикладное. Прикладным оно называется в том числе и потому, что обычно результаты такого программирования используются в какой-то прикладной области. Прикладное программирование тоже бывает разным. В 1С, например, пишут на своем, специальном языке, который так и называется "Язык программирования 1С". Directum старых версий тоже использовал свой собственный язык для доработок системы, в новой версии переехали на C#.

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

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

Во-вторых, скилы и доход. С опытом и преодоленными проблемами на проектах растут способности конкретного специалиста, а также его ценность для компании, что, в свою очередь, влияет на зарплату. Слышал даже, что франчайзи, занимающиеся 1С-Битрикс, со старта предлагаю ЗП в 1.5-2 раза выше, чем в вакансиях по какому-нибудь Пайтону. Чем выше зарплата и уровень жизни, тем сложнее от этого отказаться. С переходом в другую область (другой стек, язык) возможно снижение дохода на какое-то время. А ведь, возможно, до успешной попытки перехода нужно еще дойти, вложившись в свое обучение.

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

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

#мюсли
👍2🔥1
Про то, как ChatGPT заменит программистов

Любителям рассказывать о том, что скоро ИИ заменит <профессия_name>, посвящается.

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

Как можно провалидировать написанный код, если ты не программист, а, скажем, маркетолог? Как понять, что учтены все пожелания? Что код отказоучстойчив? Что он обрабатывает ошибки? А никак. Либо применять выдачу ChatGPT как есть, и смотреть взлетит или не взлетит. Либо разбираться в вопросе. Вот тут автор хорошо постебал эффективных-кабанчиков-заменяльщиков-всех-на-ИИ.

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

#мюсли
👍2
Про No-Code и RPA

Вот представьте, сидят какие-то люди, например в фирме 1С, и эту самую 1С пишут. Или в Директуме. Или в <company_name>. А зачем? Ну ясен пень, чтобы продать какому-нибудь бизнесу. Но не просто продать и забыть, а продать хитро. Сначала лицензию. Потом обслуживание. Доступ к обновлениям. Ну а как вы хотели? Сливочное масло само в холодильнике не заведется, и на колбасу не намажется.

Однако бизнес-дяди, как-никак, с калькулятором, или на спичках, считать всё-таки умеют. И возникает у бизнес-дядь вопрос: может ли какой-нибудь IT-падаван Хуан снизить затраты на обслуживание ПО (по-умному это называется стоимостью владения), чтобы себестоимость производимого кубометра продукции тоже была пониже, а прибыль, как следствие, повыше? И тогда бизнес-дяди ищут решения вопросов. А в директумах и 1Сах сидят маркетологи, которые тоже жрать хотят, и хотят они бизнес-дядям рассказать, что, мол, есть решение! Мы его вот прямо вот сегодня для вас родили. И называется оно (блядь, вот аж самому смешно) No-Code разработка. Это как разработка, только без кода. Не дай Бог конечно эти маркетологи до порнохаба доберутся. А то и там no-penis лысых из brazzers ждать недолго.

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

Но на этом приключения не заканчиваются. Есть еще RPA-автоматизация. Это когда, цитирую "рутинные процессы выполняют программные роботы, а сотрудники освобождают время для творчества и созидания". В демо-примерах приводятся откровенно всратые кейсы, по типу "робот может за вас открыть почту и нажать кнопку". Чем они при этом от автокликера отличается, конечно же не объяснено. Да и в целом роботы помогают компании повышать ROI (коэффициент возврата инвестиций - сколько рублей вы получаете на 1 вложенный рубль). Короче, роботы делают бизнес эффективным, и позволяют сотрудникам не заниматься рутиной. Потому, что чем уволенный за ненадобностью человек будет заниматься Кабан Кабанычу как-то пофиг.

Что характерно - среды разработки RPA - это тоже No-Code среды, с отдельными блоками, где код все-таки можно и пописать.

Вливаться в эти стройные ряды, или нет - решать вам.

#мюсли
👍1
CodeWars #1

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

Например, CodeWars. Выбираете язык, сложность, и вперед. Есть еще LeetCode, HackerRank.

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

На сегодня предлагаю решение одной из задач.

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

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

",".join([1,2,3]) # 1,2,3


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

Для этого, во-первых, используем функцию isinstance(), она принимает два аргумента. Первый - объект какого-то типа, второй - тип, на соответствие которому мы хотим проверить объект. Функция вернет True если тип совпадет, и False, если нет. Также мы проверим, что список не пустой. В Python пустой список автоматически приводим к False, что исключает необходимость проверять на пустоту путём сравнения длины списка с нулём.

Итоговая функция на картинке к посту.

#codewars #python
👍1
CodeWars #2

Продолжаем решать задачи с CodeWars.

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

Например:

Дан список [34, 15, 88, 2], мы должны вернуть 2.
Дан список [34, -345, -1, 100], мы должны вернуть -345.
Список на пустоту можно не проверять.

В стандартной библиотеке Python предусмотрены различные функции, в том числе математические. В частности есть функции min() и max() для поиска минимального и максимального значения в списке. Функцией min() мы и воспользуемся. Наше решение будет простым, и лаконичным.

def find_smallest_int(arr):
return min(arr)

#codewars #python
👍1
Python для троллинга Java\C#\PHP разработчиков

Как известно, объектно-ориентированное прогаммирование, позволяет создавать объекты, вступающие друг с другом в отношения родитель-наследник.

Например:

class Cat:
pass

class BlackCat(Cat):
pass


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

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

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

Пример 1:

class Cat:
pass

class Dog:
pass

issubclass(Dog, Cat) # False - Собака не наследует кошку


Пример 2:

class Cat:
pass

class Dog(Cat):
pass

issubclass(Dog, Cat) # True - собака воспитана кошками


Собственно в Python есть возможность переопределить это поведение с помощью специального метода subclasshook, реализуемого в родительском классе.

Пример 3:

from abc import ABC

class Cat(ABC):
def __subclasshook__(cls, *agrs):
print(cls)
return True

class Dog:
pass


issubclass(Dog, Cat) # True
issubclass(int, Cat) # True - видели когда-нибудь целочисленных кошек?


Спасибо, Гвидо, что дал нам возможность жирно потроллить джавистов!

#python
😁2
CodeWars #3

Решаем следующую задачу: нужно подсчитать количество гласных в строке, которая нам дана в качестве аргумента. Считаем, что символы a, e, i, o, u это гласные. Входная строка будет состоять из символов в нижнем регистре (это важно, потому что в некоторых случаях требуется данные привести к какому-то виду) и пробелов.

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

def get_count(sentence):
# Список гласных букв
vowels = ["a", "e", "i", "o", "u"]

# Счетчик, инициализируем нулём
count = 0

# Цикл по строке, допустим для строки `hello` тело цикла выполнится пять раз
# На каждой итерации в переменной letter будет буква из строки
# Сначала h, потом e, потом l, и т.д.
for letter in sentence:
# Оператор in проверяет вхождение элемента letter в список vowels
# Если элемент присутствует - тело if выполнится
if letter in vowels:
# Инкрементируем (увеличиваем на 1) наш счетчик
count += 1

# Возвращаем значение счетчика
return count


А можно ли лаконичнее? Да!

def get_count(inputStr):
return len([x for x in inputStr if x in 'aeoiu'])


Здесь использован так называемый list comprehension - специальный синтаксис, который позволяет в одну строчку кода описать создание последовательности. Базово, он состоит из выражения
[x for x in inputStr]


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

digits = [1,2,3,4]

# Квадраты чисел в digits, операция ** (две звездочки) - возведение в степень
squares = [x**2 for x in digits]


Соответственно, как и в теле цикла, в list comprehension можно дописывать условие, чтобы отбраковать те элементы, которые нам не нужны. Делается это с помощью if.

digits = [1,2,3,4]

# Квадраты чисел в digits, операция ** (две звездочки) - возведение в степень
# В блоке if мы отбираем x только если он четный (% - остаток от деления, если он равен нулю - берем)
squares = [x**2 for x in digits if x % 2 == 0]


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

[x for x in inputStr if x in 'aeoiu']


Остается взять его длину с помощью функции len(), и вернуть. Кстати, знаете, почему значение, возвращенное функцией len() не проверяется на равенство с нулём, а просто возвращается как есть? Дело, опять же, в системе типов. Ноль приводится к False для целых чисел, все остальное - к True. Да и сами константы True и False в Python это целые числа. True = 1, False = 0. Поэтому выражение 1 + True будет равно 2.

#codewars #python
👍1
Codewars #4

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

Пример: для списка [19, 5, 42, 2, 77] функция вернет 7 (5 + 2).

Итак, у нас есть функция:
def sum_two_smallest_numbers(numbers):
pass


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

first_num = 0
second_num = 0
for i in numbers:
if not first_num:
first_num = i

if first_num < i:
first_num = i

for i in numbers:
if not second_num:
second_num = i

if second_num >= first_num and second_num < i:
second_num = i


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

Есть решение лучше - сортировка! Отсортируем список по возрастанию и просто вернем сумму двух первых элементов!

def sum_two_smallest_numbers(numbers):
numbers = sorted(numbers)
return numbers[0] + numbers[1]

#codewars #python
👍1
Про настольные приложение

Когда я начинал изучать C# в университете - мы начинали с написания настольных приложений. Тем более что встроенный WIndows Forms был вообще не сложен в освоении. И даже в методичках по базам данных были примеры того UI, который нужно реализовать. Сейчас, в связи с тем, что появилось некоторое разделение на front-end и back-end писать UI (как по мне) стали больше для web-приложений. Но иногда бывает нужно сделать настольное приложение. В статье рассказываю о том, как сделать такое GUI-приложение в golang.

А вообще, если интересует UI для Python но неохота заморачиваться с HTML - можно посмотреть в сторону PyQt. Qt - кроссплатформенный фреймворк. Его можно много куда затащить (даже в тот же golang). Из минусов - скорее всего снова придется писать много кода.

#golang #gui
👍1
Интересный случай

Пишет мне как-то Женя. Этой мой коллега, вместе мы работали еще в Астраханьэнерго. Сейчас он в Берлине. Скидывает, значит, скриншот переписки с неким человеком. Человек интересуется - знает ли Женя владельца аккаунта на гитхабе. И скидывает ссылку на мой аккаунт, со словами, дескать, этот Дмитрий взял заказ и деньги, а теперь на связь не выходит!

Ну что за дела, думаю. Деньги я люблю, работать нет, тут все сходится. Но чтобы я взял деньги и на связь не выходил - отродясь такого не было. Если бы фигню всякую писал - то да, похоже, а так - я не я, лошадь не моя. Будем разбираться. Прошу Женю дать страдальцу мой контакт для прямой связи. Пишет. Разместил, мол, заказ на Хабр.Фрилансе, помощь была нужна с ВКР (выпускная квалификационная работа). В заказе был указан телеграм-аккаунт, куда постучался потенциальный исполнитель. Представился Дмитрием, показал документ-портфолио, со ссылкой на МОЙ гитхаб аккаунт, взял десять тысяч рублёв, а теперь на связь не выходит, и везде заблокировал.

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

1. Общаться с исполнителем за пределами фриланс-площадки.
Исполнитель удалит переписку, и всё. Ничего не докажешь, если только ежесекундно не делать скрины. Но кто так делает? Никто. Общаться в tg можно, но все важные детали по проекту\заказу лучше обсуждать там, где условия контролируемы. Кроме того, фриланс-площадки охотнее встанут на сторону заказчика, чем исполнителя. Деньги-то им заказчик несет.

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

3. Не пользоваться безопасной сделкой.
Безопасные сделки для этого и придуманы. Заказчик переводит сумму на счет фриланс-площадке, выступающей в роли брокера. Исполнитель знает, что заказ оплачен, но деньги он получит после сдачи работы. Страховка и для заказчика и для исполнителя.

Ну и на последок. Как понять, что кто-то выдает себя за меня? Топ-5 red flag`ов:
1. Слишком вежлив, сообщения без мата.
2. Ни разу не ругал Директум.
3. Маленькая сумма сделки.
4. Не шлет мемы с Буруновым в переписке.
5. Ни разу не призвал уверовать в Директум.

#мюсли
🔥1
Про гарантии трудоустройства

Есть на IT-курсах (но не на всех) такая фишка - вы, мол, курс наш пройдите, а мы вас трудоустроим. Мамой клянусь, век созвонов не видать! Возможность востребованная, и даже может служить киллер-фичей. Джунам, ни дня не работавшим в IT, устроиться тяжело. Работодатели учить никого не хотят. Тем более, что на обучение нужно тратить время, деньги, и платить сотруднику зарплату, пока тот учится.

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

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

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

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

Во-первых, потому, что трудоустроят вас явно не в Google/Yandex/Sber/Ozon, а на галеру, которая согласна брать начинающего специалиста без внятных перспектив его развития. Ну и с соответствующими условиями оплаты.

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

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

Первым звоночком была опечатка в заявлении о приеме на работу. Человек написал “Прошу принять на должность инжИнера”. Я вот этот текст пишу, и у меня слово инжИнер подчеркнуто красным. Неужели в Ворде так сложно исправить? 

Второй (и собственно последний) звоночек - выписка из электронной трудовой. Человек за 4 года сменил примерно 20 мест работы, работая везде от 2-х недель до 2-х месяцев. А последним местом работы было троллейбусное депо, и должность “Водитель троллейбусов”. Причем, компании, указанные в резюме на HeadHunter, вообще не совпадали с записями в трудовой. На вопрос “Что это, собственно, за Харитон Ульяна Йозеф Николай Яков?” внятных разъяснений не последовало, а посему в заключении трудового договора было отказано.

#мюсли
❤‍🔥1👍1