Как стать автором
Обновить
0
0

Пользователь

Отправить сообщение

Студентам в ВУЗ-ах калечат мозг. Я учил программированию С/С++/Python. Много лет. Я не читаю лекции, не пишу книги, не создаю видеоролики. Натаскиваю индивидуально. Учил школьников, студентов, выпускников университетов, даже программистов со стажем в Adobe. Мне проще обучить программированию 3D-графики блондинку художницу без елементарного математического базиса, чем выпускника университета по специальности кибернетика. Подтягивать по специальности профессиональных программистов ещё сложнее, но это как раз и не удивляет, работа на износ однозначно калечит. А вот преподавателей обучать на удивление легко. Возможно потому, что они любой изучаемый материал инстинктивно готовятся преподавать:)

Спасибо Вам за плодотворный диалог «khim». Буду посмотреть. :)
Нет, программа далеко не однопоточная. эта помесь паттернов «state» и «visitor», из ядра высоко-нагруженного мультизадачного сервера. Вход через визитирование состояний — для «view 0..N» иерахии, а запросы через «state» interface — для «model», «dependency graph computation model». Короче всё что может вызвать «lag» в «event driven main loop», выходящий за рамки «jitter», ставится на очередь в «tread-pool». Здесь это состояние «started». Транзакции ожидают 1..M машин из тредов. После чего визитор из main-thread проверяет очередь транзакций, т.е. набор попавших в них машин на состояние «success». Соответственно проводит, отменяет или оставляет в очереди (ожидает). Времени у него опять же в рамках заданного jitter. В принципе «main-thread» — привелигирован, как маститый хирург в больнице — заходит только в полностью подготовленную операционную, колдует пять минут и валит в следующую. А пациента в морг в палату из палаты носит толпа медиков рангом пониже. Как-то так.
Паранойя, — мой верный товарищ, говорит что всё новое, это к рефакторингу. И пока я точно не пойму, что все новые плюшки С++ даются без ущерба для быстродействия, буду нервно пялиться в АСМ, и ворчать. А без локов, это значит, что все статики нужно создать в main-thread, до того как прочие треды начинать использовать?
Думаю потому, что я старый пень, который успешно программирует уже 30 лет. Зная от силы, половину С++. И всё новое меня или пугает или просто бесит.
Спасибо за ваш труд khim (не должно было собираться ниже чем GCC 3.8). А в опциях -O3 -frtti юзано? В самом деле старых компиляторов на гадболте не стало, а каких-то примочек странных добавилось. Теперь сравните со static инстанцией визитора и без static. И пора в личку, хотя тему Хеллоуина некро-код не портит IMHO.
Перестал, обрёл признаки UB. Нет, не решает. Я достаточно обрезал этот фрагмент кода, до copy-paste в godbolt.org. Открыть сайт, выбрать С++, вставить фрагмент, Ctrl-Enter — скомпилировать и смотреть результитрующий ASM. Выбрать icc, gcc, или другой компилятор. Вставить опции компиляции. Смотреть результат.
Для реализации новых фич разработчики компиляторов утяжелили реализацию обращения к static переменным, в частности ради threadsafty. В чисто однозадачном древнем коде, разработчик вклинивал статик для предотвращения стекового создания/удаления инстанции визитора при входе процесса в тело функции с инстанцией визитора внутри. Но в современном компиляторе это перестало быть действием ускоряющим выполнение функции. С точностью до наоборот. Визитор стало дешевле и безопаснее пересоздавать, чем обращаться к его статической инстанции.
Идентификаторы я помянул для краткости, беда не столько в них сколько в этом:
-O3 -frtti:
struct machine {
    struct success; struct failure; struct started; struct invalid;
    struct state_t{
        virtual bool interface_meth0(machine*)              {return false;}
        virtual void interface_meth1(machine*, const bool&) {}
        virtual long interface_meth2(machine*, const char*) {return 0;}
        struct proc {
            virtual void on(machine::success*) =0;
            virtual void on(machine::failure*) =0;
            virtual void on(machine::started*) =0;
            virtual void on(machine::invalid*) =0;
            virtual ~proc() {}
        };
        virtual void on(machine::state_t::proc*) = 0;
        virtual ~state_t() {}
    }                                                 * stat ;
    virtual bool interface_meth0()             { return stat->interface_meth0(this);   }
    virtual void interface_meth1(const bool&o) {        stat->interface_meth1(this,o); }
    virtual long interface_meth2(const char*o) { return stat->interface_meth2(this,o); }
    virtual ~machine() {}

