1. C++ / Говнокод #8025

    +150

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    Люди, помогите решить такой вопрос. Приведу пример: 
       Есть программист Петя. Он прочитал очень много книг по программированию,
    и вообще умный парень :). И, так как, Петя прочитал много умных книг (Александреску к примеру),
    он соответственно пишет умный код, используя различные фишки с++, например,
    очень любит шаблоны (такие вещи типа статического полиморфизма и еще много
    всего связанного с шаблонами и обобщенным программированием) или использует
    сложные тернарные операторы… ну и т.д. … Соответственно код работает и все хорошо. 
    Как-то в разговоре с Петей ему сказали, что если так прогать, то может получиться
    непрозрачный код. 
      На что он ответил: «Если алгоритм написан верно, и Каму-то непонятен код, то
    проблема в том что человек просто плохо образован в плане программирования.
    Ибо кто-то, например, не знает что такое классы и ему будет не прозрачен код,
    в котором используют классы или обычное наследование. И соответственно не
    писать же все процедурно, из-за того, что кто-то не знает что такое классы.
    А само понятие прозрачности кода - ерунда ».
       От сюда вопрос, Прав ли Петя и что такое вообще «Прозрачность кода»?
    Или действительно код не может быть  написан «Заумно», а тот, кто так
    считает, просто плохо знает стандарт языка.

    Вопрос совершенно серьёзный. //Не холивар.

    Запостил: CPPGovno, 29 Сентября 2011

    Комментарии (248) RSS

    • /*я когда первый раз увидел книгу на полке, не стал её покупать
      в самом деле, ну что можно сказать нового о паттернах после GoF?
      я это всё знаю сказал я себе и машинально поставил книгу обратно на полку

      потом спустя какое-то время до меня начали доходить отголоски и мнения касательно этой книги, что это действительно новое слово в программировании

      ну новое так новое, надо бы ознакомиться
      книга была куплена, вдохновенные предисловия прочитаны одним махом и...
      дальше я встрял на первой же главе, обилие "жёстких" шаблонов в тексте напомнило мне о студенческих временах, когда мне приходилось делать вид, что я понимаю разнообразные закорючки в учебниках по матану

      неприятие было ровно такое же
      какие-то абстрактные заумные закорючки

      поэтому дальше я просто заставил себя всё это прочитать...
      но без практики (вернее без сопряжения с ней, тогда на работе хреначил какой-то очередной ударный ОО код) увы, чтение это оказалось бесполезным и всё быстренько повыветрилось

      мол прикольно, но непонятно как это использовать, где это использовать и главное, зачем это использовать?

      но некоторые идеи мне показались прикольными
      особенно в части разумной альтернативы ОО подходу, с ортогональными стратегиями и всеобщей идеологией переноса всего что только можно на стадию компиляции

      на работе я пытался "ошаблонить" некоторые текущие задачки, но получалось как-то громозко неклюже, и главное совсем не к месту, код прекрасно смотрелся и работал без этого
      Ответить
      • Для тех, кто ещё не знает: Петю уже уволили. :(
        Ответить
        • а мы так и не увидели его божественный код...
          Ответить
        • Отсюда мораль: дружить с говном чревато
          Ответить
        • Жалко. Но код всё-таки посмотреть стоит.
          Хотя, боюсь, обрывков в гк-форме не хватит, чтобы оценить его как следует.
          Ответить
        • Выложи исходники Пети на файлошару и кинь сюда сылочку. Ок?
          Ответить
      • петя прав. необразованых недокодеров на самом деле как "говна" на сем сервисе.
        Ответить
        • Как-то мне непонятна фраза. По-моему недокодер и есть необразованный программист. Поправьте если ошибаюсь.
          Ответить
    • параллельно я опять читал Александреску чтобы понять что я делаю не так

      так продолжалось до тех пор, пока я не перешёл в контору, где лид-архитект работал в парадигме GP
      признаться я и раньше заглядывал в исходники STL и boost и обилие шаблонов всегда вымораживало
      какие-то вещи казались просто магией, например пустые шаблоны, содержащие в себе лишь typedef
      если такую пустую конструкцию убрать,
      то компилятор начинал выдавать километры невнятных сообщений

      а тут я увидел прямо в коде игрового сервера феерический веер шаблонов
      отступать было некуда
      пришлось сесть и разбираться
      и тут я увидел на практике КАК это работает

      первую же мою задачу я старался выдержать в духе увиденного, параллельно сверяясь с Александреску, я честно нахреначил две стратегии, одна из которых так потом и не пригодилась, и постарался написать код, просто визуально похожий, лаконичный, с кучей угловых скобочек и двойных двоеточий, благо что исходными "кубиками" послужил boost где такого добра навалом

      дальше больше и вуаля, я взял барьер непонимания обобщённого программирования, и это РАБОТАЛО

      сейчас честно скажу, я разумно-осознанно (а не механически как раньше) дочитал Александреску лишь до конца третьей главы
      и этого вполне достаточно:
      списки типов
      шаблонные шаблонные параметры шаблонов которые есть только в С++
      и два генератора GenScatterHierarchy и GenLinearHierarchy

      с этим нехитрым набором (+ ассерты, в т.ч. статические) можно и впрямь перекладывать львиную долю работы на компилятор : ))*/
      Ответить
    • показать все, что скрытоЯ считаю, что Петя - хуй.
      Крестошаблоны не предназначались для подобных фишечек, поэтому подобное их использование выглядит как говно.
      Ответить
      • >Крестошаблоны не предназначались для подобных фишечек
        Если шаблоны С++ для этого не предназначены, то для чего они предназначены?
        Какую вы бы посоветовали замену?
        Ответить
        • Минусаторы думают, что я троллю, а вот хуй.
          Шаблоны в качестве генериков - это нормальное применение.
          Частичная специализация - это уже фишка хитрее, её надо использовать только по жёсткой необходимости.
          Рекурсивность - вообще не знаю, нафига.

          А всякие там факториалы на шаблонах - это уже изъёбы мозга. Просто случайно вышло, что на шаблонах можно и так, если постараться. Только делать так не надо.

          В качестве замены я бы посоветовал другие языки, содержащие эти навороты в более читаемом виде.
          Ответить
          • минусаторы не думают, а минусют. это раз

            во вторых, ты я вижу против compile-time вычислений и compile-time полиморфизма. да?
            Ответить
            • Я за вычисления при компиляции, написанные на том же языке, что и вычисления периода выполнения. Иначе - дублирование кода.
              Ответить
              • Я за автоматическое определение необходимости и достаточности вычислений во время компиляции для фрагментов кода.
                Ответить
              • Forth — наше всё!
                Ответить
                • Форт мне не понравился, если честно. Но в нём, если что-то надо перенести на этап компиляции, это надо указать руками. Было бы лучше, если бы это сделал компилятор (да, +1 к посту от СКрестКрестГовно выше), кроме специфичных случаев, когда надо считать инфу с сайта - тут компилятор сам не догадается, делать это при старте или при компиляции.
                  Ответить
              • constexpr в помощь

                про compile-time полиморфизм что-нибудь скажете?
                Ответить
                • constexpr пока слишком ограничен, но движение в правильную сторону. Надо ещё, чтобы компилятор без явных указаний программисту догадывался, что это число можно вычислить при компиляции.
                  Вместо полиморфизма периода компиляции предлагаю тупой код на условных операторах и компилятор, умеющий откидывать ненужные ветки.
                  Ответить
                  • >Вместо полиморфизма периода компиляции предлагаю >тупой код на условных операторах и компилятор, >умеющий откидывать ненужные ветки.
                    пример кода?
                    Ответить
                    • Давай так: ты мне - пример крестокода со статическим полиморфизмом, я тебе - его же, но так, как это вижу я.
                      Ответить
                      • Govnoeb наверное это имел ввиду:
                        http://www.insidecpp.ru/patterns/curiously_recurring_template_pattern/
                        Ответить
                        • Я вижу там вызов функции по указателю, внутри которой уже таки вызывается статически полиморфная функция. Можно пример, в которым нет обмена шила на мыло?
                          Ответить
                          • Попытка воссоздать статический полиморфизм здесь:
                            http://govnokod.ru/8040
                            Ответить
                      • Ну и случай крайне статического полиморфизма (детский сад, конечно, по сравнению с первым вариантом):
                        struct Strategy1
                        {
                        static void do(){printf("Lol1");}
                        };
                        struct Strategy2
                        {
                        static void do(){printf("Lol2");}
                        };
                        template<class Strategy>
                        class MegaClass
                        {public:
                        void do()
                        {
                          printf("Mega");
                          Strategy::do();//Класс Strategy можно было и создать для хранения состояния.
                          printf("/n\");
                        }
                        };
                        //...
                        
                        Дальше в разных частях кода создаем:
                        MegaClass<Strategy1> o;
                        o.do();
                        //...
                        MegaClass<Strategy2> o;
                        o.do();
                        "Один" класс ведёт себя по разному. Понятно, что это не совсем полиморфизм. Но очень часто именно в таком контексте используют динамический полиморфизм, хотя такого статического здесь достаточно выше крыши.
                        Плюсы этого подхода :
                        1)Создаётся объект в стеке, значит быстро, а не в куче. Хотя можно и не в стеке.
                        2)Используется шаблон, значит компиль будет инлайнить.

                        Минус:
                        1)Если понадобится резкой перейти от статического полиморфизма к динамическому - придётся переписывать на виртуальные функции или на истинный статический полиморфизм.
                        Ответить
                        • Примерно так:
                          void do ()
                          {
                          printf("Mega");
                          if type(this) = Strategy1 then {Strategy1.do} else {Strategy2.do};
                          }
                          лишние ветвления на сравнении типа с чем-то должны быть обрублены компилятором, если тип известен. Если нет - то при выполнении.
                          Ответить
                          • Добавить бы ещё switch-case по типам...
                            Мне нравится идея, но нужно как то не так.

                            А если пользователь передаст стратегию Strategy3, то вызовется лишь Strategy2.

                            То что вы сделали - это специализация шаблонов, но при этом не осталось самого шаблона.
                            То есть в вашем коде нельзя добавить новую стратегию, не изменив "полиморфный" класс.
                            Это чревато такими ошибками. А именно ошибками забыть добавить новую стратегию Strategy3 во все методы класса MegaClass (или хотя бы во все методы класса MegaClass добавили, а в один забыли добавить).

                            Да и как-то многословно пока... Вам нужно как-то это исправить.
                            Ответить
                            • В общем, я ещё подумал, и вот что.
                              Короче, опять приходим к виртуальным функциям, только с требованием для каждого наследника создавать свой экземпляр функции родителя, в которой вместо указательного вызова сидит простой.

                              А многословность вообще не проблема.
                              Ответить
                              • >Короче, опять приходим к виртуальным функциям
                                Как видно, без лишних слов в С++ получаем статический "полиморфизм" без виртуальных функций, не тратя время на вызов по указателю. Вам всегда же не нравились вызовы по указателю... Даже помню по этому вопросу целую тему на 100+ комментов.
                                Ответить
                                • Виртаульная функция БЕЗ вызова по указателю, что не так?
                                  В С++ же мы видим лишние слова и лишние угловые скобочки.
                                  Ответить
                                  • А вы пейсатель-фантаст?
                                    Функции уже не будут виртуальными без вызова по указателю. Ваш, КО.
                                    Ответить
                                    • >Функции уже не будут виртуальными без вызова по указателю
                                      Можно вызывать по ссылке
                                      Ответить
                                      • Вызов по ссылке - это и есть вызов по указателю внутри. Тем более мы говорим про вызов виртуальных функций, кои есть на самом деле указатели на функции внутри.
                                        Ответить
                                        • Так вот, виртуальные функции можно реализовать без указателей. Если тип экземпляра точно известен при компиляции, то вместо общего Do (внутри которого вызов по указателю Method) можно вызввать специальный Child_n::Do, внутри которого сразу вызывается Child_n::Method.
                                          Ответить
                      • лови. кинь мне его как видишь ты. и еще просьба сделать строку без учета регистра с помощью твоего кода

                        template<typename _type_, template<typename> class _traits_>
                        class _string_t {
                        public:
                        typedef _type_ value_type;
                        typedef _traits_<value_type> traits;

                        typedef _type_ * iterator;
                        typedef const _type_ * const_iterator;

                        public:
                        iterator begin() { return nullptr; }
                        const_iterator begin() const { return nullptr; }

                        iterator end() { return nullptr; }
                        const_iterator end() const { return nullptr; }

                        /* ... */
                        };

                        template<typename _type_>
                        struct string_traits {
                        /* .... */
                        static bool less(const _type_ &lt, const _type_ &rt) { return lt < rt; }
                        static bool equal(const _type_ &lt, const _type_ &rt) { return lt == rt; }
                        };

                        template<typename _type_, template<typename> class _traits_>
                        inline bool operator<(const _string_t<_type_, _traits_> &ls, const _string_t<_type_, _traits_> &rs)
                        {
                        typedef _string_t<_type_, _traits_> string_t;
                        typedef typename string_t::traits traits;

                        /* if lengths do not equal, ret immediately */
                        const bool equal_length = std::distance(ls.begin(), ls.end()) == std::distance(rs.begin(), rs.end());
                        if(!equal_length)
                        return std::distance(ls.begin(), ls.end()) < std::distance(rs.begin(), rs.end());

                        string_t::const_iterator ls_it = ls.begin();
                        string_t::const_iterator rs_it = rs.begin();

                        /* lengths of strings are equal -> no need to check for 'rs_begin != rs.end()' */
                        while(ls_it != ls.end() && traits::equal(*ls_it, *rs_begin))
                        ++ls_it, ++rs_it;

                        return (ls_it != ls.end())? traits::less(*ls_it, *rs_it): false;
                        }
                        Ответить
                        • Я вижу, что тут для строк по другому работает оператор "<".

                          func "<"(l,r: _type_): boolean
                          {
                          if _type_ = _string_t<_type_,_traits_> then
                          {
                          ну ты понел
                          } else {
                          return Standard."<"(l,r);
                          };
                          }
                          }
                          В такой код, правда, будет трудно добавить ещё частный случай. Тогда - вирт.функции. Которые раскрываются через перегрузку без указателей.
                          Ответить
                          • Я вижу, что тут для строк по другому работает оператор "<".
                            это не есть главное. главное - что отделена логика от данных

                            В такой код, правда, будет трудно добавить ещё частный случай. Тогда - вирт.функции. Которые раскрываются через перегрузку без указателей.
                            паттерн визитор чтоле? впрочем там все-равно один вирт. вызов будет полюбому
                            Ответить
                            • еще один пример отделения логики от данных:
                              class _point_base {
                              public:
                              typedef int value_type;
                              public:
                                enum { INVALID, VALID, REAL };
                              public:
                              explicit  _point_base(value_type x_, value_type y_)
                              {
                              m_x = x_; m_y = y_;
                              }
                              const value_type x() const { return m_x; }
                              const value_type y() const { return m_y; }
                              private:
                              value_type m_x;
                              value_type m_y;
                              };
                              
                              template<size_t>
                              struct _point_traits;
                              
                              template<>
                              struct _point_traits<_point_base::INVALID> {
                              static bool valid(const _point_base &) { return true; }
                              };
                              ...
                              template<typename _traits_>
                              class _point: public _point_base {
                              explicit _point(const _point_base &base): _point_base(base)
                              {
                              assert(_traits_::valid(*this));
                              }
                              };
                              Ответить
                  • Не так-то просто догадаться, особенно, если используются циклы или рекурсия. Пытаться вычислить всё, не имеющее внешних зависимостей — компилятор легко может загрузнуть в многочасовой задаче, для решения которой и писали программу. Сейчас польза от constexpr та, что компилятор либо гарантирует вычисление при компиляции (что необходимо для некоторых применений), либо сразу откажется это делать, укажет на ошибку.

                    Тупой код на условных операторах невозможен из-за несовместимости типов и требования эффективности.
                    Ответить
                    • > Пытаться вычислить всё, не имеющее внешних зависимостей — компилятор легко может загрузнуть в многочасовой задаче, для решения которой и писали программу.

                      Ну и пусть повиснет. Результат будет получен за то же время. Ну и понятно, эта фича должна быть отрубаемой.
                      Ответить
                      • Не за то же. Компилятор будет вычислять медленнее, ему ведь нужно и ошибки отслеживать, чтобы внятно ругнуться, и больше данных учитывать.

                        Кроме того, есть такая штука, как кросскомпиляция.
                        Ответить
                        • Ладно, согласен. Для очень тяжёлых функций надо ввести возможность отрубать предвычисление.
                          Ну и надо ещё, чтобы при компиляции в окошечке отображалось что-то типа "вычисление значения f(2, 5)..."
                          Ответить
                          • Ну если компилятор будет миллион вычислений не очень тяжёлых функций отображать в окошечке, то вычислять будет ещё дольше.
                            Ответить
                            • Ну хорошо, чтобы была кнопочка "прервать", а после её нажатия говорилось, что именно делает сейчас компилятор.
                              Ответить
                              • Когда я нажимаю кнопку прервать компиляцию, то прекрасно вижу какой файл сейчас собирает компилятор и с какими ошибками. Не нужно придумывать ненужный велосипед.
                                Ответить
                                • Ну так видишь, всё есть, оказывается, и нефиг про короаны и джа года петросянить.
                                  Ответить
                                  • Что за короаны? По моему петросяню тут не я...
                                    Ответить
                              • Запускать компилятор под дебаггером?
                                Ответить
                          • и корованы обязательно
                            Ответить
                          • я джва года уже жду такой компилятор
                            Ответить
                  • > предлагаю тупой код
                    тупой кодер == тупой код. параллель не находите?
                    Ответить
                    • Иногда код должен быть тупым, в силу того, что другим он быть не может.
                      Независимо от кодера.
                      Ответить
                      • о подобных ситуациях говорить не принято.
                        Ответить
                      • первое что вспомнил - два банальных примера.
                        1:
                        bool some_pred(int l, int r) {
                           if (l < r)
                              return true;
                           return false;
                        }

                        что можно сказать о кодере написавшем такое?

                        2:
                        #include <cmath>
                        #include <cstddef>
                        
                        // где-то задекларина константа
                        const size_t const_val = 33;
                        
                        // использование в конструкторе объекта, коих огромное множество
                        struct type {
                           type()
                              :_val(sqrt(const_val))
                           {}
                        private:
                           const double _val;
                        };
                        
                        int main() {
                           type t;
                        }

                        http://liveworkspace.org/code/e2367a190546ec68012040bff9289c8f
                        ну или такое?
                        Ответить
                        • > задекларина
                          Ответить
                        • Вы путаете тупой код с идиотским. Лично я под "тупым" кодом понимаю банальщину, реализованную прямым очевидным образом. Т.е. без излишеств. Может быть вы вкладываете в это понятие что-то другое, я не знаю.
                          Ответить
                          • с той же уверенностью, могу сказать тоже самое, только наоборот.
                            Ответить
                    • Неа, тока нормаль.
                      Ответить
                    • Смотрите, а вот и сам Петя посетил эту ветку!!!
                      Ответить
                    • Хм, может и правда петя? о_О
                      Ты все-таки зарегался на говнокоде?
                      Ответить
              • >>Я за вычисления при компиляции, написанные на том же языке, что и вычисления периода выполнения

                Это был нахрюк на шаблоны сейчас, да?
                Ответить
            • Компайл тайм петух прокукарекал, заместо авроры!
              Ответить
          • Факториалы на шаблонах в реальных проектах не используются. А рекурсия… ну что поделаешь, если по другому нельзя (хотя, чаще всего, и не надо).
            Ответить
          • Бутейко, ты?
            Ответить
          • то что выше - о тебе. в тему.
            Ответить
      • дело-то не в самих шаблонах. заумно можно написать в любом языке.
        Ответить
        • Я и говорю - не надо использовать что-либо заумно.
          Ответить
    • самопиар чтолэ? я прочитал Александреску; я молодец

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

      Если алгоритм написан верно, и Каму-то непонятен код, то
      проблема в том что человек просто плохо образован в плане программирования.

      неверно конечно. нарушается принцип КИСС, да и тех, кто будет твой гениальный код поддерживать надо тоже думать, хоть иногда

      далее, тебя взяли в контору, где цэпэпэ с шаблонами, но с шаблонами, как я понял, ты до этого работал мало. лол или хуита?
      Ответить
    • > использует сложные тернарные операторы

      Тернарные операторы очень сложные, ага.

      Однозначно сказать мудак ли Петя - невозможно. Выкладывай говнокоды Пети и мы посмотрим уже.
      Ответить
      • Я не хочу обижать друга, обзывая его код говнокодами. Тем более, возможно, это коммерческая тайна.
        Ответить
        • Насколько я понял, у вас есть разногласия в том, как писать код. Ну так заключите пари - вы выкладываете его "говнокод" и если его сообщество плюсует, он вам должен 1000, если минусует или 0, вы - ему. Так никого не придется обзывать.
          Если "говнокод" Пети - "коммерческая тайна", вопросов нет.
          Ответить
      • Ну выложит он зубодробильный код с тучей шаблонов. Хочется выноса мозга?
        Ответить
        • А так чего хорошего?
          Ответить
          • Тема, безусловно, интересна сама по себе. Интересно почитать, что об этом думают люди.
            Ответить
            • Уж всяко место ей не здесь. Как и сотням других, не менее интересных, тем.
              Ответить
    • Итак, уважаемые эксперты, имеем:
      1) Некий абстрактный Петя-программист паттерно-Андреску-осилятор, с приподнятым ЧСВ, пишет некий абстрактный код;
      2) Некий приёмщик кода, предъявивший Пете по хреноватой читабельности абстрактного кода оного;
      3) Используя некую абстрактную методологию оценки абстрактного кода, нужно получить очень даже конкретный ответ: Петя - мудаг, пишет так, что хер сам потом поймёт не без пол-литры крепкого чая или ниосилятору приёмщику кода нужно бы сходить на ... повышение ЧСВ - квалификации?

      Тщательно изучив все исходные данные, получаем закономерный ответ на это всё:
      ГДЕ КОД ПЕТИ, БЛЕАТЬ!?
      Ответить
    • Если что - Петя мой друг.
      Ответить
      • как говорится "Платон мне друг, но истина дороже"
        Ответить
      • Ты сделал его знаменитым.
        Ответить
      • это не страшно. гораздо хуже, если ты и есть Петя
        Ответить
        • точно! бывает так: стесняешься от себя спросить и придумываешь какого-то абстрактного друга Петю ...
          Ответить
        • "У одной моей подруги с её парнем..."
          Ответить
    • Где здесь код, CPPGovno?
      Ответить
    • Я согласен с теми, кто заявляет что без примеров кода решить кто Д`Артаньян, а кто Констанция Буонасье не представляется возможным.
      Ответить
    • И всё же не стоит забывать, что :
      1. Архитектура приложения должна быть подробно и качественно задокуметирована.
      2. code conventions - псалтырь кодера в составе команды.
      3. Не документируешь !качественно! свой код - пидарас по-умолчанию.

      Если хотя бы эти требования выполняются - Петя может писать как ему угодно и всё будет всем понятно.
      ИМХО.
      Ответить
    • Плохой программист реализует простые вещи умным кодом. Хороший программист делает умные вещи простым кодом.
      Ответить
      • Всё равно есть проблема разницы восприятия. То, что тебе сейчас кажется простым и очевидным через 2 года ты будешь считать многословным школокодом. Я думаю, что если применение мощного подхода позволяет сократить размер исходника в 5-10 раз, но требует больше пунктов мозгосилы для осмысления - оно того стоит. Тут каждый решает сам. Всегда есть некий компромисс.
        Ответить
        • Та сложность, о которой вы говорите, упирается в две составляющие. Либо сложный "для первого взгляда" алгоритм - это решается поясняющими комментариями, либо сложные языковые особенности, освоение которых достигается чтением мана.

          Простота кода во многом зависит от его оформления, отсутствия "велосипедов", человеческого именования.

          Иными словами, простой код - это форма, а не содержание.
          Ответить
          • Под мощными подходами я подразумеваю функциональщину и всякий матан в стиле Александреску. Исходники на Haskell или Lisp могут вызвать когнитивный диссонанс у неокрепших умов, но выигрыш может оправдывать необходимость вникать в код.
            Я тоже верю в то, что любую задачу можно повернуть так, что её решение будет выглядеть просто. Однако сделать это не всегда получается. :(
            Ответить
        • Всегда есть некий компромисс. насяльника, который по очевидным причинам знает лучше
          Ответить
    • Если Петю выпрут с работы, то мне не стыдно будет выложить его код в эту тему.
      Ответить
      • ты только что лишил Петю работы.
        Ответить
      • Петя уже будет не друг?
        Ответить
        • Я показал ему эту тему, но он презрительно хмыкул.
          Жду конца споров тимлида VS Петя с пачкой попкорна.
          Ответить
          • Ололо! Петя презирает ГК! да он же ИЛИТАРИЙ
            P. S.
            Передай привет Петюне.
            Ответить
            • Он сказал, что на Говнокоде сидит только быдло, такое же как ты. И пишет такой же код, как и ты. А потом вы его выкладываете и дрочите на него.
              Ответить
              • Он прав по всем пунктам.
                Я даже согласен с его переходом на личности и оскорбления. Мы все здесь это заслужили.
                Ответить
              • странно, у Александеску нет книги по повышению ЧСВ

                страшно даже подумать, что случится с Петей если он таки освоит "Современное проектирование на цэпэпэ" до конца
                Ответить
              • "Скажи мне кто твой друг,..."
                Ответить
              • Всё, у меня теперь депрессия, пойду топиться в ванне!
                А Пете передай путевку в пешее эротическое путешествие.
                Ответить
              • > на Говнокоде сидит только быдло

                Это он сказал, зная что вы тут сидите?
                Ответить
                • >он сказал, зная что вы тут сидите?
                  Да, он всегда рубит правду матку несмотря ни на что.
                  Ответить
      • показать все, что скрытоvanished
        Ответить
    • В целом я согласен с вами господа. Петя - быдло и так делать нельзя. Крестошаблоны не на что не годны. А генерация кода на них - половое извращение. Пора бы его попросить с вещами и свой феерический код пусть забирает. Тема закрыта.
      Ответить
    • Петя посрался со всеми в отделе. Назвал всех быдлом. Язык его - враг его. Его судьба предрешена.
      АА <Андрей Александреску> - root of all evil.
      Похоже теперь почитатель и последователь Андрейки последует за своим учителем и гуру в затворнические кельи писать на D.
      Он сказал, что уедет покорять Москву.
      Ответить
    • вопрос 1 Пете: он так и хочет сидеть над этим кодом и не изобретать ничего нового? это будет практически неизбежно, т.к. передать кому-то менее квалифицированному данный код будет затруднительно.
      вопрос 2 его начальству: в проекте появляется узкое место в виде "ресурса" Пети. Он может уйти в отпуск, заболеть, решать другие задачи, уволиться, умереть (не дай бог). что будет с проектом?
      Как работодатель, я бы либо вообще не связывался бы с Петей, либо дал ему не жизненно важную, но сложную автономную задачу, тем самым зарезав ему возможность какого-либо роста. А с таким подходом к коллегам ему это не грозит в любом случае.
      Ответить
      • отвечу вместо пети на 1 вопрос: вот вы как начальник хотите работать с грамотными ребятами или с кучей нубов? петя научится и пойдет дальше, если он не оставит последователей, значит петя сильно у вас засиделся и перерос общий уровень фирмы, и то что его некем подменить это вовсе не петина проблема.
        у начальства 2 выхода, либо уволить петю и не мешать ему в росте, либо подсадить пете кучу нубов, которые за год-два станут кучей петь, и будут приносить больше профита и учить нубов.
        чего-то мне кажется что второй случай более приемлимый для начальства ибо всеобщая деградация просто невыгодна, особенно в условиях постоянного роста зарплат.
        Ответить
    • Вывод:
      Петя - илитарий с ЧСВ > 9000. Даже при его (Пети) больших знаниях и умениях полезность его (Пети) работы для компании не выше, а то и ниже чем у пары-тройки быдлокодеров.
      Ответить
      • >при его (Пети)
        а я уж было подумал про ЧСВ речь
        Ответить
      • > при его

        Вот и весь ответ
        Ответить
        • точно весь? я даже не поленился, выделил твой коммент - но увы, ничего больше не обнаружил )
          Ответить
    • Каков здесь бамп-лимит?
      Ответить
    • показать все, что скрытоГде здесь куча, CPPGovno?!
      Ответить
    • Понятно, что Петя изгой общества. Тут без вопросов.
      Но вот если совершенно серьёзно рассудить, то стоит ли пользоватся всеми этими веерами шаблонов хотя бы для редкого узкого круга задач?
      Я лично читаю код Александреску в легкую. Использовать могу все, кроме GenScatterHierarchy и GenLinearHierarchy. Применять их умею, но просто не знаю где и когда их правильно применять пока...
      Стоит ли использовать знания, полученнные из книги Андрейки, или лучше их забыть раз и на всегда, а то рискуешь, что тебя просто погонят с работы?
      Ответить
    • Петушиные бои, блин...
      Ответить
    • Вас развели как лохов:
      http://www.gamedev.ru/code/forum/?id=120475
      //Не холивар. XD
      Ответить
      • Гумно Семеныч.
        Ответить
      • >>я считаю, что если конструкция как минимум компилируется, то всё отлично
        ахахахахаххаха
        Ответить
    • Странно, что про Компренду, Царя и чувака, который настолько сфейлил, что это был вин, старая гвардия помнит, а про Петю нет. Интересно было поковырять культурный слой
      Ответить
    • Висёлый тред. И поржать есть, и почетать интересьненкого.
      Ответить
    • Петя просто типичный мид. Джуниор пишет весь код в одной функции, ему важно чтобы хоть что-то работало.
      Миду уже скучно так писать, и потому он с помощью шаблонов и паттернов создает абстрактные фабрики стратегий которые способны решить любую задачу в три строки. Мид рад, что он не пишет бойлерплейт.

      Потом оказывается что гибкость нужна совсем в другом месте и бенефита от нее нет, зато для того, чтобы поменять алгоритм подсчета очков нужно освоить 4 API, каждый из которых состоит из семи интерфейсов и шести классов, документированных на три страницы каждый.

      Сеньйор обычно понимает что гибкость это хорошо, но она не дается бесплатно (написать без багов умный код во много раз сложнее, чем написать глупый код, а писать-то хочется без багов) и если у тебя нет уверенности что твоим чудо-фреймвокром будет пользоваться 150 человек, то может быть проще написать 10 строчек по-ковбойски.
      Собссно, отсюда и растут все наши питонии.

      Так что Петя не виноват, он просто недостаточно еще говна поел
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий