Сибирский Dev | IT survival
554 subscribers
286 photos
15 videos
7 files
86 links
Выживач в IT. Мои мысли по найму и работе в мире разработки.

Для связи @masian4eg
Download Telegram
👍 Генератор схем БД

Надоели ежедневные новости и подборки очередного ИИ инструмента, но это стоит того (сам попробовал, скрин прилагаю 😎)

Встала у вас задача создать приложение или перестроить схему БД, а может вы уже это сделали, но хочется себя проверить?

Заходим в Database Build, пишем обычным человеческим языком о чем ваше приложение - получаем готовую схему и миграции, PROFIT! 🌈

Я вот на примере Fibonacci написал небольшой промпт и схема на 95% сходится с текущей

Можно править, генерить фейковые данные, импортить из CSV и деплоить в Supabase в один клик ☕️
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4🤩2🦄1
😲SOLID ВСЕ?

На прошлой неделе услышал фразу от нашего лида: "Если в компании работают по SOLID, то бегите с их собеседования". Но я же учил, что это основа всех приложений... ☝️

Решил узнать еще мнений и понять - почему так?

🟢Принцип единственной ответственности
«У класса не должно быть более одной причины для изменения». Другими словами, у каждого класса должна быть только одна ответственность

class Calculate:
def add(a: int, b: int) -> int:
return a + b
def sub(a: int, b: int) -> int:
return a - b

Вроде бы ответственность у класса одна - вычислять, но тут 2 разных метода 🤔
На самом деле, этот принцип работает в моменте - что нужно от класса на данный момент (YAGNI). Но что, если через месяц бизнесу потребуется, чтобы мы добавили методы умножения и деления?... 😈

🟢Принцип открытости/закрытости
«Программные объекты должны быть открыты для расширения, но закрыты для модификации»

class Operation(Protocol):
def compute(self, a: int, b: int) -> int:
...

class Add:
def compute(self, a: int, b: int) -> int:
return a + b

class Sub:
def compute(self, a: int, b: int) -> int:
return a - b

def calculate(op: Operation, a: int, b: int) -> int:
return op.compute(a, b)


Тут все ок, принцип открытости/закрытости соблюдается 😎
Но приходит бизнес и говорит - в следующем релизе нужно добавить расчет отношения a от 100 и b от 100... Но у нас же уже сделан интерфейс с 2 аргументами, а теперь надо еще и с одним 😫

🟢Принцип подстановки Барбары Лисков
«функции, которые используют базовый тип, должны иметь возможность использовать подтипы базового типа, не зная об этом»

class Animal(Protocol):
@staticmethod
def move() -> None:
...

class Mammal:
@staticmethod
def move() -> None:
print("walk")

class Fish:
@staticmethod
def move() -> None:
print("swim")

def how_it_move(animal: Animal) -> None:
animal.move()


Все опять по принципу 👍 Но некоторые млекопитающие плавают или летают, а есть птицы которые ходят... А есть которые вообще не двигаются и наш метод move не подойдет для них 😍

Опять же, в моменте можно сделать по требованию, но спланировать потребности на будущее - невозможно 🤦‍♂️

🟢Принцип разделения интерфейса
«Программные сущности не должны зависеть от методов, которые они не используют»

class Animal(Protocol):
def move(self):
...
def eat(self):
...
def grow(self):
...
def reproduction(self):
...


Сделал ты такой по принципу класс, но тут вспоминаешь "есть же животные, которые не двигаются!" - делаешь отдельный класс для движимых животных с этим методом.

Приходит заказчик и просит добавить еще растения 😲 Отделяешь grow и reproduction.

Пользователи начинают строчить в техподдержку: "Почему вы не учитываете бесплодных животных???". Надо отделять метод reproduction 😠

Насколько надо гибко настроить интерфейсы, чтобы все учесть сразу?🤦‍♂️

🟢Принцип инверсии зависимостей
«Положитесь на абстракции, а не на что-то конкретное»

class Operation(Protocol):
@staticmethod
def compute(a: int, b: int) -> int:
...
@staticmethod
def name() -> str:
...

class Add:
@staticmethod
def compute(a: int, b: int) -> int:
return a + b
@staticmethod
def name() -> str:
return "Add"

def calculate(op: Operation, a: int, b: int) -> int:
print(f"Running {op.name}")
return op.compute(a, b)


