С одним плюсом (Андрей Аксёнов)

28
Андрей Аксёнов ведущий разработчиков С ОДНИМ ПЛЮСОМ

Transcript of С одним плюсом (Андрей Аксёнов)

Page 1: С одним плюсом (Андрей Аксёнов)

Андрей Аксёновведущий разработчиков

С ОДНИМ ПЛЮСОМ

Page 2: С одним плюсом (Андрей Аксёнов)

Про что доклад

• Про моднейшие новейшие стандарты, конечно, а именно• Не надо писать на C++17 или C++14• Не надо писать на C++11• Не надо вообще на C++ писать• Не надо даже писать функционально/объектно/…

Page 3: С одним плюсом (Андрей Аксёнов)

Про что доклад

• Про моднейшие новейшие стандарты, конечно, а именно• Не надо писать на C++17 или C++14• Не надо писать на C++11• Не надо вообще на C++ писать• Не надо даже писать функционально/объектно/…• Надо писать решения задач, а не “на языке”• Язык должен помогать, “на C++” часто мешает

Page 4: С одним плюсом (Андрей Аксёнов)

Как же так, столько мегафичей!?

• Как жить без С++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: С одним плюсом (Андрей Аксёнов)

Как же так, столько мегафичей!?

• Наконец-то nested namespaces• namespace A::B::C { . . . }

• Наконец-то if/switch initializers;• if (auto ret = map.insert({ "hello", 3 }); !ret.second)

• И еще куча нужнейших вещей типа boost::filesystem или ликвидации триграфов

Page 6: С одним плюсом (Андрей Аксёнов)

Как же так, столько мегафичей!?

• Как жить без С++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: С одним плюсом (Андрей Аксёнов)

Как же так, столько мегафичей!?

• Как жить без С++11 хотя бы – уже везде есть!• Наконец-то rvalue refs, move semantics• Наконец-то initializer lists для векторов• Наконец-то auto• Наконец-то lambda• Наконец-то range-based for loop• Наконец-то override/final/default

Page 8: С одним плюсом (Андрей Аксёнов)

Как же так, столько мегафичей!?

• Наконец-то 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: С одним плюсом (Андрей Аксёнов)

все нужные?

Page 10: С одним плюсом (Андрей Аксёнов)

все???

Page 11: С одним плюсом (Андрей Аксёнов)

зачем???

Page 12: С одним плюсом (Андрей Аксёнов)

Тезис #1. Скрипач не нужен

• В ежеминутном – нет, не нужны 17/14/11 и даже 03• Если задуматься, даже 83/98 не всегда• Если задуматься, в большом проценте plain C хватает!!!

• Если ежеминутно 11/14/17 – вы что-то делаете не так• Возможно, неправильно выбран язык – надо другой

Page 13: С одним плюсом (Андрей Аксёнов)

Тезис #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: С одним плюсом (Андрей Аксёнов)

Тезис #3. Экономить надо дорогое

• C++11, Perl, Python итд бывает разный• Хороший – экономит строчки (сильно) и головы (чуть)• Плохой – только строчки (чуть), головы тратит (сильно)• “Обычный” – бездарно тратит вообще всё, тоннами!!!

• Причем – экономия зависит еще и от людей• А вот пример про auto, lambda• А вот пример про move semantics

• Экономить надо дорогое, дешевое надо просирать

Page 15: С одним плюсом (Андрей Аксёнов)

Тезис #4. Снимай шоры, учи языки

• Целевой язык – окей, C++ (а может быть Java)• А изучать – надо Python, C#, Scala, Haskell итп Erlang• Должен исчезнуть ряд иллюзий• Должен появиться ряд желаний• b = [x*2 for x in a where x%3]

• Должно появиться понимание концепций• ООП на ассемблере? Pure на C++? Можно и нужно!

Page 16: С одним плюсом (Андрей Аксёнов)

Тезис #5. Все равно сегодня 2010 год

• У военных Астра – гори она в аду• У энтерпрайзов Центос – гори он в аду• У юзеров винда – кроме тех, где маки с андроидами• У серверов gcc – гори он в аду• Минспек сегодня gcc 4.7, с натяжкой 4.8 – а это 2010.5• Винда сегодня VS2013, в прыжке 2015 – а это 2013.5• Но учим сегодня, завтра таки наступит – gcc 3.4 издох

Page 17: С одним плюсом (Андрей Аксёнов)

Тезис #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: С одним плюсом (Андрей Аксёнов)

Так что же, щасья нет, дайож 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: С одним плюсом (Андрей Аксёнов)

Какой личный опыт?

• C++ хорошо == dtors, scope• C++03 хорошо == полегче в шаблоны• C++11 хорошо == auto, lambda, ranged for• C++14 хорошо == например, lambda auto args• C++17 хорошо == например, auto {x,y,z}

Page 20: С одним плюсом (Андрей Аксёнов)

Какой личный опыт?

• C++ плохо == trivial accessors, class Angle, лишний ООП• C++03 плохо == boost, муахахахаха• C++11 плохо == move, неоднородность, засилье лямбды• C++14 плохо == …• C++17 плохо == …

Page 21: С одним плюсом (Андрей Аксёнов)

Итого, как быть?

• Нужно искать sweet spot, и он сугубо “личный”• Нельзя забывать про “слабое звено” в команде• Нельзя смотреть только лишь на LOC

• Сколько живу, всегда “с одним плюсом”• Например, да – шаблонам, нет – boost::phoenix• Например, да – атрибутам, нет – override• Если вдруг у вас другой “minspec” – м.б. наоборот!!!

• Постоянно зорко озираться – где толк, а где горе

Page 22: С одним плюсом (Андрей Аксёнов)

Итого, что там C++11 и выше в бою?

• Ура, в 2016 уже можно C++11 – а было нельзя• Отстой, в 2016 ещё нельзя C++14 – но станет можно• При этом мегаэкономии – уже не будет, 03 good enough• При этом auto – ура, override – отстой, например• При этом variadics – спасение, но – не нужны, например• При этом – оно личное, ymmv (но я не верю так-то)• Главное, не надо пользоваться стеклянными молотками

Page 23: С одним плюсом (Андрей Аксёнов)

3-word takeout?

Page 24: С одним плюсом (Андрей Аксёнов)

не пишите на c++11

Page 25: С одним плюсом (Андрей Аксёнов)

пишите просто(пофигу на чём)

Page 26: С одним плюсом (Андрей Аксёнов)

Вопросы? Комментарии? Резюме?

skype:[email protected]

unigine.com

Page 27: С одним плюсом (Андрей Аксёнов)

Бонус-трек

• Можно писать на C++03/11/14/17, а можно коротко• Можно вырезать кружева лобзиком, а можно ясно• Можно бороться с компиляторами, а можно багами• Можно работать усердно и много, а можно головой

• Я лично – за тупизну и лень!!!

Page 28: С одним плюсом (Андрей Аксёнов)

Бонус-трек

• А ещё нормально оформляйте• А ещё нормально именуйте• А ещё нормально сокращайте• А ещё нормально комментируйте• А ещё нормально собирайте• А ещё нормально тестируйте• А ещё ингеборга дапкунайте