Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр Потеряшки: ищите потерянные предметы без времени! Расслабляйтесь, исследуйте, находите.

Потеряшки - поиск предметов

Головоломки, Казуальные, Детские

Играть

Топ прошлой недели

  • AlexKud AlexKud 38 постов
  • Animalrescueed Animalrescueed 36 постов
  • Oskanov Oskanov 7 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
0 просмотренных постов скрыто
2
neverending.cpp
neverending.cpp
5 месяцев назад

Пятничная болталогия и никакой технички⁠⁠


Уберите упоминание курсов из своего резюме

Это одна из рекомендаций, которую я выдаю при ревью резюме: курсы по С++ должны быть убраны из резюме. Как и все остальные курсы, если они не являются всемирно признанными и не обладают уровнем сертификаций AWS, Microsoft, CCNP и им подобных. Я понимаю, что очень хочется добавить в список достижений очередной пояс непонятного цвета или ступень Professional, ведь менеджеры курсов утверждают, что это нужно "обязательно сделать", ведь это "выделит вас среди остальных кандидатов"...бла-бла-бла🥱 Увы, это старые шаблоны из старых методичек, которые писались задолго до того, как онлайн IT курсы полностью дискредитировали себя.

Когда-то онлайн курсы - это была попытка восполнить нехватку кадров в IT отрасли. Если копнуть глубоко в прошлое, то онлайн курсы изначально были бесплатными, организовывались крупными компаниями и на них брали практически всех желающих. С ростом зарплат и хайпа айтишки начало появляться все больше и больше онлайн школ. Для справки: в 2020 году было несколько десятков школ, сейчас - несколько сотен. Далее в ход включились эффективные менеджеры и продажники, которые начали завлекать в онлайн-школы всех: агрессивная реклама от каждого блогера, специальные условия на кредиты, обещания заоблачных денег и комфортных условий труда. Помню, что примерно в пик хайпа я воспользовался служебным положением и просмотрел анкеты со свежего потока студентов на курс Data Science: из 50 человек практически все были без вышки, больше половины - охранники, баристы, мастера маникюра. Я не хочу быть слишком токсичным (а в данном случае вариантов нет ☢️), но будем честны: вы изучали статистику? Как вы думаете, насколько реально её объяснить охраннику возраста 30+ и без вышки?

Это и привело к тому, что подавляющее большинство студентов закончили обучение в первые месяцы. И в этом полностью вина онлайн школ. Если бы не жажда наживы, то с большинством вкатунов должен был состояться диалог примерного содержания: "DS требует специфической подготовки, будем честны, вы ей не обладаете. Давайте рассмотрим курсы ручных тестировщиков, они стоят дешевле в несколько раз, найти работу с ними проще, да на старте зарплата меньше, но на дистанции можно стать лидом и получать ровно те же деньги." Ах, мечты-мечты. В итоге, эта часть несостоявшихся вкатунов окрестила все курсы и всех причастных к курсам "инфоцыганами". Вот и неси теперь свет в массы😁

Часть студентов все-таки дошла до конца курсов. Кто-то это смог сделать самостоятельно, но большей части "помогли" онлайн-школы. Онлайн-школы начали делать всё, чтобы "дотолкать" студента до конца курса (а иначе он возврат потребует и негативный отзыв напишет): убрали все дедлайны и сроки ("учись в своем темпе"), убрали все защиты проектных работ, менторов практически обязали "гладить студентов по головке" и "поменьше указывать на ошибки в коде". Обучение свелось к прокликиванию тестов на платформе, формальному выполнению работ и проектов. В итоге студент получал заветный сертификат, составлял резюме и бежал вкатываться в IT. Вакансии разрабов стали заваливаться предложениями от выпускников курсов. Кстати, пропагандировать широким массам накрутку опыта начали первыми онлайн школы: они рекомендовали вместо обучения указывать фриланс🙃 Первое время выпускников даже звали на собесы. Но после десятков собесов, где кандидат не мог ответить ни на один вопрос, многие компании, а вслед за ними и рекрутеры ввели негласное правило: резюме выпускников онлайн-школ отклонять автоматически. Да-да, один из тех самых "редфлагов в резюме"🚩

Что мы имеем сейчас. То, что вы пошли на онлайн курсы, закончили их и получили сертификат - это замечательно. Некоторые онлайн курсы - это по-прежнему буст знаний за короткий срок. Например, сейчас мне нужно углубить знания по CI/CD. Конечно же, я не буду читать книжки и статьи, а прослушаю онлайн-курс. Но не стоит указывать в резюме, что вы приобрели знания на онлайн-курсе. В текущих реалиях рынка это лишь снизит конверсию вашего резюме и принесет вам больше проблем, чем пользы.

Показать полностью
[моё] Кросспостинг Pikabu Publish Bot Текст IT Курсы программирования C++
1
12
neverending.cpp
neverending.cpp
7 месяцев назад
Лига программистов C/C++

Книга по C++, которую ты обязан прочитать в 2025 году⁠⁠

Я почему-то уверен, что она у тебя уже есть. Либо в списке литературы для самообразования, либо где-то среди скачанных pdf, а может, даже в печатном виде. Возможно, ты даже начинал её читать, но… работа, таски, собеседования… деньги вроде и так платят… и ты так и не осилил Мейерса "Эффективный и современный С++".

А ведь именно эта книга — ключ, который поможет тебе пробить потолок уровня middle и начать движение к senior.

Да, можно скачать список из 400 популярных вопросов, выучить их и бодро ответить на вопрос: «Расскажи про std::unique_ptr». А потом тебе прилетает дополнительный вопрос: «А как изменится размер std::unique_ptr при использовании пользовательского удалителя?» Иии… Я не буду додумывать твой уровень знаний. Попробуй сам ответить на этот вопрос и поставь себе оценку🙂
И это только один из примеров тонких нюансов, которые описаны в этой книге и которые реально спрашивают на собеседованиях.

Ещё одна сильная сторона книги: почти каждая фича современного C++ иллюстрируется примерами её использования в реальном проде. А это большая редкость для технической литературы.

Хватит откладывать эту книгу на «потом». Поставь цель на этот год и, наконец-то, найди время, чтобы прочитать 300 страниц "Эффективного и современного С++".

Книга по C++, которую ты обязан прочитать в 2025 году Кросспостинг, Pikabu Publish Bot, IT, C++, Программирование, Книги, Самообразование
Показать полностью 1
[моё] Кросспостинг Pikabu Publish Bot IT C++ Программирование Книги Самообразование
27
3
neverending.cpp
neverending.cpp
7 месяцев назад

Что такое nullptr?⁠⁠

Я бы с ходу ответил что-то подобное:
`nullptr` в C++ — это ключевое слово, которое используется для обозначения нулевого указателя. Оно было введено в стандарт C++11, чтобы заменить старый стиль использования литерала `NULL` или просто числа `0` для указания на нулевой указатель.

А теперь представьте, что вы общаетесь с С-программистом, который знает, что такое указатель и как его занулить. Ваша задача — объяснить, что такое nullptr "под капотом" и чем его устройство отличается от NULL. С NULL всё банально: в зависимости от реализации это может быть либо просто макрос для 0, либо каст 0 к void-указателю. Например:
#define NULL 0
или
#define NULL ((void *)0)

Начнём разбираться

Изучение любой непонятной C++ штуки традиционно начинаем с чтения cppreference :
Ключевое слово nullptr обозначает литерал указателя. Это prvalue типа std::nullptr_t.

Окей, nullptr — это константа времени компиляции, которую можно присвоить только указателю, чтобы занулить его. Но что такое std::nullptr_t?

Читаем cppreference далее:
std::nullptr_t — это тип литерала нулевого указателя nullptr. Это особый тип, который сам по себе не является типом указателя или указателем на тип элемента. Его значениями являются константы нулевого указателя.

Много букв. Так становится намного понятнее:
using nullptr_t = decltype(nullptr);

Как видите, стандарт явно не описывает внутреннее устройство nullptr, но информация о том, что sizeof(std::nullptr_t) равно sizeof(void*), намекает, что nullptr реализуется на аппаратном уровне как указатель на адрес 0.

Вопрос на засыпку: можно ли получить nullptr в результате вычислений?

P.S.: Для любителей бескомпромиссного чтива https://eel.is/c++draft/support.types.nullptr

Показать полностью
[моё] Кросспостинг Pikabu Publish Bot Текст C++ IT Программирование
3
neverending.cpp
neverending.cpp
7 месяцев назад

Наводим суету с live lock⁠⁠

Live lock — это ситуация, когда несколько потоков постоянно меняют своё состояние в ответ на действия друг друга, но при этом никто не достигает прогресса. Это отличается от dead lock тем, что потоки не блокируются полностью, а продолжают выполнение, но не продвигаются вперёд.

Простой пример: два вежливых сотрудника идут навстречу друг другу по коридору. Когда они встречаются, первый отходит вправо, а второй — влево. Они снова оказываются друг напротив друга. Первый отходит влево, а второй — вправо, но вновь оказываются на пути друг друга.

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

#include <iostream>
#include <thread>

enum class Position
{
left,
right
};

void moveA(Position& positionA, const Position& positionB)
{
while (true)
{
if (positionA != positionB)
{
break;
}
if (positionB == Position::right)
{
std::cout << "A sees B on the right, moves back to left\n";
positionA = Position::left;
}
std::cout << "A moves to the right\n";
positionA = Position::right;
}
}

void moveB(const Position& positionA, Position& positionB)
{
while (true)
{
if (positionA != positionB)
{
break;
}
if (positionA == Position::right)
{
std::cout << "B sees A on the right, moves back to left\n";
positionB = Position::left;
}
std::cout << "B moves to the right\n";
positionB = Position::right;
}
}

int main()
{
Position positionA{Position::left};
Position positionB{Position::left};

std::thread t1(moveA, std::ref(positionA), std::cref(positionB));
std::thread t2(moveB, std::cref(positionA), std::ref(positionB));

t1.join();
t2.join();
}

Показать полностью
[моё] Кросспостинг Pikabu Publish Bot Текст IT C++ Программирование
1
neverending.cpp
neverending.cpp
8 месяцев назад

Почему твоё резюме никто не смотрит?⁠⁠

А на твои отклики не приходит ответ? Или, что ещё хуже, тебе сразу отказывают?
Давай разберёмся.

Знаешь, как выглядит большинство резюме C++ разработчиков? Примерно так:
Январь 2024 — по настоящее время
ИТЦ "СамаяЛучшаяКампания" — Ведущий программист
- Разработка приложений для нужд производства
- Написание тестов

Май 2023 — Декабрь 2024
ОАО "ОтличнаяКомпания" — Старший инженер-программист
- Создание виджетов на Qt
- Написание документации
- Ведение переговоров с заказчиком

и так далее...

Выглядит знакомо? Увы, такие резюме обречены на провал.

Почему?

Парсеры. Машина просто проигнорирует такой текст. А значит, твоё резюме не попадёт в базу крупной компании или рекрутингового агентства.

Ручной отбор. Даже если компания проверяет резюме вручную, оно, скорее всего, окажется в самом конце списка кандидатов. А то и сразу получит отказ.

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

В чём проблема?

Как думаешь, что именно не так с этим резюме? Или во всём виноват рынок с его странными требованиями?

Показать полностью
[моё] Кросспостинг Pikabu Publish Bot Текст Программирование IT C++ Резюме Карьер
7
0
neverending.cpp
neverending.cpp
8 месяцев назад

Зачем используется ключевое слово explicit⁠⁠

Пример первый. Давайте посмотрим на код ниже (да, он собирается и запускается):
class A
{};

class B
{
public:
B(const A &)
{}
};

void foo(const B &)
{}

int main()
{
A a;
foo(a);
}

Я специально убрал все лишние строчки из кода, чтобы вы смогли сосредоточиться на всей абсурдности происходящего: при вызове функции foo тип A преобразовывается в тип В, при этом мой компилятор даже с выкрученными флагами ворнингов не выдал мне никакого предупреждения. Что-то мне подсказывает, что это не то поведение, которое можно завещать потомкам (т.е. разрабам, которые будут работать с вашим кодом).
Если воспользоваться услугами сайта https://cppinsights.io/, можно увидеть, что компилятор преобразует код функции main в следующий:
int main()
{
A a;
foo(B(a));
return 0;
}
Т.е. в момент вызова функции foo из объекта класса A создается временный объект класса B.
Фиксится эта проблема с помощью использования спецификатора explicit перед конструктором класса B.

Продолжение следует.

Показать полностью
[моё] Кросспостинг Pikabu Publish Bot Текст IT Программирование C++
5
neverending.cpp
neverending.cpp
8 месяцев назад
Лига программистов

Кто есть кто в мире онлайн IT образования⁠⁠

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

Учитель. Учит детей в школе. Поэтому, если вы хотите учить детишек писать код, вам туда🙃 Я не работал в школе и включил этот пункт исключительно, чтобы обозначить "потенциальную возможность".

Репетитор. Проводит индивидуальное обучение. Подразумевается, что репетитор будет нянчиться со студентом и изучать тему до тех пор, пока студент "не останется доволен". Спокойно относитесь к тому, чтобы на протяжении месяца разбирать тему циклов? Вам сюда. Потенциальные клиенты - это в основном новички без опыта в программировании, которые хотят выучить C++ быстро и желательно с минимальными затратами, или школьники-студенты с низкой мотивацией, которых привела мама. Как результат, стартовая ставка в час критически ниже, чем у преподавателя и ментора. Стоит рассмотреть, если у вас нет опыта разработки, но вы студент профильного it-вуза, либо как один из способов развития личного бренда.

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

Ментор. Через свой опыт помогает менти в достижении его целей. Цель запроса к ментору может быть абсолютно разной: от "разобрать арифметику указателей" до "подготовить резюме" и "пробить потолок 300к". Ментор в отличие от преподавателей и репетиторов не разжевывает тему, а указывает на пробелы в знаниях студента и прорабатывает со студентом путь к преодолению проблем. Опыт разработки обязателен. Я занимаюсь менторство уже более двух лет и мне нравится эта деятельность по двум причинам:
- нестандартные запросы, с которыми действительно интересно работать. А не вот это вот в 100 раз "помогите мне решить задание с шифром Цезаря" (пасхалочка для моих бывших коллег из Skillfactory)
- возможность помогать менти в достижении их целей. Особенно, если цель - это офер, а менти без опыта в IT=) Работу в онлайн школах я могу сравнить со случайным прохожим, у которого студент спросил, как дойти из пункта А в пункт Б. "У красного здания повернуть направо". Дойдет студент до цели - не понятно. Ментор - это навигатор: тут поверни направо, а вот тут сэкономим пару месяцев твой жизни и пройдем коротким путем, ты у цели, поздравляю, маршрут окончен😎

Наставник. Да, это перевод слова "ментор". Но в онлайн образовании используется несколько в ином контексте. Наставник прикрепляется к курсу, потоку или стажировке и выполняет роль человека, к которому можно обратиться за помощью в решении технического вопроса, составлению резюме или в целом за порцией мотивации. Я несколько раз занимал роль наставника. Последний раз это была на стажировке в НТР. По окончанию стажировки более 70 % моих студентов получили офер от НТР. Не исключаю, что это совпадение, но воспоминая все равно приятные🙂

Показать полностью
[моё] Кросспостинг Pikabu Publish Bot Текст IT Курсы программирования Менторство C++ Образование Самообразование
7
0
neverending.cpp
neverending.cpp
8 месяцев назад
Лига программистов

Dead lock⁠⁠

Перед тем, как разобрать, что такое live lock, вспомним, что такое dead lock.

Deadlock bug на простейшем примере
Два потока захватывают мьютексы в разном порядке. Это может привести к ситуации, что планировщик запустит на выполнение поток 1, поток 1 захватит мьютекс 1, после чего планировщик приостановит выполнение потока 1 и запустит на выполнение поток 2. Поток 2 захватит мьютекс 2. Независимо от того, какой поток будет выполняться дальше, программа зависнет, т.к. потоки будут ждать разблокировки мьютексов (поток 1 - мьютека 2, поток 2 - мьютека 1), которая никогда не произойдет.

#include <iostream>
#include <thread>
#include <mutex>

void thread1(std::mutex& mutex1, std::mutex& mutex2)
{
std::lock_guard<std::mutex> lock1(mutex1);
std::cout << "Thread 1 acquired mutex1\n";

std::lock_guard<std::mutex> lock2(mutex2);
std::cout << "Thread 1 acquired mutex2\n";
}

void thread2(std::mutex& mutex1, std::mutex& mutex2)
{
std::lock_guard<std::mutex> lock2(mutex2);
std::cout << "Thread 2 acquired mutex2\n";

std::lock_guard<std::mutex> lock1(mutex1);
std::cout << "Thread 2 acquired mutex1\n";
}

int main()
{
std::mutex mutex1;
std::mutex mutex2;

std::thread t1(thread1, std::ref(mutex1), std::ref(mutex2));
std::thread t2(thread2, std::ref(mutex1), std::ref(mutex2));

t1.join();
t2.join();
}

Fix dead lock bug
В современном C++ баг, описанный выше, исправляется с помощью использования std::scoped_lock

#include <iostream>
#include <thread>
#include <mutex>

void thread1(std::mutex& mutex1, std::mutex& mutex2)
{
const std::scoped_lock lock(mutex1, mutex2);
std::cout << "Thread 1 acquired mutex1 and mutex2\n";
}

void thread2(std::mutex& mutex1, std::mutex& mutex2)
{
const std::scoped_lock lock(mutex1, mutex2);
std::cout << "Thread 2 acquired mutex1 and mutex2\n";
}

int main()
{
std::mutex mutex1;
std::mutex mutex2;

std::thread t1(thread1, std::ref(mutex1), std::ref(mutex2));
std::thread t2(thread2, std::ref(mutex1), std::ref(mutex2));

t1.join();
t2.join();
}

Больше технических постов тут t.me/neverending_cpp

Показать полностью
[моё] Кросспостинг Pikabu Publish Bot Текст C++ IT Многопоточность Deadlock
9
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии