С одним плюсом (Андрей Аксёнов)
TRANSCRIPT
![Page 1: С одним плюсом (Андрей Аксёнов)](https://reader035.vdocuments.pub/reader035/viewer/2022062412/5878bdde1a28ab26728b4843/html5/thumbnails/1.jpg)
Андрей Аксёновведущий разработчиков
С ОДНИМ ПЛЮСОМ
![Page 2: С одним плюсом (Андрей Аксёнов)](https://reader035.vdocuments.pub/reader035/viewer/2022062412/5878bdde1a28ab26728b4843/html5/thumbnails/2.jpg)
Про что доклад
• Про моднейшие новейшие стандарты, конечно, а именно• Не надо писать на C++17 или C++14• Не надо писать на C++11• Не надо вообще на C++ писать• Не надо даже писать функционально/объектно/…
![Page 3: С одним плюсом (Андрей Аксёнов)](https://reader035.vdocuments.pub/reader035/viewer/2022062412/5878bdde1a28ab26728b4843/html5/thumbnails/3.jpg)
Про что доклад
• Про моднейшие новейшие стандарты, конечно, а именно• Не надо писать на C++17 или C++14• Не надо писать на C++11• Не надо вообще на C++ писать• Не надо даже писать функционально/объектно/…• Надо писать решения задач, а не “на языке”• Язык должен помогать, “на C++” часто мешает
![Page 4: С одним плюсом (Андрей Аксёнов)](https://reader035.vdocuments.pub/reader035/viewer/2022062412/5878bdde1a28ab26728b4843/html5/thumbnails/4.jpg)
Как же так, столько мегафичей!?
• Как жить без С++17 – пока, правда, несуществующего???• Наконец-то parallel STL algorithms• sort(par_vec, v.begin(), v.end());
• Наконец-то structured bindings• auto {x,y,z} = foo();
• Наконец-то folding expressions• bool all(Args… args) { return (args && …); }
![Page 5: С одним плюсом (Андрей Аксёнов)](https://reader035.vdocuments.pub/reader035/viewer/2022062412/5878bdde1a28ab26728b4843/html5/thumbnails/5.jpg)
Как же так, столько мегафичей!?
• Наконец-то nested namespaces• namespace A::B::C { . . . }
• Наконец-то if/switch initializers;• if (auto ret = map.insert({ "hello", 3 }); !ret.second)
• И еще куча нужнейших вещей типа boost::filesystem или ликвидации триграфов
![Page 6: С одним плюсом (Андрей Аксёнов)](https://reader035.vdocuments.pub/reader035/viewer/2022062412/5878bdde1a28ab26728b4843/html5/thumbnails/6.jpg)
Как же так, столько мегафичей!?
• Как жить без С++14 – пока не вполне поддерживаемого??• Наконец-то return type deduction; auto MyFunction();• Наконец-то юзабельные constexpr functions• Наконец-то binary literals плюс digit separators• auto x = 0b100’11’000’101;
• Наконец-то auto lambda arg types• auto F = [](auto x, auto y) { return x + y; }
![Page 7: С одним плюсом (Андрей Аксёнов)](https://reader035.vdocuments.pub/reader035/viewer/2022062412/5878bdde1a28ab26728b4843/html5/thumbnails/7.jpg)
Как же так, столько мегафичей!?
• Как жить без С++11 хотя бы – уже везде есть!• Наконец-то rvalue refs, move semantics• Наконец-то initializer lists для векторов• Наконец-то auto• Наконец-то lambda• Наконец-то range-based for loop• Наконец-то override/final/default
![Page 8: С одним плюсом (Андрей Аксёнов)](https://reader035.vdocuments.pub/reader035/viewer/2022062412/5878bdde1a28ab26728b4843/html5/thumbnails/8.jpg)
Как же так, столько мегафичей!?
• Наконец-то override/final/default• Наконец-то nullptr и прочие enum class• Наконец-то variadic templates• Наконец-то wchar/utf-8 string literals, u8”heil ISO/IEC”• Наконец-то user literals, auto x = 1234_mysuffix;• Наконец-то стандартные memory model итп thread_local• И еще гора вещей – и все нужные!!!
![Page 9: С одним плюсом (Андрей Аксёнов)](https://reader035.vdocuments.pub/reader035/viewer/2022062412/5878bdde1a28ab26728b4843/html5/thumbnails/9.jpg)
все нужные?
![Page 10: С одним плюсом (Андрей Аксёнов)](https://reader035.vdocuments.pub/reader035/viewer/2022062412/5878bdde1a28ab26728b4843/html5/thumbnails/10.jpg)
все???
![Page 11: С одним плюсом (Андрей Аксёнов)](https://reader035.vdocuments.pub/reader035/viewer/2022062412/5878bdde1a28ab26728b4843/html5/thumbnails/11.jpg)
зачем???
![Page 12: С одним плюсом (Андрей Аксёнов)](https://reader035.vdocuments.pub/reader035/viewer/2022062412/5878bdde1a28ab26728b4843/html5/thumbnails/12.jpg)
Тезис #1. Скрипач не нужен
• В ежеминутном – нет, не нужны 17/14/11 и даже 03• Если задуматься, даже 83/98 не всегда• Если задуматься, в большом проценте plain C хватает!!!
• Если ежеминутно 11/14/17 – вы что-то делаете не так• Возможно, неправильно выбран язык – надо другой
![Page 13: С одним плюсом (Андрей Аксёнов)](https://reader035.vdocuments.pub/reader035/viewer/2022062412/5878bdde1a28ab26728b4843/html5/thumbnails/13.jpg)
Тезис #2. Уметь готовить надо яичницу
• C++ уже 11 это спайс – в обоих смыслах• C++ 14, 17 – считай, Trinidad Scorpion / Carolina Reaper
• Условный T&& – в условном Str::Str(), и всё• Условный memory_order_relaxed – в условном atomic.h• Условный sort(par_vec, …) – не в 1, так 3 местах на 1M• А условные override – и вообще не нужны :P
• Чтобы пожрать, надо картошки и мяса (или хоть риса)• Если оно везде – ты плохой повар или хороший барыга?
![Page 14: С одним плюсом (Андрей Аксёнов)](https://reader035.vdocuments.pub/reader035/viewer/2022062412/5878bdde1a28ab26728b4843/html5/thumbnails/14.jpg)
Тезис #3. Экономить надо дорогое
• C++11, Perl, Python итд бывает разный• Хороший – экономит строчки (сильно) и головы (чуть)• Плохой – только строчки (чуть), головы тратит (сильно)• “Обычный” – бездарно тратит вообще всё, тоннами!!!
• Причем – экономия зависит еще и от людей• А вот пример про auto, lambda• А вот пример про move semantics
• Экономить надо дорогое, дешевое надо просирать
![Page 15: С одним плюсом (Андрей Аксёнов)](https://reader035.vdocuments.pub/reader035/viewer/2022062412/5878bdde1a28ab26728b4843/html5/thumbnails/15.jpg)
Тезис #4. Снимай шоры, учи языки
• Целевой язык – окей, C++ (а может быть Java)• А изучать – надо Python, C#, Scala, Haskell итп Erlang• Должен исчезнуть ряд иллюзий• Должен появиться ряд желаний• b = [x*2 for x in a where x%3]
• Должно появиться понимание концепций• ООП на ассемблере? Pure на C++? Можно и нужно!
![Page 16: С одним плюсом (Андрей Аксёнов)](https://reader035.vdocuments.pub/reader035/viewer/2022062412/5878bdde1a28ab26728b4843/html5/thumbnails/16.jpg)
Тезис #5. Все равно сегодня 2010 год
• У военных Астра – гори она в аду• У энтерпрайзов Центос – гори он в аду• У юзеров винда – кроме тех, где маки с андроидами• У серверов gcc – гори он в аду• Минспек сегодня gcc 4.7, с натяжкой 4.8 – а это 2010.5• Винда сегодня VS2013, в прыжке 2015 – а это 2013.5• Но учим сегодня, завтра таки наступит – gcc 3.4 издох
![Page 17: С одним плюсом (Андрей Аксёнов)](https://reader035.vdocuments.pub/reader035/viewer/2022062412/5878bdde1a28ab26728b4843/html5/thumbnails/17.jpg)
Тезис #6. Тупым живётся легче
• Делать можно кошерно, а можно эффективно• class Angle { float value; }• class Foo { int getBar(); void setBar(int value); }• template<enum A, enum B> class X // +10sec, +500mb• class X { BaseA *a; BaseB *b; }
• Эффективно – это НЕ обязательно в минимум строк• Эффективно – это НЕ в максимум языковых фичей
![Page 18: С одним плюсом (Андрей Аксёнов)](https://reader035.vdocuments.pub/reader035/viewer/2022062412/5878bdde1a28ab26728b4843/html5/thumbnails/18.jpg)
Так что же, щасья нет, дайож C99!?
• Нет, но надо считать bang for buck, причем каждый раз• C99 vs C++03 == примерно 1.5x строк• C++11 vs C++03 == до 1.2-1.5x строк/байт… или нет• C++17 vs C++11 == ???• …а может быть и 0, потому что YMMV
• И надо считать с оглядкой: целевой компилятор, время билда, интеллект команды, …
![Page 19: С одним плюсом (Андрей Аксёнов)](https://reader035.vdocuments.pub/reader035/viewer/2022062412/5878bdde1a28ab26728b4843/html5/thumbnails/19.jpg)
Какой личный опыт?
• C++ хорошо == dtors, scope• C++03 хорошо == полегче в шаблоны• C++11 хорошо == auto, lambda, ranged for• C++14 хорошо == например, lambda auto args• C++17 хорошо == например, auto {x,y,z}
![Page 20: С одним плюсом (Андрей Аксёнов)](https://reader035.vdocuments.pub/reader035/viewer/2022062412/5878bdde1a28ab26728b4843/html5/thumbnails/20.jpg)
Какой личный опыт?
• C++ плохо == trivial accessors, class Angle, лишний ООП• C++03 плохо == boost, муахахахаха• C++11 плохо == move, неоднородность, засилье лямбды• C++14 плохо == …• C++17 плохо == …
![Page 21: С одним плюсом (Андрей Аксёнов)](https://reader035.vdocuments.pub/reader035/viewer/2022062412/5878bdde1a28ab26728b4843/html5/thumbnails/21.jpg)
Итого, как быть?
• Нужно искать sweet spot, и он сугубо “личный”• Нельзя забывать про “слабое звено” в команде• Нельзя смотреть только лишь на LOC
• Сколько живу, всегда “с одним плюсом”• Например, да – шаблонам, нет – boost::phoenix• Например, да – атрибутам, нет – override• Если вдруг у вас другой “minspec” – м.б. наоборот!!!
• Постоянно зорко озираться – где толк, а где горе
![Page 22: С одним плюсом (Андрей Аксёнов)](https://reader035.vdocuments.pub/reader035/viewer/2022062412/5878bdde1a28ab26728b4843/html5/thumbnails/22.jpg)
Итого, что там C++11 и выше в бою?
• Ура, в 2016 уже можно C++11 – а было нельзя• Отстой, в 2016 ещё нельзя C++14 – но станет можно• При этом мегаэкономии – уже не будет, 03 good enough• При этом auto – ура, override – отстой, например• При этом variadics – спасение, но – не нужны, например• При этом – оно личное, ymmv (но я не верю так-то)• Главное, не надо пользоваться стеклянными молотками
![Page 23: С одним плюсом (Андрей Аксёнов)](https://reader035.vdocuments.pub/reader035/viewer/2022062412/5878bdde1a28ab26728b4843/html5/thumbnails/23.jpg)
3-word takeout?
![Page 24: С одним плюсом (Андрей Аксёнов)](https://reader035.vdocuments.pub/reader035/viewer/2022062412/5878bdde1a28ab26728b4843/html5/thumbnails/24.jpg)
не пишите на c++11
![Page 25: С одним плюсом (Андрей Аксёнов)](https://reader035.vdocuments.pub/reader035/viewer/2022062412/5878bdde1a28ab26728b4843/html5/thumbnails/25.jpg)
пишите просто(пофигу на чём)
![Page 27: С одним плюсом (Андрей Аксёнов)](https://reader035.vdocuments.pub/reader035/viewer/2022062412/5878bdde1a28ab26728b4843/html5/thumbnails/27.jpg)
Бонус-трек
• Можно писать на C++03/11/14/17, а можно коротко• Можно вырезать кружева лобзиком, а можно ясно• Можно бороться с компиляторами, а можно багами• Можно работать усердно и много, а можно головой
• Я лично – за тупизну и лень!!!
![Page 28: С одним плюсом (Андрей Аксёнов)](https://reader035.vdocuments.pub/reader035/viewer/2022062412/5878bdde1a28ab26728b4843/html5/thumbnails/28.jpg)
Бонус-трек
• А ещё нормально оформляйте• А ещё нормально именуйте• А ещё нормально сокращайте• А ещё нормально комментируйте• А ещё нормально собирайте• А ещё нормально тестируйте• А ещё ингеборга дапкунайте