
Лига программистов C/C++
Стек, функция, передача по значению
Друзья, пишу небольшие карточки для школьников по Ардуино. Сейчас проходим функции, а именно передачу по значению. В теории как и на практике всё понятно, но описать понятным для них языком проблематично. Упрощаю уже до "нельзя". Есть ли какие замечания по представленному? Любая критика или помощь, только - За!
С++-программист - приколы с собеседований
Занимаюсь поиском работы, прохожу собеседования тут разные. Разработчик C++. Делюсь улыбками с вами.
Звонит человек, представился техническим руководителем какой-то компании, набирает людей в новую команду. Я спрашиваю:
- Скажите, какой стандарт С++ у вас используется в проекте?
- Стандарт? Да никаких стандартов у нас нет! У нас вообще очень демократичная компания, никакой тебе бюрократии!
- Эээ... до свидания.
Другой эпизод (другая компания):
- Мы небольшая уютная компания (около 50 человек - прим.), у нас все демократичненько, без бюрократии (я уже начинаю напрягаться когда слышу "без бюрократии" - прим.), все быстро решается с руководителями!
я, через некоторое время беседы:
- Расскажите. допустим кто-то из разработчиков предлагает улучшение процесса, ну, принять Код Стайл, например. Как у вас организован процесс подобных улучшений:
- Ну, для начала автор предложения должен согласовать с техлидом и создать тикет в JIRA. Потом менеджер проекта его просматривает, если возражений нет, возвращается автору. Автор дописывает оценку по срокам, а так же какую финансовую выгоду предложение несет. Тикет переводится тех. диру, который с генеральным директором обсуждает уже целесообразность внедрения изменения. После этого задача попадает в беклог.
- Стоп, может вы не поняли, речь о любых изменениях?
- Да, конечно, генеральный директор отслеживает все предложения которые влияют на эффективность.
(разговор был не тупо с HR если что, а в нем участвовал техдир пресловутый). Демократичненько.
Еще тоже забавное:
- HR от кадрового агенства кидает вакансию, в компанию где я работал на предыдущем месте работы. Та же самая должность, команда и тп. слово в слово отраженная в моем резюме. Ну... неожиданно, да почему нет, вдруг я решу вернуться, ничего предосудительного.
Но добило сопроводительное: "mapron, скажите, у вас есть опыт с технология1 и технология2 для данной позиции?". Конечно, мать твою, ты б хоть резюме мое открыла...
поделился с коллегой с прошлой работы, он грит, это что, из этого же агентства ему падали предложения на должность где он и так работает в этой же компании.
И под конец, скорее грустное.
Спрашиваю технического руководителя, есть ли у них практика мёрджей без ревью и в каких условиях это происходит.
- Конечно, для опытных сотрудников которые давно работают, у нас это не проводится. Они могут и коммиты прямо в master оформлять.
- Эмм, можно уточнение, скажите по-вашему, для чего нужно ревью кода? 2-3 пункта?
- Проверить что стиль кода соответствует, что идеологии компании соответствует (не уточнял что это значит вообще - прим.), что нет крашей в коде. Но поверьте, опытные разработчики не делают таких ошибок, чтобы их ревьюить!
Грустное скорее по тому что такой подход к ревью кода я больше чем в половине компаний вижу, с кем общаюсь... мол ревью это чтобы тебе старший в ошибку ткнул и это всё.
Как устроиться на работу Trainee/Junior?
Не так давно к нам с женой в гости приехала подруга жены, с молодым человеком. Этот молодой человек (который оказался действительно прилично моложе меня) работает программистом в достаточно большой компании. Он оказался крайне интересным человеком и с помощью пары бутылок вина я решил перейти на темную сторону. Тобишь, сменить специализацию. Как итог - теперь я учу c++ примерно по 4 часа в сутки с пару месяцев. Как ни странно, оказалось, что мне это очень сильно нравится и уже начало что-то получаться. Но вот дилемма: на данный момент у меня есть основная профессия, которая занимает примерно пол дня, 3-4 дня в неделю. Иногда меньше, но бывает и сутками без вынимачки. Все зависит только от меня. Проблема в том, что эта профессия кормит как меня, так и мою семью. И как уйти из нее в программирование, примерно на те же деньги - я не знаю. На данный момент я могу претендовать только на trainee, может, на недо-джуна. Я трезво оцениваю свои навыки и понимаю, что сразу принести пользу компании - я вряд ли смогу. Значит, компания будет со мной работать в минус, ведь это - рабочее место, время и силы кадровика, нервы и человеко-часы наставника. На выходе - имеем вилку: работодатель забирает меня на полный рабочий день и платит мне заработную плату, с которой я кормлю семью, либо работодатель забирает меня не на full time, на какой-то более "мягкий" график, я продолжаю кормить семью с старой работы, работая (получая практику) бесплатно. Конечно, оба варианта меня полностью устраивают.
Но реальность немного другая. Я пару дней искал подобные варианты, но даже с бесплатной работой - такие как я - просто не нужны. Никто не хочет заморачиваться, никто не будет верить в то, что потом я останусь работать в той же компании, которая сможет "пригреть" и обучить "под свои нужды".
Дорогие Пикабушники, расскажите, как Вы устроились в первый раз? Сталкивался ли кто-то с такой сменой профессии? Как Вы выходили из подобной ситуации?
Типобезопасные контейнеры в GNU C11 без кодогенерации
Всем привет!
Я решаю проблему про которую никто не знает, на языке, на котором никто не пишет. Это пост про язык Си.
Я сам не пишу на Си уже очень давно. Профессионально последние 7 лет только на C++ и C#. Но Си очень привлекает своей простотой. Но отталкивает отсутствием множества удобных штук.
Есть интересное открытие, которым я хотел бы поделиться, но не знаю с кем, так как мало кто пишет на Си и вообще задумывается о нем. Поэтому напишу тут, вдруг кому-то будет интересно. Это не готовое решение, а лишь идея, которая пришла в голову вчера утром и обросла деталями в течении дня.
Не хочу чтобы идея пылилась, хочу скорее от нее освободиться и вернуться к работе. Поэтому в посте мало деталей, пожалуйста, посмотрите пример, там вроде все довольно понятно.
Вот сразу ссылка на пример в Wandbox - https://wandbox.org/permlink/pOwkHRfWyipp8P89
1. Проблема
Если вы хотите универсальные контейнера на Си, можно пойти двумя путями:
1. Макросы, которые работают почти как шаблоны в C++, генерировать функции для доступа к контейнерам для тех типов, которые вы хотите использовать. Вот пример: https://github.com/stefanct/sglib
Это быстро, но требует объявить все используемые типы в одном месте, что усложняет разделение проекта на модули. Поправьте, если я не прав.
2. Типы данных, хранящие всю инфорацию внутри как это сделано в Glib https://developer.gnome.org/glib/2.66/ в данном случае, невозможно организовать типобезопасность, повсеместно используюется void* . Меняешь тип контейнера и не знаешь, что после этого отвалится. Моя цель - решить именно этот класс проблем.
2. Как выглядит решение
Так вот, слыхали что существует C11? Это почти как C++11, только C11.
Так вот, там появилось такое ключевое слово _Generic, которое позволяет выбрать функцию, в зависимости от типа и позволяет сделать какую ни какую перегрузку функций (которой нет в Си из коробки)
Оказалось, что используя _Generic + typeof() из GNU + указатели на функции можно сделать типобезопасные контейнеры прямо в Си! Эти контейнеры не используют кодогенерацию, однако так же удобны в использовании (хотя будут чуть медленней работать, но в большинстве случаев удобство важнее)
Вот короткий пример создания вектора:
ABVECTOR(int) numbers = CREATE_ABVECTOR(int);
for (int i = 0; i < 20; i++)
*PUSH( numbers) = i; // обратите внимание, тип известен!
В данном примере ABVECTOR(int) это аналог std::vector<int>
Если поменять тип контейнера, или тип переменной хоть в одном месте, вы получите ошибку компиляции. А это ровно то, чего я хочу!
Другой пример, передача контейнера в качестве аргумента в функцию:
void printValues(ABVECTOR(float) numbers)
{
for (float* iter = BEGIN(numbers); iter != END(numbers); iter = NEXT(numbers, iter))
printf("Val: %f\n", *iter);
for (int i = 0; i < LENGTH(numbers); i++)
printf("Val: %f\n", *GET(numbers, i));
}
Если передать в функцию неправильный тип контейнера, например List, вместо Vector - будет ошибка. Если тип элемента контейнера будет отличаться - то же ошибка.
3. Как этого добиться?
1. Использовать указатель на функцию чтобы хранить сразу два типа, тип контейнера + тип элемента. Например int (*) (ABVector*)
2. Использовать typeof, чтобы достать тип элемента контейнера typeof( X(0) ) - получение типа результата вызова функции
3. Использовать _Generic, чтобы проверить тип контейнера
_Generic(( X ), typeof(X(0)) (*) (ABVector*) : __my_container_func__ )(X)
На этом пожалуй все ) Спасибо за внимание!
Не забудьте потыкать пример в Wandbox - https://wandbox.org/permlink/pOwkHRfWyipp8P89
Краткое содержание доклада "Незаменимый С++"
Автор доклада: Антон Полухин.
Конференция: C++ Russia 2019 Piter.
Ссылка на видео доклада: https://www.youtube.com/watch?v=LZflL44SVVY&list=PLZN9ZG....
Краткое содержание с таймингом:
1:20 - миф "На С++ не пишут". На С++ написаны все поисковые движки, игры с хорошей графикой (даже если наружу торчит C#, внутри - С++), компиляторы, ...
6:45 - "чем С++ привлекает?" - вы не платите за то, чем не пользуетесь, поддержка огромного количества платформ, ...
9:05 - "сравнение С++ с другими языками":
1) нельзя найти гениального разработчика на ассемблере, который оптимизирует код лучше, чем С++.
2) Rust потенциально позволяет оптимизировать код лучше. На простом примере показано что сейчас Rust оптимизирует хуже. На Rust сложно использовать библиотеки на Си.
3) Go скорее конкурент Python, чем С++.
4) Почему в бенчмарках оказывается, что язык X быстрее С++?
- в языке Х отключается сборщик мусора;
- код пишется не на С++ (float* value = new float;)
- на X написана другая программа - (php долго обгонял все языки в 8 раз, но программа на php работала в 32 потока).
- тестируется библиотека, а не язык (в С++ не очень хорошо с дизайном регулярных выражений).
5) миф "Сборщик мусора не добавляет накладных расходов". Очень кратко рассказывается как может работать сборщик мусора. Для сборки мусора нужно хранить дополнительную информацию об объектах. Сильное замедление в многопоточном коде. ...
6) сравнение с C# и Java. Для своих ниш эти библиотеки очень хорошо подходят, но есть накладные расходы (за счет сборщика мусора). Отсылка к другому видео (где показывался аналог Logstash, разработанный в Яндексе на C++).
41:10 Проблемы С++:
- скрытый высокий порог вхождения;
- отсутствие изкоробочности (в том числе за счет отсутствия готовой инфраструктуры)
43:40 Итоги.