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

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

Контент: https://taplink.cc/atrotsenko
Download Telegram
#include <iostream>

int main()
{
int a = 1;
int& b = a;

++a;
++b;

std::cout << a << b << std::endl;
return 0;
}
Выше дан код на C++. Какой вывод будет у программы?
Anonymous Quiz
17%
12
30%
22
27%
23
27%
33
Путаница в интерфейсах (часть 4)

➕1️⃣в копилочку.

Все в диалоге хорошо, кроме отступа между кнопками.

Дело усугубляется тем, что это мобильный интерфейс. Легко промазать, когда палец накрывает обе кнопки сразу.
Еще и одна из кнопок красная 🔴😬
Усиливает ответственность момента)

P.S. Конкретно в этом случае я сомневаюсь, что так сделано нарочно. Скорее всего просто поплыли стили.

—

Читать "Путаница в интерфейсах (часть 3)"
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Улучшение процессов на примере C3D Labs

👨‍💻 Много лет вы вели монолитную кодовую базу на SVN. Всё налажено, работает, все привыкли. Но вы понимаете, что процесс не вывозит возросшую сложность проекта. Надо развиваться, переходить на современные инструменты. Надо, но страшно. Работает же, привыкли.

Знакомо?

Если да, то посмотрите на опыт команды C3D Labs. У них в 2022 году была та же история: монолит на SVN, линейная работа в одну ветку, долгий процесс доставки... Но команда была намерена (или вынуждена 🙂) развиваться и пошла следующим путем:

1️⃣ Перешли с SVN на Git на базе GitLab, принципиально не меняя схему работы (2022 год).

2️⃣ Начали использовать фича-ветки, постепенно уходя от линейности.

3️⃣ Внедрили работу с ветками через Merge Request.

4️⃣ Освоили встроенный процесс Code Review.

5️⃣ Внедрили менеджер управления зависимостями Conan (2023 год).

6️⃣ Модернизировали систему тестирования.

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

И уже не так страшно, правда?

📍 Читайте всю статью здесь: Об изменениях в процессе доставки геометрического ядра C3D
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
#include <iostream>

class Data
{
char* text;
public:
void init(const Data& other)
{
std::cout << "1";
text = other.text;
}

void init(Data&& other)
{
std::cout << "2";
text = other.text;
}
};

Data createData()
{
return Data();
}

int main()
{
Data a, b, c, d;
b.init(a);
c.init(Data());
d.init(createData());
return 0;
}


Если тяжело ответить на тест, жмите подсказку ⤵️
Надо вспомнить про rvalue-ссылки и временные объекты в C++.
Выше дан код на C++. Какой вывод будет у программы?
Anonymous Quiz
36%
112
0%
211
14%
221
50%
122
Завандалил

Глядя на разрисованный лифт, я вспомнил случай с моими студентами.

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

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

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

Почему, зачем? Да кто его знает. Потому что может. Потому что анонимно. Человек сам же там написал: "анонимочка так что по..."

🤦‍♂️

Анонимность и безнаказанность воистину срывают тормоза.
Please open Telegram to view this post
VIEW IN TELEGRAM
😁2
Как создать оконное приложение на Qt в среде QtCreator

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

Библиотека Qt - это набор классов C++ для создания кросс-платформенных приложений с графическим интерфейсом. С помощью этой библиотеки созданы, например, среда разработки QtCreator и инструмент для записи видео OBS Studio.

✍️ Статья | 📱 YouTube | 📱 ВКонтакте
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
namespace std
{
struct A
{
int _array[256];
bool _filled;
};
}

bool is_filled(std::A obj)
{
return obj._filled;
}

int main()
{
std::A a;
return is_filled(a);
}


🎉 У нас новый формат интерактива: код-ревью!

Выше дан код на C++. Проведите код-ревью и напишите в комментариях свои замечания. Если ваши замечания уже кто-то написал, ставьте палец 👍 комментатору)

Лично мне здесь принципиально не нравятся 4 момента 🧐
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
А вы игнорируете warnings?

😁 - Да
👍 - Нет
🤷‍♂️ - Бывает
👍8😁6🤷‍♂3
Анонимные пространства имен в C++

Пространства имен namespace в C++ служат для решения конфликтов имен классов, функций, переменных и прочего. Другое назначение - смысловое; чтобы повысить читаемость кода.

Например, у стандартной библиотеки STL есть свое пространство имен по названием std. Благодаря этому имена в нашем пользовательском коде никогда не пересекутся с именами стандартной библиотеки. Если конечно мы не будем везде лепить using namespace std; 🤨

Но есть в C++ отдельный тип пространств имен - анонимные (unnamed). Анонимные пространства имен объявляются... 🥁 без указания имени. Вот так:

namespace 
{
// Что-то внутри нейм-спейса
}


У анонимных пространств есть 2 важных свойства:

1️⃣ Они ограничивают область видимости всех сущностей внутри себя только тем файлом исходного кода, в котором они объявлены.

2️⃣ Они являются закрытыми. То есть из разных исходных файлов нельзя добавить сущности в одно и то же анонимное пространство имен.

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

А о том, почему не стоит запихивать свои символы в пространство имен std, мы вспоминали на прошлой неделе. Смотрите комментарии под постом.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1
😁 Да-да, опять этот сиплюсплюс

Но в этот раз подвоха нет, простой расчет ⤵️

#include <iostream>

int main()
{
int a = 0b001010;
int b = 0b100101;
std::cout << (a | b) * (a & b) << "\n";
return 0;
}
😁1
Выше дан код на C++. Какой вывод будет у программы?
Anonymous Quiz
47%
0
16%
0b000001
16%
0b101111
21%
1
🥴2
Моргнул свет и потух комп.

Пробую включать. Он не реагирует. Перещёлкнул блок питания - включился.

Запускаю веб-сервер Apache - не алё. Контрольная панель что-то там ругается, что апача больше нет.
Слабо верится.
Иду смотреть, может конфиги какие слетели, а там... А там реально нет апача. Ну, в смысле нет бинаря httpd. Удалился.

Уже интереснее. Восстановил бинарь. Запускаю его и узнаю, что куча библиотек-зависимостей тоже не в чате...

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

Вот такая фишечка
👍👍👍

Похоже, пятница сегодня у апача. Будьте бдительны 😁
Please open Telegram to view this post
VIEW IN TELEGRAM
😢3
А вы помните свой тот самый мьютекс? 😅

Я вот вспомнить не могу. Чаще в deadlock-и залетал 🙃
🤓2
Библиотека или фреймворк

🔜 Библиотека - это набор функциональности, решающий определенную задачу.

🔜 Фреймворк - это набор функциональности, определяющий структуру приложения.

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

Например, minizip - это библиотека, работающая с архивами, то есть решающая конкретную задачу. А Qt - это уже фреймворк, определяющий все основные элементы приложения: интерфейс, обработка событий, ввод/вывод и др.

#Словарь
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Какой паттерн обеспечивает несколько вариантов алгоритмов, которые легко заменяют друг друга в процессе работы программы?
Anonymous Quiz
6%
Наблюдатель
71%
Стратегия
0%
Одиночка
23%
MVC
🤯1
Продолжая тему проектирования.

Эта картинка - супер-иллюстрация бардака с абстракциями на проекте 😁
Надеюсь, все помнят эту сцену и Гарри Поттера)

Пофантазируем ⤵️

Был проект, где машины ездили, поезда ходили, самолеты летали. Как-то это работало.

Потом в рамках рефакторинга выделили из самолета абстракцию Транспорт и унаследовали от нее Машину, Самолет и Поезд. При этом забыли перенести методы полета в Самолет, оставив их в Транспорте.

Получилось, что теперь Машина умеет летать!
Поезд, кстати, тоже умеет летать, но об этом пока никто не знает. Да никому это и не надо. А вот Уизли докопались и берут от абстракций всё: если есть методы полета, будем их вызывать!

Рон Уизли идет еще дальше и при решении своих задач пробует поставить Машину на Железную дорогу. И ему это удается, так как Железная дорога, оказывается, работает с абстракцией Транспорт 🫢
В итоге в процессе выполнения на проде возникает состояние гонки, и Поезд вступает в конфликт с Машиной.

😨 Все в панике!

Но не понятно из-за чего паника больше: из-за ошибки абстракций или из-за того, что на Поезд подтянулись скины вообще из другого проекта...
😁4😱1
Как начать работать с репозиторием Git на GitHub

В этом видео мы рассмотрим базовые приемы работы с репозиторием git. Мы создадим простой проект из пары файлов, инициализируем на нем репозиторий, научимся делать коммиты и загрузим весь код на GitHub.

📱 YouTube | 📱 ВКонтакте

✍️ Другие способы загрузки кода на GitHub описывал в статье
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Скинули вакансию на технического директора с интересным требованием:

Нам подойдут те управленцы, которые читали книжки по инженерии, а поэтому понимают, что:
- Тестировщики не нужны – разработчики должны сдавать работающий код


Уж простите, но не удержался 😁⤵️
😁3🤡2