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

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

Контент: https://taplink.cc/atrotsenko
Download Telegram
Какой принцип проектирования гласит, что код должен зависеть от абстракций, а не от конкретных классов?
Final Results
70%
Принцип инверсии зависимостей
20%
Принцип открытости/закрытости
0%
Принцип подстановки Лисков
10%
Принцип японской Годзиллы
🤯3
⬆️ ❌ В этой викторине я вмазал правильный ответ не туда 😁
Когда-то это должно было случиться) Видимо принял желаемое за действительное...
Давайте заново!
Какой принцип проектирования гласит, что код должен зависеть от абстракций, а не от конкретных классов?
Anonymous Quiz
40%
Принцип инверсии зависимостей
30%
Принцип открытости/закрытости
5%
Принцип подстановки Лисков
25%
Принцип японской Годзиллы
Конкуретность или параллелизм

Оба понятия говорят об одновременном выполнении задач. Разница в деталях. #Словарь

Конкуретность - это одновременное выполнение N задач на одной вычислительной единице.

Параллелизм - это одновременное выполнение N задач на N вычислительных единиц.

При параллелизме "одновременность" обеспечиваются многопроцессорным “железом”, а при конкуретности - преимущественно логикой программы с управлением конфликтами.

Эта картинка хорошо показывает различие:
👍2
#include <iostream>

struct B { int n; };
class X : virtual public B {};
class Y : virtual public B {};
struct AA : X, Y
{
AA()
{
X::n = 1;
Y::n = 2;
std::cout << X::n << Y::n << '\n';
}
};

int main()
{
AA a;
return 0;
}
😱3
Выше дан код на C++. Какой вывод будет у программы?
Anonymous Quiz
25%
22
5%
11
30%
12
40%
Никакой. Ошибка сборки
🙏2
Аутсорсинг или аутстаффинг

И то, и другое - это форма взаимоотношений, при которой одна организация привлекает к своей работе другую организацию как внешний ресурс.

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

При аутстаффинге (outstaffing) компания-заказчик берет в штат сотрудника компании-подрядчика. Заказчик сам заботится об организации работы сотрудника на аутстаффе.

В ИТ распространены оба формата. Мне, например, удалось поработать и аутсорсером, и аутстаффером 😏

#Словарь
👍3
git worktree

Команда git worktree создает копию репозитория в отдельной папке.

Главное отличие этой команды от обычного клонирования - это отсутствие дублирования репозитория. Мы остаемся в пределах его локальной копии. Все локальные ветки и коммиты видны из каждого worktree.

Использование worktree упрощает нашу работу в нескольких ветках параллельно. Это особенно актуально для проектов, где переключение между ветками занимает продолжительное время. Например, из-за долгой сборки или трудоемкой конфигурации.

📍Git. Скачем между ветками как древесные лягушки
📍Картинка взята отсюда
👍2
Известно, что тормозной путь автомобиля со скорости 50 км/ч равен 14 метрам. Дайте оценку, каким будет тормозной путь со скорости 100 км/ч
Anonymous Quiz
13%
10 - 20 метров
17%
20 - 30 метров
42%
30 - 50 метров
29%
50 - 70 метров
Как использовать исключения. Рекомендация

💬 "Либо генерируй исключение, либо обрабатывай его, либо уходи с дороги!"

Используйте оператор throw там, где обнаружена ошибка, но нет возможности обработать ее самостоятельно.

Используйте ключевые слова try и catch там, где вы обладаете достаточной информацией для обработки ошибки, ее преобразования или обеспечения границы, определенной стратегией обработки ошибок (например, catch(...) на границе подсистемы).

📍Саттер Г. - Новые сложные задачи на С++
👍1🙏1
#include <iostream>

class Base
{
public:
Base() {}
virtual ~Base(){}
void print()
{
std::cout << "Base" << std::endl;
}
};

class Derived : public Base
{
public:
Derived() {}
virtual ~Derived(){}
void print()
{
std::cout << "Derived" << std::endl;
}
};

int main()
{
Base* b = new Derived;
b->print();
delete b;
return 0;
}
Выше дан код на C++. Какой вывод будет у программы?
Anonymous Quiz
27%
Base
45%
Derived
14%
BaseDerived
14%
Одна строка “Base”, вторая строка “Derived”
😢2
Идиот

Наконец-то познакомился с “Идиотом” Достоевского. И я никак не ожидал, что история действительно будет про идиота 😁. Думал, мол, “идиот” это игра слов и все такое. Но нет, герой натурально себе на уме. Странный малый.

Но вот что зацепило ⬇️

🔜 Обыкновенные люди
Есть люди, о которых трудно сказать что-нибудь такое, что представило бы их разом и целиком, в их самом типическом и характерном виде; это те люди, которых обыкновенно называют людьми «обыкновенными», «большинством», и которые действительно составляют огромное большинство всякого общества.

Достоевским делается акцент на самого обыкновенного человека. Ну что-то вроде моего так себе программиста, понимаете?
“образование порядочное, но не знаешь, на что его употребить; ум есть, но без своих идей”… Да-да! Вроде бы всё при себе, но ничего выдающегося. Зато обыкновенным людям нашлось место в достоевщине ☝️

🔜 “Муравейники”
Дом был огромной величины, одна из тех громадин, которые строятся аферистами для мелких квартир; в иных из таких домов бывает иногда нумеров до ста.

До ста… Не смешите мои кхм-кхм. 150 лет прошло, а ситуация та же. Но тогда хоть голову не ломали, куда свою самоходную колесницу приткнуть.

🔜 Изобретательство
Изобретатели и гении почти всегда при начале своего поприща (а очень часто и в конце) считались в обществе не более как дураками, - это уж самое рутинное замечание, слишком всем известное.

Точно. Над первыми авиастроителями тоже смеялись: камень кинь, и он полетит. Но отрицание и гнев через торг сменились принятием. Таков уж путь идеи в массы. Не унывайте, гении 😉

P.S. Читать было сложно. Бесконечные монотонные разговоры утомляли. Но финал удивил. Чего-чего, а такого финта я не ожидал.

#КнижнаяПолка
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
git без GitHub

Если мы пишем курсач или дипломный проект. Если изучаем что-то новое или экспериментируем. Если завели пет-проект без каких-либо планов. То ничто нам не мешает сразу сделать “git init” и коммитить!

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

Зачем? Объясняю.

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

И конечно же есть невыгода:
❌придется работать с git-ом.
Аж с тремя командами:
- git init, чтобы инициализировать репозиторий;
- git add, чтобы подготовить файлы к коммиту;
- git commit, чтобы, собственно, зафиксировать изменения.

Не стесняйтесь помогать себе подходящими инструментами. А то можно запутаться в бесконечных kursach_v1.zip … kursach_v42.zip 😉
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
Какой из предложенных выше интерфейсов более корректный?
Anonymous Quiz
100%
Левый
0%
Правый
Как это развидеть?

Как испортить дизайн интерфейса? Легко! И спец-курс не нужен 😅 Но даже легкая теория и небольшая насмотренность поможет меньше портачить.

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

Есть забавный игровой тренажёр Can’t Unsee, где можно потренироваться. Принцип простой: из двух предложенных вариантов интерфейса нужно выбрать более корректный.

Попробуйте. Лично мне уже на среднем уровне было сложно что-то разглядеть.
👍4👌2
#include <iostream>

struct MyStruct
{
int var1{0};
unsigned int var2{-1};
};

int main()
{
MyStruct s;
std::cout << "var1=" << s.var1 << "; "
<< "var2=" << s.var2 << std::endl;
return 0;
}
Выше дан код на C++. Какой вывод будет у программы?
Anonymous Quiz
20%
var1=0; var2=-1
5%
var1=0; var2=0
20%
var1=0; var2=4294967295
55%
Никакой. Ошибка компиляции.
bool как аргумент

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

Давайте посмотрим на эту функцию:
void SetData( std::string value, bool isFilePath );


Аргумент isFilePath призван менять логику функции при обработке строки value. Если isFilePath==true, то строка интерпретируется не как данные, а как путь к файлу данных. Это расхожий шаблон, который можно увидеть у новичков.

С технической точки зрения проблемы здесь нет. Трудности могут возникнуть при чтении такого кода. Например, использование функции может выглядеть так:
obj.SetData( value, true );

И думай-гадай, что тут за true... Придётся смотреть объявление функции.
А если сделать по-другому:
void SetDataString( std::string value );
void SetDataFile( std::string filePath );

То становится понятнее, правда? Да, больше слов. Да, ещё одна функция. Но понятнее.

Как бы то ни было, рубить с плеча тоже не стоит. Дурной тон дурным тоном, но булевым аргументам найдется место. Например, при реализации поведения вкл/выкл:
obj.SetEnabled( true );

Или ещё где-нибудь. Лишь бы читалось.

Ещё по теме - здесь.
🔥2👍1