Пример утрированный, но для понимания подойдет)
Наша программа должна запускаться на интерпретаторе от 3.6 и выше, так как f-строки поддерживаются только с этой версии. Но появляются заказчики, которые не могут обновиться, но хотят пользоваться и заплатить за наш продукт 🤑
Получается, мы должны предусмотреть использование и на старых версиях питона? А что, если этого никогда не случится, то мы нарушим YAGNI? 😄

Все это написано по материалам изученным в интернетах и не является дискредитацией SOLID. Он упрощает разработку и систематизирует ее, но упарываться им не стоит 100% 🧘
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯4👍2🤔2🔥1
🕋 Стыдно такое не знать...

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

#конспект #SQL

Представления

Работая с SQL запросами я понимал, когда читал уже написанные или если задача была сложнее обычного селекта из одной таблицы, то я просто обращался к ИИ за помощью 🫠
Но какие же вещи я упускал и не понимал...

При работе с базами данных зачастую приходится многократно выполнять одни и те же запросы, которые могут быть весьма сложными и требовать обращения к нескольким таблицам. Чтобы избежать необходимости многократного формирования таких запросов, можно использовать так называемые представления (views).

CREATE VIEW имя-представления [ ( имя-столбца [, ...] ) ] AS запрос;

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

SELECT * FROM имя-представления;

В отличие от таблиц, представления не содержат данных. При каждом обращении к представлению в команде SELECT данные выбираются из таблиц, на основе которых это представление создано.

СУБД PostgreSQL предлагает свое расширение команды CREATE VIEW, а именно — фразу OR REPLACE. Если представление уже существует, то можно его не удалять, а просто заменить новой версией. Однако нужно помнить о том, что при создании новой версии представления (без явного удаления старой с помощью команды DROP VIEW) должны оставаться неизменными имена столбцов представления. Если же вы хотите изменить имя хотя бы одного столбца, то сначала нужно удалить представление с помощью команды DROP VIEW, а уже затем создать его заново.

PostgreSQL предлагает свое расширение — так называемое материализованное представление. Упрощенный синтаксис команды CREATE MATERIALIZED VIEW, предназначенной для создания материализованных представлений, таков:

CREATE MATERIALIZED VIEW [ IF NOT EXISTS ] имя-мат-представления
[ ( имя-столбца [, ...] ) ]
AS запрос
[ WITH [ NO ] DATA ];

В момент выполнения команды создания материализованного представления оно заполняется данными, но только если в команде не было фразы WITH NO DATA. Если же она была включена в команду, тогда в момент своего создания представление остается пустым, а для заполнения его данными нужно использовать команду REFRESH MATERIALIZED VIEW.

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

Если впоследствии вам потребуется обновить данные в материализованном представлении, то выполните команду

REFRESH MATERIALIZED VIEW имя-мат-представления;


Кстати, пишу конспекты уже прочитав книгу, поэтому пробегаюсь по ней вторым заходом и нахожу места, которые пропустил/не так понял. Полезное закрепление получается 😅
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍3🦄1
👽👽 Пятнадцать лет назад был обнаружен сетевой червь Win32/Stuxnet

#кибербез

Он считается первым в истории кибероружием, которое нанесло масштабные разрушения в физическом мире (и да, это недопустимое событие).

👨‍💻 Основной целью Stuxnet были центрифуги для обогащения урана на иранском заводе в Нетензе

Сетевой червь вмешивался в работу промышленного оборудования — программируемых логических контроллеров (ПЛК) Siemens и рабочих станций SCADA-системы Simatic WinCC.

Предполагается, что заражение происходило из-за внутренних нарушителей (через USB-накопители), так как системы завода были изолированы от внешнего мира. Используя четыре уязвимости нулевого дня в Windows, Stuxnet заражал устройства под управлением этой ОС. Затем он искал системы с установленным ПО для управления ПЛК Simatic Step7, а после этого модифицировал исполняемый код внутри контроллеров.

Stuxnet заставлял центрифуги вращаться с опасными колебаниями скорости, что приводило к их постепенному разрушению. В результате из строя было выведено около тысячи центрифуг.

После обнаружения Stuxnet:

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

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

Антивирусные компании выпустили обновления сигнатур и инструменты удаления Stuxnet.

😮 История со Stuxnet стала началом появления кибероружия, которое влияет на физический мир
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍2🤯1🦄1
🧘‍♀️ Держим себя в бонусе

За последний год работодатели снизили размер премий или вообще перестали их выплачивать почти трети россиян, выяснили «Известия». Чаще всего на лишение бонусов жалуются менеджеры, айтишники и риелторы. На фоне повышения налогов и ключевой ставки у бизнеса не остается возможностей платить больше денег. Хотя дефицит кадров сохраняется, компании теперь привлекают и удерживают людей другими привилегиями — ДМС, обучением, корпоративными скидками и расширенным соцпакетом.


Ну, будем честны перед собой. Даже я, который любит всякие плюшки, кроме зарплаты, всё равно изначально иду работать за деньги 👐

НО... Например с ДМСом я в год экономлю по 100-200к. О его наличии я спрашиваю на собесах в первую очередь. Обучение и конференции это тоже экономия (поменьше, но все же).

У меня есть знакомые, которым похрену на всю эту корпоративную жизнь, ценности и остальное, главное 🤑 Я так не могу, мне кажется это как отбывание номера за деньги и быстрее бы свалить вечером домой с работы. Нет интереса делать то, что не нравится и где не комфортно... 🧘

Хотя, если бы мне платили 500к/наносек, то скорее всего все эти ДМСы, обучения и развлечения я делал бы себе сам 😄 Но исходим от реальных данных...
Please open Telegram to view this post
VIEW IN TELEGRAM
💯42👍1
#SQL #конспект

Я думал пропустить этот раздел, так как он небольшой и вроде как простой. Но я хочу чтобы он был обязательно в конспекте и я его запомнил 👐

Схемы базы данных

Схема — это логический фрагмент базы данных, в котором могут содержаться различные объекты: таблицы, представления, индексы и др. В базе данных обязательно есть хотя бы одна схема. При создании базы данных в ней автоматически создается схема с именем public.

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

Посмотреть список схем в базе данных можно так:
\dn

Список схем
Имя | Владелец
----------+----------
bookings | postgres
public | postgres
(2 строки)


По дефолту в БД создается public схема. После создания своей схемы к ней можно обратиться так:
SELECT * FROM bookings.aircrafts;

Но что, если я создал схему для основного или частого использования? Каждый раз писать схему такое себе. Делаем так:
SET search_path = bookings;

Теперь имя схемы писать не обязательно. Можно указать сразу несколько схем для поиска таблиц при обращении к ним:
SET search_path = bookings, public;

ВАЖНО понимать, что так определяется очередность поиска таблиц по схемам - сначала таблица ищется в bookings, потом в public.

Посмотреть текущие search_path:
SHOW search_path;

search_path
-------------
bookings
(1 строка)

Посмотреть имя текущей схемы:
SELECT current_schema;

current_schema
----------------
bookings
(1 строка)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🦄11
🦄 Многие старожилы моего канала наверное помнят, что свой путь в ИТ я начинал с курсов и хакатонов

Напомню, что хакатон это своеобразное ИТ соревнование между командами по реальной задаче от заказчика. То есть тут и нетворкинг, и реальный проект в портфолио 💡

А тут намечается у нас в Новосибирске оффлайн хакатон, да еще и с такими организаторами и призами!

Двухдневное мероприятие от 2ГИС и ИТМО AI Talent Hub:
🕓 Нетворкинг с экспертами и единомышленниками
❗️🕓 Шанс получить дополнительные баллы для поступления в онлайн-магистратуру AI Talent Hub ИТМО
🕓 +1 кейс в резюме — реальный опыт решения задачи от 2ГИС

А еще, это шанс попасть и посмотреть красивый офис 2ГИС 🌈

Локация: офис 2ГИС
Время: 19 июля 11:30 – 20 июля 19:00

Регистрируйся или перешли тому самому студенту 😎
Кстати, рега 🕙тут🕘

_________________________________________
Напомню, что очень важно получать от вас обратную связь в виде реакций и комментариев. Исторически сложилось, что кроме обычных реакций:
🦄 - это интересный контент, давай такой еще
🐳 - это че-то так себе инфа
Please open Telegram to view this post
VIEW IN TELEGRAM
🦄103👍1
Просто оставлю это здесь без всяких комментариев 😂

Как раз чтиво на выходные, всего 50 страниц 😎
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣10🏆32
🤸 С обновлением меня

🖥 Конфигурация:
➤ Процессор: Intel i5 14400F
➤ Видеокарта: NVIDIA RTX 5070 12Gb
➤ ОЗУ: 32GB DDR5
➤ SSD: 1TB
➤ Охлаждение: Thermalright Assassin Spirit 120 EVO
➤ Корпус: Ginzzu V320 Black
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍421
#конспект #SQL

Сегодня, наверное, тема о самом популярном, что делаем в SQL 😏

Запросы

Для начала поставим перед собой такую задачу: выбрать все самолеты компании Airbus. В этом нам поможет оператор поиска шаблонов LIKE:

SELECT * FROM aircrafts WHERE model LIKE 'Airbus%';

Знак "%" соответствует любым символам (или их отсутствие). Его можно использовать и в начале маски для поиска.
aircraft_code  |model            | range
---------------+-----------------+-------
320 | Airbus A320-200 | 5700
321 | Airbus A321-200 | 5600
319 | Airbus A319-100 | 6700
(3 строки)


И обратное:
SELECT * FROM aircrafts
WHERE model NOT LIKE 'Airbus%'
AND model NOT LIKE 'Boeing%';


Знак "_" соответствует любому одному знаку.
SELECT airport_name FROM airports WHERE airport_name LIKE '___';

Вернет нам UFA, которое соответствует 3 знакам.

Существует ряд операторов для работы с регулярными выражениями POSIX. Эти операторы имеют больше возможностей, чем оператор LIKE. Для того чтобы выбрать, например, самолеты компаний Airbus и Boeing, можно сделать так:

SELECT * FROM aircrafts WHERE model ~ '^(A|Boe)';

aircraft_code  |model            | range
---------------+-----------------+-------
773 | Boeing 777-300 | 11100
763 | Boeing 767-300 | 7900
320 | Airbus A320-200 | 5700
321 | Airbus A321-200 | 5600
319 | Airbus A319-100 | 6700
733 | Boeing 737-300 | 4200
(6 строк)

Оператор ~ ищет совпадение с шаблоном с учетом регистра символов. Символ «^» в начале регулярного выражения означает, что поиск совпадения будет привязан к началу строки.

Ну и так далее, про регулярки тут не буду углубляться ✍️

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

SELECT * FROM aircrafts WHERE range BETWEEN 3000 AND 6000;

aircraft_code  |model                | range
---------------+---------------------+-------
SU9 | Sukhoi SuperJet-100 | 3000
320 | Airbus A320-200 | 5700
321 | Airbus A321-200 | 5600
733 | Boeing 737-300 | 4200
(4 строки)


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

SELECT model, range, round( range / 1.609, 2 ) AS miles
FROM aircrafts;

Считаем значения дальности полета в милях и округляем до 2 знаков после запятой:
model         | range | miles
--------------+-------+---------
Boeing 777-300| 11100 | 6898.69
Boeing 767-300| 7900 | 4909.88
...


Есть возможность с помощью условных операторов сделать дополнительный столбец со своими значениями:
SELECT model, range,
CASE WHEN range < 2000 THEN 'Ближнемагистральный'
WHEN range < 5000 THEN 'Среднемагистральный'
ELSE 'Дальнемагистральный'
END AS type
FROM aircrafts
ORDER BY model;

model               | range | type
--------------------+-------+---------------------
Airbus A319-100 | 6700 | Дальнемагистральный
Boeing 737-300 | 4200 | Среднемагистральный
Boeing 767-300 | 7900 | Дальнемагистральный
Boeing 777-300 | 11100 | Дальнемагистральный
Bombardier CRJ-200 | 2700 | Среднемагистральный
(5 строк)


Сегодня, как мне кажется, ничего сложного. Ну или мне уже привычно этим пользоваться 😭
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7🦄3👍2
👾 Немного ИБ истории

#кибербез

В 1971 году Боб Томас, программист компании BBN, создал прадедушку современных компьютерных червей. Его программа под названием Creeper перемещалась по сети между компьютерами, не нанося им вреда. А «заразив» очередную машину, выводила на дисплей сообщение: I'M THE CREEPER... CATCH ME IF YOU CAN («Я Creeper... Поймай меня, если сможешь»)

🏃‍♂️ Поймать Creeper смог написанный коллегой Томаса, Рэем Томлинсоном, Reaper — по сути, такой же червь, ползающий по сети, находящий работающие версии «вируса» и уничтожающий их. Поэтому Reaper весьма условно можно назвать первым антивирусом. Кстати, по мотивам противостояния Creeper и Reaper даже создали компьютерную игру для программистов под названием Core War.

С тех пор антивирусы и принципы их работы сильно изменились и продолжают меняться: из самостоятельных продуктов они превращаются в часть защитной экосистемы. А некоторые компании и вовсе от них отказываются (например, создавая хардбуки — компьютеры, которым и так не грозит заражение).


По-моему, так работают сейчас локеры, которые блокируют экран и вымогают деньги. Я (в целях образования конечно же 😄) писал подобный на питоне) Скрипт скачивался, устанавливался куда надо, шифровал все подряд на ПК, отправлял мне ключ шифрования 😏
Прикольный опыт...
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🤯2🌚1🦄1
😑 Причина тряски?

Разница сутки между новостями:
Google похвастался что больше половины кода для корпорации пишут ИИ - уволено уже 40,000 программистов. А сейчас, оставшиеся по-большей части проверяют работу ИИ, но скоро и они будут не нужны.


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

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

Сообщается и о курьезах где фирма на три дня осталась без сайта и заплатила $500 программисту за три строчки кода. А тот потом рассказал что если бы изначально делал сайт вместо ИИ, потратил бы на это 15 минут и $50.


Либо новости пишут, чтобы "собрать классы", либо гугл не успевает за трендами 🤣
Please open Telegram to view this post
VIEW IN TELEGRAM
😁9🤔22🌚1
🐷 Расхламляемся

Когда клавиатура стала не помещаться на рабочем столе, то задумался "а куда все деть-то со стола, не в мусорку же 😄". И увидел у знакомого решение 😎

Такие панели есть с разными раpмерами и наполнение можно купить любое (крючки, подстаканники, полки, кармашки).

Вот мой набор, если кому понравилось ❤️
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥42👍1🌚1
#конспект #SQL

Я решил пропустить раздел с соединениями, ибо он очень объемный и это база, которую давали даже мне на онлайн курсе) Кому то она окажется тяжелой (например мне 😄) и он ее поймет спустя пару лет (например я😄), но тут лучше практикой, чем чтением. Так же, пропускаю маленькую тему про агрегатные функции типа max/min/avg.

Оконные функции (window functions)
Эти функции предоставляют возможность производить вычисления на множестве строк, логически связанных с текущей строкой, т. е. имеющих то или иное отношение к ней.
При работе с оконными функциями используются концепции раздела (partition) и оконного кадра (window frame).


Пример запроса с оконной функцией:
SELECT b.book_ref,
b.book_date,
extract( 'month' from b.book_date ) AS month,
extract( 'day' from b.book_date ) AS day,
count( * ) OVER (
PARTITION BY date_trunc( 'month', b.book_date )
ORDER BY b.book_date
) AS count
FROM ticket_flights tf
JOIN tickets t ON tf.ticket_no = t.ticket_no
JOIN bookings b ON t.book_ref = b.book_ref
WHERE tf.flight_id = 1
ORDER BY b.book_date;

Конструкция для вызова оконной функции:
count( * ) OVER (
PARTITION BY date_trunc( 'month', b.book_date )
ORDER BY b.book_date
) AS count

В этой конструкции обязательным является ключевое слово OVER. Функция count — это обычная агрегатная функция, но если вслед за ней идет это ключевое слово, то она становится оконной функцией. Предложение PARTITION BY задает правило разбиения строк выборки на разделы. Предложение ORDER BY предписывает порядок
сортировки строк в разделах.
Обобщая приведенные объяснения, можно сказать, что раздел включает в себя все строки выборки, имеющие в некотором смысле одинаковые свойства, например, одинаковые значения определенных выражений, задаваемых с помощью предложения PARTITION BY. Это могут быть выражения, построенные на основе одного или нескольких столбцов таблицы (или таблиц, участвующих в соединении).

Кстати, date_trunc — это функция, для усечения даты по выбранному критерию, в нашем случае b.book_date мы усекаем с начала и по конец месяца, где находится дата из переменной.
(Да, это я лично вставил длинное тире, а не ИИ 😎)

В этом запросе в предложении OVER ( PARTITION BY timezone ... ) указывается, что строки относятся к одному разделу на основе совпадения значений в столбце timezone. Обратите внимание, что хотя в предложении OVER задан порядок сортировки, действующий в пределах каждого окна, тем не менее, с помощью предложения ORDER BY указан также и порядок сортировки на уровне всего запроса.

SELECT airport_name,
city,
round( latitude::numeric, 2 ) AS ltd,
timezone,
rank() OVER (
PARTITION BY timezone
ORDER BY latitude DESC
)
FROM airports
WHERE timezone IN ( 'Asia/Irkutsk', 'Asia/Krasnoyarsk' )
ORDER BY timezone, rank;

airport_name   | city          | ltd   | timezone         | rank
---------------+---------------+-------+------------------+------
Усть-Илимск | Усть-Илимск | 58.14 | Asia/Irkutsk | 1
Усть-Кут | Усть-Кут | 56.85 | Asia/Irkutsk | 2
Братск | Братск | 56.37 | Asia/Irkutsk | 3
Иркутск | Иркутск | 52.27 | Asia/Irkutsk | 4
...
Абакан | Абакан | 53.74 | Asia/Krasnoyarsk | 5
Барнаул | Барнаул | 53.36 | Asia/Krasnoyarsk | 6
Горно-Алтайск | Горно-Алтайск | 51.97 | Asia/Krasnoyarsk | 7
Кызыл | Кызыл | 51.67 | Asia/Krasnoyarsk | 8
(13 строк)


Дайте реакций, как обычно 🤑
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍633🦄1
Сибирский Dev | IT survival
Вхожу в IT ⌨️
🎂 3 года назад я вошел в IT

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

У вас как?

🦄 все ок и зп тоже
🐳 хотелось бы поинтереснее и зп побольше
🌚 хочу свалить и с текущего места
Please open Telegram to view this post
VIEW IN TELEGRAM
🐳18🦄12🌚81
💌 Шпора по алгоритмам

Пока я "писательском отпуске" вот нашел шпаргалку по сложностям алгоритмов, чтобы уже наконец начать разбираться когда n в кубе, а когда логарифм... 🤔
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥11
😱 Хули ты ноешь?

Короч просто о наболевшем...

Везде, в любой сфере есть такие люди, которые ноют постоянно, что бы не делали другие. Я таких видел и на работе, и играя в онлайн игры, и смотря ютуберов, и просто общаясь на любые темы 😖

Любое нововведение или предложение эти люди обосрут и скажут, что какое же все херовое, а вы еще какую то херню завезли (которая как раз таки и задумывалась об улучшении частично/полностью проблемы).

"Ой, мой код никто не ревьювит"

Давайте сделаем дежурных по неделям, назначим ответственных, введем мотивацию, сделаем ИИ ассистента на ревью...
"Оооой неееет... какие то дополнительные обязанности...."

Итог: ничего)

"Какая же игра стала говно, разрабы только доят нас донатами!"

Разраб делает ребаланс вещей, улучшает графику, вводит новые предметы, новые ивенты, античит, ОТКРЫВАЕТ ФОРМУ ДЛЯ ОБЩЕНИЯ С ИГРОКАМИ
"Пффф... разрабы идиоты, сделали какую-то херню, вместо того, чтобы вернуть все как было, было лучше"

Итог: нихера конкретного, что хотел бы нытик)

"Да вы посмотрите, эти чиновники ничего не делают! Простой люд обворовывают!"

Вводят изолированные среды со своими разработками, чтобы было все максимально прозрачно для людей и тяжело для мошенников (ГосУслуги, MAX и т.д.)
"Очередные говнозаконы! Они там ваще работают? Других проблем нет??"

Итог: нытик становится параноиком - за ним следят и его хотят посадить за впн на телефоне 😄

Хз насколько вам будет интересен этот пост, но по-моему он очень относится к ИТ в том числе. Если человек чем либо не доволен, то будь добр предлагай альтернативу или бери бразды правления в свои руки и делай сам. Нехер ныть 👊
Please open Telegram to view this post
VIEW IN TELEGRAM
💯9🦄32
🔋 Выхожу из режима отдыха

Решил вписаться в организацию питоновской движухи в Новосибирске. И вот, 13 сентября у нас будет первый оффлайн+онлайн митап 🌈

Пока что все делаем впервые, вот заказал даже петличку для трансляции в инет. Сам выступать пока не планирую, до сих пор не чувствую у себя какой-то экспертизы, но уже есть докладчики с такими темами:
☑️ "Как работают гринлеты в SQLAlchemy"
☑️ "Десктоп-разработка на PySide6"
*️⃣ Онлайн встреча с Никитой Соболевым, CPython Core Developer'ом

А самое главное - у нас уже "солд аут", то есть места бесплатные, но мы уже набрали максимум мест 😎

Если будет у кого интерес, то скину ссылку сюда на онлайн трансляцию ❤️
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍5🤩11