Так себе программист
97 subscribers
184 photos
7 videos
1 file
183 links
Меня зовут Александр Троценко. Разработчик, преподаватель, к.т.н. Пишу о программировании и профессии.

10 лет в разработке desktop на C/С++

Контент: https://taplink.cc/atrotsenko
Download Telegram
Так себе программист pinned «Идем по пути от “так себе” вчера к “немного лучше” сегодня. Авторский образовательный контент по неустанной борьбе с так себе программистом. Даже рубрики есть: #КнижнаяПолка 📚 О книгах. Полезно мне - полезно вам 😉 #ЖизньДругих 👀 Об интересных решениях…»
Какой паттерн определяет объект, который инкапсулирует запрос на выполнение некоей операции с другим объектом?
Anonymous Quiz
69%
Команда
11%
Одиночка
11%
Фабрика
8%
Парковка
#include <iostream>

int main()
{
int* val = new int(0);
std::cout << "Enter a number: ";
std::cin >> *val;

if (*val == 42)
{
std::cout << "Wow! Your number is 42!" << std::endl;
return 0;
}

std::cout << "Good choice!" << std::endl;
delete val;
return 0;
}
Джуны больше не нужны

Ничего себе заявленьеце, да? 😦
И самое интересное, что оно совсем не беспочвенное и напрямую связано с развитием ИИ.

Kirimgeray Kirimli, руководитель Snapshot Reviews, считает, что задачи джунов скоро будет выполнять ИИ. Предпосылки к этому есть. В условиях хорошо составленного технического задания ИИ сможет дать адекватное решение.

Что же тогда делать джунам?

Да то же, что и всегда, - учиться. Каким бы крутым не был ИИ, доверия к нему мало, а его решения должны быть верифицированы. Kirimgeray Kirimli предполагает, что именно этим и будут заниматься джуны - присматривать за ИИ. А это в любом случае потребует устойчивых знаний компьютерных наук. Может даже более серьёзных, чем от джуна ожидают сейчас.

—

Имхо, даже на сегодня это довольно смелая идея. Для меня ИИ все ещё не стал инструментом повседневной работы. То ли нет нужды, то ли я так себе программист 🙃
Не знаю в общем, присматриваюсь пока.

А вы используете ИИ в разработке?

📍Say goodbye to "junior" engineering roles
👍3
dark_theme_fun.gif
11.1 MB
Когда захотелось ну очень тёмную тему 🌘

Отсюда
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰5
Список 1
{1, 2, 3, 4, 5, 6, 7, 8}


Список 2
{3, 5, 4, 1, 2}
Выше даны два списка. Сортировка какого списка займет меньше времени?
Anonymous Quiz
24%
Неизвестно
27%
Списка 1
22%
Списка 2
27%
Время сортировки примерно одинаково
Недооценённые навыки

Если вы не можете ходить и вам приносят молоко вместо апельсинового сока, который вы хотели, то вы скажете: "все нормально", и выпьете его.


1. Это первый навык, который мы обычно недооцениваем: принятие некоторых неудобств и пустяков, если этого требует действительность.
Без этого навыка мы каждый день будем превозмогать, нервничать и опускать руки из-за всякой ерунды.

2. Уважительное отношение к человеку, с которым вы не согласны.
Трюк состоит в том, чтобы найти в таком человеке точку соприкосновения и в конце концов сказать себе: "ок, не такой уж он и сумасшедший". Иначе можно слишком легко его "списать".

3. Способность вести 10-минутную беседу с любым человеком.
В наше время онлайна беседовать с глазу на глаз с незнакомым человеком - тот ещё челендж. Хотя раньше это и не назвали бы каким-то особенным скилом.

4. Кратко и ёмко донести суть.
Все очень заняты. Меньше слов, больше дела.

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

5-й пункт сильно про меня. Я уже не один раз попадал в "ситуацию" из-за того, что медлил с ответом "нет". Сначала обнадёживаешь почём зря, а потом выглядишь еще большим придурком, чем мог бы 😶

Еще больше навыков и интересных примеров здесь
📍
Morgan Housel - Useful and Overlooked Skills
👍4
Мощь!
Железный подход 💪

Жмите 🔥, если интересна тема реверс-инжиниринга
🔥10😁1
Troubleshooting. Метод деления пополам

Продолжаю серию постов по траблшутингу. Сегодня поговорим про локализацию проблемы методом деления пополам.

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

Вот такой итерационный метод можно использовать и при отладке программ.

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

1️⃣ Для начала выбираем большой участок программы от ее старта до места проявления ошибки. Мы уверены, что в начале выполнения программы наши данные корректные.

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

3️⃣ Продолжаем пункт 2 до тех пор, пока не "спустимся" к источнику проблемы.

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

Для этого нужно знать коммит, на котором проблемы еще не было, и коммит, на котором проблема была обнаружена. Тогда путем деления истории коммитов пополам можно быстро найти коммит, который занёс в код ошибку. В git, например, этот метод реализуется командой git bisect. Почитайте, если ещё не слышали.

#Troubleshooting
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Кот в окошке видеоконфы уже скорее правило, чем исключение 😁

А у вас на созвонах бывают коллеги с котами?
❤3👍1
Zip-бомба и Qt Network

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

Давайте проверим, что случится, если такой архив получит QNetworkAccessManager из модуля Qt Network. Есть ли там какая-то защита?

QNetworkAccessManager умеет работать с HTTP-запросами и ответами. И если в HTTP-заголовке ответного сообщения будет установлено поле Content-Encoding: gzip, то QNetworkAccessManager должен автоматически разархивировать полученные данные.

Так в действительности и происходит. Но в случае с zip-бомбой есть и хорошие новости. Многократно запакованный архив QNetworkAccessManager распаковывает только один раз, рекурсивной процедуры там нет. По крайней мере в Qt5. Значит такого типа zip-бомб можно не опасаться.

А вот архив с сильным сжатием ожидаемо будет распакован.

В эксперименте архив размером 1,2Мб, содержащий 1,2Гб данных, был распакован QNetworkAccessManager-ом за несколько минут с потреблением в пике до 2,4Гб оперативки. Как минимум, это может привести к фризам приложения в процессе распаковки, а при определенных условиях и к падению.

Такие пироги. Если Qt Network работает по незащищенному протоколу, то такой тип атаки можно ожидать. С защищенным протоколом (HTTPS) вероятность гораздо ниже.

Если интересно как еще проверить свою систему на прочность, читайте пост про выполнение DOS-атаки.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
foreach ( name in NameList )
{
print "Hello, {name}!";
}
За какое время выполнится код выше? Дайте ответ в О-нотации
Anonymous Quiz
12%
O( 1 )
69%
O( n )
8%
O( lg n )
12%
O( n * n )
Антипаттерны SQL: обязательный столбец ID

У меня отношения с базами данных (БД) примерно такие же как с английским: вроде бы нормально дружим, пока не попадется что-то серьёзнее Шерлока Холмса в оригинале. В теории все понятно, но нет-нет да и выкину что-нибудь эдакое.

И в этот раз при работе со схемой БД я заметил, что по умолчанию добавляю поле "ID" в каждую таблицу 🤔
Просто потому что, без оснований. По традиции что ли...

Так себе, да?
Да. И у этого есть название.

Я пал жертвой антипаттерна "ID required", вляпавшись в два его признака:

1️⃣ Несколько таблиц в моей БД безосновательно получили поле "ID" в качестве первичного ключа, хотя у каждой из этих таблиц уже было поле, которое могло бы им стать. Тем самым появилась избыточность данных.

2️⃣ Имя "ID" очень абстрактное, ни о чем не говорящее само по себе. Гораздо лучше было использовать не "ID", а какой-нибудь условный "ENTITY_ID".

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

Из самого описания антипаттерна "ID required" мне понравилась эта фраза:

If your table contains an attribute that’s guaranteed to be unique, is non-null, and can serve to identify the row, don’t feel obligated to add a pseudokey solely for the sake of tradition.


То есть антипаттерн не говорит, что поле "ID" - это плохо, а только лишь указывает, что оно не обязательно.

📍 Karwin B - SQL antipatterns. Avoiding the pitfalls of database (2010)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1🔥1
Как расшифровывается аббревиатура принципа проектирования KISS?
Anonymous Quiz
7%
Keep intensive system solution
30%
Key interaction system solution
13%
Kind intelligence support system
50%
Keep it simple, stupid!
Как расшифровывается аббревиатура принципа проектирования DRY?
Anonymous Quiz
75%
Don't repeat yourself
4%
Don't read yourself
14%
Don't reply yes
7%
Don't rest yearly