    static struct success:state_t { void on(state_t::proc*o){ o->on(this);} } success_state;
    static struct failure:state_t { void on(state_t::proc*o){ o->on(this);} } failure_state;
    static struct started:state_t { void on(state_t::proc*o){ o->on(this);} } started_state;
    static struct invalid:state_t { void on(state_t::proc*o){ o->on(this);} } invalid_state;
    machine()                              :stat                            (&invalid_state) { }
};

const char* get_state_name (machine* m) {
    // В этой строке "восставший-труп-автора" для С++11 снесёт "static"
    // а для древней GCC оставит "static" на месте
    static struct: machine::state_t::proc {
        const char* name;
        void on(machine::success*) { name="SUCCESS"; }
        void on(machine::failure*) { name="FAILURE"; }
        void on(machine::started*) { name="STARTED"; }
        void on(machine::invalid*) { name="INVALID"; }
    } visitor;  m->stat->on(& visitor );  // make-visitor-call-visitor
    return visitor.name;
}

Ради экономии на несколько команд ASMа. Снёс бы, но не снесёт, ибо в гробу уже.
get_state_name(machine*):
  sub rsp, 24 #31.41
  mov rdi, QWORD PTR [8+rdi] #39.5
  lea rsi, QWORD PTR [rsp] #39.19
  mov QWORD PTR [rsi], offset flat: vtable for get_state_name(machine*)::{unnamed type#1}+16 #38.19
  mov rax, QWORD PTR [rdi] #39.19
  call QWORD PTR [24+rax] #39.19
  mov rax, QWORD PTR [8+rsp] #40.12
  add rsp, 24 #40.12
  ret #40.12
Новые стандарты С++ являются чистым злом. Само их существование создаёт нишу для того, что возможно будет названо «кросс-компитяторным С++ программированием». По аналогии с печально известным «кросс-браузерным». Писатели стандартов наивно полагают что покойники встанут из могил и отрефакторят свой код, если использовали в нем идентификаторы названные ныне ключевыми словами? Вот тема для Halloween. IMHO
Просто нужна решимость ехать! Из моих знакомых IT, уже почти все уехали. В том числе и такие кто владел только третью Python, половиной PHP и осьмушкой английского. А нужны все IT и дизайнеры и верстальшики и тестеры и 2D/3D художники и скриптеры MAX, Maya, Photoshop..., миф о востребованности только сверх крутых программистов — просто миф. Русского и Английского для работы достаточно. Везде. А местные диалекты достаточно знать в рамках словаря: «Да», «Нет», «Купить», «Спасибо», «Пожалуйста», «Что это?» и «Моя не понимать ваша глупая язык».
Что делать? — Однозначно уезжать! Ибо IT-шник везде себе работу найдет. Ну а результат «Страна без IT» — это уже проблемы стран храбро перешедших от идей коммунизма к реалиям воинствующего идиотизма. IMHO.
"… Ядра обеспечивают им стабильное жилище."
Что препятствует распаду нейтронов в ядрах атомов? Нужен, как минимум, намёк как там считают теоретики. В ядре время течет по другому? Нейтрон в ядре не является собой и разложен на запчасти в квантовом супе с клёцками из вероятностей? И то и другое? Или ответ меняется из года в год, как ответ на вопрос «почему ночное небо черное?».
Какое нам дело то истории американского ЯО. Советского ЯО уже не осталось. Для содержания ЯО в боевой готовности бюджет военный должен был быть на порядок больше, чем был последние 20 лет. И все это прекрасно знают. Иначе, относились бы к РФ как к СССР. А не так как сейчас.
Вся линейка компиляторов от Microsoft содержала баги. Всегда. Народ регулярно их находил. Лет 15 назад народ понял что править эти баги никто не собирается. Никогда. И молча ушел в сторону GCC. Но уже и там не всё благополучно. Новая мода: — Давайте модернизировать С++, каждый год! А почему не два раза в месяц? Дальше только хуже будет. IMHO.
Эффективно уменьшить глубину бинарного дерева ( де факто сделать читабельным громадный блок кода состоящий из условий и циклов) позволит автоматный подход. «Паттерн State» для С++. В случае чистого Си, это основательно забытый «Daff-Device». Современный компилятор, в отличие от компиляторов 90-х, великолепно оптимизирует автоматный подход. Не забываем проверять результирующий ASM с включенной оптимизацией. Сейчас это удобнее всего делать на godbolt.org с флагом для GCC "-O3". С другой стороны, как подсказывает опыт, такие громадные простыни условий создаются не вручную. Это скорее всего результат работы генератора кода. Например Yacc, Бизон, Antlr… И их результирующий код вообще не предназначен для правки «вручную». Скорее всего BNF и скрипт шага прекомпиляции были приложены к проекту, но какой-то «умник» их просто снёс.
А уже какой-то другой «умник» таки попытался править результат генерации вручную.
Я помню, показывал «девочкам» ( бухгалтерским теткам за 40 ) как эффективно использовать арифмометр, не переставляя «собачки». Аспирантам, как «читтить» БЭсму, перфоленты накалывая гвоздём. Как сдвиговый регистр собрать за ночь, на реле. Учил, как память на ру5 спаять без платы, столбиком. А уже на днях, как портировать на «андроид» какой-то OpenGL глючный код на С++, для портфолио которое нужно челу на завтра. Я не произвожу «недоучек», просто это люди, и они просто берут только то что им нужно здесь и сейчас. Последнего «полного» программиста с 4-года обучения я «выпустил» в полёт 8 лет назад. И уже лет 10, как никто за такой подготовкой не обращался. Всё. Теперь и Вы «динозавр». Счастливого вымирания. :)
Java недостаточно быстр. Но именно его инструментарий, а также Python и его инструментарий дают мне статистические данные для «фантастических» прогнозов. Просто хорошо запомните это «предсказание», и считайте годы… до пяти. Я видел времена зарождения этой профессии, и уже вижу её конец. Последний мой студент уже школьник. Уже зарабатывает фрилансом. Вообще без математики или гениальности. Пол года обучения. Python Джанго JSON подробно, HTML, CSS, JS обзорно. Debian, в рамках nginx подкрутить, сервисы и базы настроить, и страшный секрет как из vim выйти. IDE PyCharm + Git. И ВСЁ. Тело ушло лабать.
Верно, группы поддерживающие «свёртывание» это единицы рабочих мест на которые могут претендовать только программисты с уровнем компетентности 100%. И это обеспечит высокая конкуренция уровня 1000 человек на место. Другой полюс этой проблемы, это когда рабочих мест в «группах свёртывания» просто нет. Инструмент произвели «монстры», для которых деньги — ничто, а программирование — всё. Экономический фактор множится на ноль. А уровень допустимой «некомпетентности» рядовых разработчиков упорно движется через уровень студент средних курсов к уровню школьник младших классов. Конец специальности «кодер», как в своё время конец специальности «писарь». :)
Эта статья льёт бальзам на раны современного разработчика? Комплексы эти появляются не в результате лени или глупости разработчиков. Это результат естественного отбора наиболее эффективной рабочей силы. Именно естественного! Предприятия, которые используют ошибочный алгоритм отбора — погибнут. Исчезнут с рынка. Собственно перестанут нанимать работников. И не будут участвовать в эволюции «алгоритма отбора». Самым удачным «алгоритмом отбора» будет тот, который способствует превращению «замысел заказчика» в «товар» за кратчайшие сроки. Современный «алгоритмом отбора» отбрасывает как академиков, семи пядей во лбу, так и монстров с 30-летним опытом. А пропускает только сообразительных детей. Ребенок легко адаптируется в группе, легко обучаем, без гонора и особых финансовых запросов. А знания не нужны? — Нет, не нужны. API фреймворка, и не более того. Инструментирование процесса разработки порождает всё менее компетентного разработчика. Обыкновенная свертка:
— Компиляторы ASM снизили до единиц множество рабочих мест для знатоков машинного кода.
— Компиляторы уровня Pascal и С свернули рабочие места знатоков ASM.
— Компиляторы c поддержкой OOP С++, Delphi свернули рабочие места требующие знаний эффективных алгоритмов, баз банных, и процедурных переменных.
— Библиотеки уровня C++ STL и BOOST делают эффективным даже «кодера без образования».
Не за горой момент, когда заказчик сам сможет обратить «свой замысел» в «товар». И всё. Рабочих мест для кодеров не станет. Заранее изучайте фотошоп, дизайн, 3D-моделирование. И ипотеку брать не советую.
1

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность