1. Python / Говнокод #26356

    +2

    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
    #  Пример #1
    class FastClass:
    
        def do_stuff(self):
            temp = self.value  # это ускорит цикл
            for i in range(10000):
                ...  # Выполняем тут некие операции с `temp`
    
    #  Пример #2
    import random
    
    def fast_function():
        r = random.random
        for i in range(10000):
            print(r())  # здесь вызов `r()` быстрее, чем был бы вызов random.random()

    Забавно, что в статье под названием «Разработка чрезвычайно быстрых программ на Python» (https://habr.com/ru/company/ruvds/blog/483678) этот самый «Python» оказался обосран (ненамеренно) куда качественнее, чем в недавно обсуждённом высере (https://govnokod.ru/26050#comment517858).

    Неужели конпелятор/интерпретатор «Питона» настолько туп, что не может самостоятельно провести вот эти вот микрооптимизации?

    Запостил: gost, 16 Января 2020

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

    • Именно поэтому я за «C++».
      Ответить
    • def myrandom_init(seed): ...
      def myrandom(): return ...
      def myrandom0(): myrandom_init(1234); random.random = myrandom; return myrandom()
      random.random = myrandom0
      # Микрооптимизируй, пробуй
      fast_function()
      Ответить
    • А в чём конкретно обосран?
      И, даже если и обосран, то не сам Питон, а его существующие интерпретаторы. С другой стороны, если интерпретатор будет ещё делать всякие lookahead'ы и дофига оптимизаций, то не просрёт ли он столько же, сколько найдёт? Всё же у него принцип работы ad hoc, да и питонячье "явное лучше неявного" никто не отменял.

      Актуально сравнить с творением сумрачного японского гения, конечно.
      Ответить
      • Они не сделали интерпретируемый или портабельный язык.

        Они просто сделали говно на котором писать нельзя.

        И в этом и заключается фокус.

        Но далее говнопитух нам экспортирует сишные api на которых мы уже и пытаемся что-то сваять.

        Очевидно, что сваять ничего нельзя - поэтому отовсюду торчат сишные вызовы.

        Они вроде пытались запилить llvm как базу для скриптухи и прочего говна, но не фортануло.

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

          Кстати, видел оптимизатор байткода в расширении «xcache», кэширующем опкоды «PHP». Правда, оптимизатором его можно назвать с натяжкой. Он оптимизирует только совсем уж очевидную питушню.
          Ответить
      • Ну тупые оптимизации вроде вычислений константных выражений он таки умеет.
        Ответить
        • Лол:
          https://ideone.com/STWL1h

          Именно поэтому я за "Python3".
          Ответить
          • Оптимизатор работает ровно на один шаг?

            2*3 догадался посчитать, а дальше всё оставил.
            Ответить
            • http://govnokod.ru/23832

              Царская сишка опять слила анскильных скриптухов в хламину.

              А питух-недоязычок может только так.

              Очевидно, тут мы замечаем то, что дизайн этого говна бездарного - типичная скриптуха.

              Потому обезьяны начнут прикручивать к этому говну jit и прочее.

              Но, очевидно, что в нормальном языке вычислений константных выражений быть должна.
              Ответить
      • да, это называется компилятор, который компилирует в байткод
        умеет там констант фолдинг и вот это всё (хотя в питоне хуй знает, умеет ли)
        Ответить
    • Так тут дело в реализации, их же тысячи. Сходу вспомнаются: CPython, Jython, IronPython, PyPy.

      Последний вроде как JIT-компилятор.
      Ответить
      • > Jython, IronPython
        Мёртове говно.
        Ответить
        • Сорян, я в сортах питух-говна не разбираюсь.
          Ответить
        • А зачем тогда постоянно выпускать новые версии питуха?
          Ответить
          • ну, ирон особо и не выпускает
            а джутон выпускает, но он нахуй не нужен, пушо 2.7 никому не нужен

            как бы ты отнесся к компилятору который умеет c++ 2003?
            Ответить
            • $ python
              >Python 2.7.15+ (default, Nov 27 2018, 23:36:35)

              >а джутон выпускает, но он нахуй не нужен, пушо 2.7 никому не нужен
              Так питух никому не нужен. Обычная нетипизированная скриптуха, коих тысячи.

              Сейчас практически любой компилируемый язык похож на скриптуху: кругом varы, везде автовывод типов.
              Хочешь выводишь слева-направо, хочешь справа-налево. Типы явно не пишешь, а они есть.

              Выразительность та же, но благодаря компиляции скорость на порядок выше, а ошибок на порядок меньше.
              Даже последних итерациях крестов идиоматичный код всё более становится похож на скриптушачий.
              Если бы не их упоротые значки, разницу почти не заметно.
              Ответить
              • Питуха можно использовать вместо математического пакета, когда на скорую руку нужно что-то посчитать. В нём из коробки большие числа.
                Ответить
                • >Питуха можно использовать вместо математического пакета, когда на скорую руку нужно что-то посчитать. В нём из коробки большие числа.

                  Об использовании питуха в роли питулятора на ГК сообщал ещё bugmenot.

                  >когда на скорую руку нужно что-то посчитать.

                  js web console. Всегда под рукой.

                  >из коробки большие числа
                  ghci
                  Я кстати наконец-то обнаружил практическое применение хацкелю. Калькулятор.
                  Ответить
                  • Я тоже юзал хаски как калькулятор, потом перешел на питон.
                    Ответить
                    • >тоже юзал хаски как калькулятор, потом перешел на питон
                      Зачем? Зачем?
                      Какие-то подводные камни?
                      Ответить
              • почитай пжлст ссылк
                https://www.python.org/doc/sunset-python-2/

                We have decided that January 1, 2020, was the day that we sunset Python 2.

                python должен быть python2 во всех ОС, выпущенных до 2020 по причине соответствующего PEP.

                В целом я согласен, что от отсутствия статической типизации проблем больше, чем бенефитов.
                Ответить
                • > выпущенных до 2020

                  Я бы на их месте навсегда оставил python ссылкой на python2. Ну или заглушкой, которая говорит что питон 2 отошёл на тот свет и пора обновлять скрипты. Или вообще ёбнул бы.


                  Ибо рандомные баги от запуска древних скриптов через движок третьего питона - это не особо весело.
                  Ответить
                  • print ('Bmopou_nemyx' if 10 / 3 == 3 else 'Tpemuu_nemyx')
                    Ответить
                    • assert(1/2 > 0) # py3
                      Ответить
                      • А есть полный список хаков для определения версии интерпретатора (по фичам, а не по значению, возвращаемому пакетом «sys»)?
                        Ответить
                      • Придумал ещё один хак:
                        try:
                            reduce(lambda x: x, [], 0)
                        except NameError:
                            print('Tpemuu_nemyx')
                        Ответить
                        • Так будет красивее:
                          v = 2
                          try:
                              reduce(lambda x: x, [], 0)
                          except NameError:
                              v = v + 1
                          print (v)


                          https://ideone.com/dSEfIW
                          https://ideone.com/35wEwC
                          https://ideone.com/eJpuID
                          https://ideone.com/9p9o5S
                          Ответить
                        • запахло хаками для определения IE6
                          Ответить
                          • v = 2
                            try:
                                1 < ''
                            except TypeError:
                                v = v + 1
                            print(v)


                            https://ideone.com/w0GuWA
                            https://ideone.com/EqQc3Z
                            Ответить
                            • v = 2
                              try:
                                  v++
                              except SyntaxError:
                                  v = 2

                              [/color]
                              Ответить
                              • Починил:
                                v = 2
                                try:
                                    eval('v++')
                                except SyntaxError:
                                    v = 2
                                Ответить
                                • Но этот код не решает задачу. Мой хотя бы падает.
                                  Ответить
                                  • Он и на двойке, и на тройке падает.
                                    Ответить
                                    • Падать лучше, чем выдавать неправильный ответ.
                                      Ответить
                                      • Сейчас набигут экмапитухи и пояснят, что всегда лучше возвращать неведомую хуйню, чем падать.
                                        Ответить
                                        • Сейчас набегут пыхомакаки, и пояснят, что лучше выводить нотисы в браузер и продолжать работу скрипта.
                                          Ответить
                                      • Сразу видно, что ты не вебщик.
                                        Все тенденции последних пятнадцати лет веб-разработки ведут к тому, чтобы вместо ошибки просто неправильно работать.

                                        Общий принцип веб-разработки таков: "если можно игнорировать ошибку, то лучше ее игнорировать".

                                        Я называю это "принцип собачки в ПХП"
                                        Ответить
                                        • Именно поэтому я за «ПХП».
                                          Ответить
                                          • Ну это в касается не только PHP. И JavaScript и Python и language-agnostic технологии вроде REST и JSON идут по этому пути.

                                            Если в 90-е люди думали, что ошибку лучше отловить как можно скорее и исправить, причем лучше отловить её автоматически, то теперь думают с точностью до наоборот.
                                            Ответить
                                            • >Если в 90-е люди думали, что ошибку лучше отловить как можно скорее и исправить

                                              Да, блядь.
                                              А потом программа сука крашится нахуй в самый важный момент и херит все данные.
                                              ┌──────────────────────────────────────────────────────────────┐
                                              │1Tporpamma Bblnolhula negonyctumyю onepa,uю u bygem 3akpblta. │
                                              └──────────────────────────────────────────────────────────────┘

                                              Отправьте отчёт Мокрософт. Зачем? Зачем?
                                              Ответить
                                              • Это делал дебугер по-умолчанию по имени Доктор Ватсон.

                                                То-ли дело прыщи: там core dumped, а в современных убунтах так и вовсе дамп отключен
                                                Ответить
                                                • Ну в journalctl краши и ошибки пишутся.

                                                  Кому надо — пойдёт и почитает.
                                                  Ответить
                                                  • В EventLog тоже пишутся на винде, только толку без дампа не много. Как и из этого джоурналд. (journalctl это клиент этово говна)
                                                    Ответить
                                                    • >В EventLog тоже пишутся на винде
                                                      А его как-то можно читать кроме как через гуй Администрирование?

                                                      journalctl можно грепнуть, там есть фильтры.

                                                      >только толку без дампа не много
                                                      Толк есть, там достаточно инфы. Трейс есть. Что ещё надо?
                                                      Ответить
                                                      • >А его как-то можно читать кроме как через гуй Администрирование?

                                                        Програмно можно читать, через командную строку можно (wevtutil), через WMI.

                                                        Сам формат конечно бинарный, но тут и линукс соснул хуйца: формат journald тоже бинарный. Ничем от виндуоса не отличается.

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

                                              Питушня какая-то. Неправильный мир. Всё должно было быть наоборот.

                                              В 90е программа обновлялась, когда пользователь, грубо говоря, приходил к другу с жёстким диском. В 20е программа обновляется, когда программист в туалете вместо нажал вместо кнопки "лайкнуть котика" на кнопку "обновить программу у всех моих пользователей".

                                              В 90е софтинка оставалась один на один с пользователем на долгие месяцы и годы, в 20е она может обновиться до нескольких раз в день.

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

                                              В 20е годы можно всё быстренько исправить. Падучая программа вполне уместна, пока программист жив.
                                              Ответить
                                              • Тут просто важна критичность ошибки и стадия когда она выявлена.

                                                Когда ошибка ловится на стадии компиляции — пожалуйста.

                                                Но если это стадия работы приложения и тривиальная ошибка приводит к крашу всей программы — ну его нахуй.

                                                Мне меньше всего хочется из-за этого получить краш приложения из-за какой-то хуйни.
                                                Ответить
                            • import sys
                              v = 3 - int(sys.getsizeof(range(1000)) > 1000)
                              print(v)

                              https://ideone.com/kAdiIe
                              https://ideone.com/WHJyoU
                              Ответить
                              • print(2 if repr(pow(10,100))[101:] == 'L' else 3)


                                https://ideone.com/qOVkA3
                                https://ideone.com/lZ1wku
                                Ответить
                                • v = 2 if b''=='' else 3
                                  print(v)

                                  https://ideone.com/s1C7f5
                                  https://ideone.com/aCReDB
                                  Ответить
                                  • Хотел спросить, что же означает префикс «b» в двойке, но уже нагуглил. Он просто игнорируется. Его добавили в какую-то из версий двойки (в 2.6 вроде), когда уже появилась тройка, чтобы писать портабельный код.

                                    Какой костыль )))
                                    Ответить
                              • range(1000000000000) # py2 shall not pass
                                Ответить
                                • Кстати, интересно, что происходит в реальных примерах реализаций «Питона». Память сразу коммитится или только резервируется? А то вдруг есть реализация с бесконечной виртуальной памятью и ленивым выделением страниц?
                                  Ответить
                              • >>> sys.getsizeof(range(1000))

                                Интересно. Двойка выдаёт вес брутто: размер реального массива в байтах плюс размер служебного заголовка с описанием? А тройка создаёт не массив, а генератор, поэтому выдаёт так мало?
                                Ответить
                                • В двойке «range(1000)» — это просто список (list) из 1000 элементов. А в тройке — генератор, которому нужно хранить только start, stop, step и текущее значение. В двойке такие генераторы создаются через «xrange(100500)».
                                  Ответить
                        • try:
                              map(lambda x: x, [0])[0]
                          except TypeError:
                              print('Tpemuu_nemyx')
                          Ответить
                        • py_ver = len(str(type(b''))) // 5
                          Ответить
                          • Гениально!
                            Ответить
                          • :))))))))))))))))
                            Ответить
                          • > // 5
                            Бля, долго не мог понять, почему py_ver будет равен пяти и зачем там этот комментарий.
                            Какой багор )))
                            Ответить
                            • Тяжело думать на нескольких языках, да?
                              Ответить
                              • Подтверждаю.

                                Кстати, в «JavaScript» подвезли целочисленное деление:
                                > 8 // 1
                                < 8
                                Ответить
                            • это же скриптовый язык, расчитанный на запуск с командной строки

                              тм должет поддерживаца #, иначе как будет шебанг?
                              Ответить
                              • В «PHP» поддерживается решётка. Но там и // поддерживается, и /* */ поддерживается.

                                Давайте придумаем ЯП, в котором ещё поддерживаются { } и (* *), как в «Паскале», два минуса, как в языке Ада, буква «C», как в «Фортране», апостроф, как в «Бейсике», и точка с запятой, как в «Ассемблере».
                                Ответить
                                • два минуса еще в SQL и Lua :)

                                  Одновременная поддержка # и // еще раз говорит там, что PHP -- язык без царя в голове
                                  Ответить
                              • Node.js игнорирует ШЕБАНГ, а для остальных случаев # не является коммунтарием.
                                Ответить
            • > 2.7 никому не нужен
              Ха-ха. Интересно, в каком году это утверждение станет истинным?
              Ответить
              • Python 2 support

                pip will continue to ensure that it runs on Python 2.7 after the CPython 2.7 EOL date. Support for Python 2.7 will be dropped, if bugs in Python 2.7 itself make this necessary (which is unlikely) or Python 2 usage reduces to a level where pip maintainers feel it is OK to drop support. The same approach is used to determine when to drop support for other Python versions.

                However, bugs reported with pip which only occur on Python 2.7 would likely not be addressed directly by pip’s maintainers. Pull Requests to fix Python 2.7 only bugs will be considered, and merged (subject to normal review processes). Note that there may be delays due to the lack of developer resources for reviewing such pull requests.

                https://pip.pypa.io/en/latest/development/release-process/#python-2-support
                Ответить
                • Какие-то иероглифы на поросячьей мове никого не интересуют.
                  Полезный работающий софт на "python" никто не будет переписывать на "python++".
                  Ответить
                  • Именно поэтому я за «PHP».
                    Ответить
                  • К сожалению действительно не будет. Официально питон2 мёртв, но некоторые компании имеют слишком дохуя кода на питоне2, чтобы его переписывать.

                    Например, I know for sure, что у чуваков из world of tanks именно такая ситуация.

                    Ситуация напоминает европейские и американские банки с кодом на cobol: конечно, кобол не нужен. Но ни у кого нету лишнего миллиарда долларов и лишних семи человеколет, чтобы это всё переписать
                    Ответить
                    • На самом деле, есть, просто банки это та ещё ленивая бюрократичная хуйня, которая очень любит надувать щёки, заставлять всех приходить в белых рубашечках и галстучках и ставить дуболомов-охранников по периметру, а по факту голимое решето и кризис-мейкеры
                      Ответить
                      • Это правда. Есть бюрократы-мудаки. Но есть и принцип "работает -- не трогай!"

                        Есть, например, мейнрфреймы IBM, тянущие свою историю со времен OS/360. У них там чуть-ли не алфавитно-цифровые терминалы.

                        Но ты попробуй продай 80-ти летнему дедушке идею переписки всего этого на современные технологии.

                        Он скажет: это работает с 1974-го года, и не является проблемой. Почему я должен давать тебе денег на переписывание этого?
                        Ответить
                        • – Сэр, у нас там программное обеспечение на коболе не обновлялось с 1974-го года, это может стать проблемой.
                          – Перегреем очередной рынок дешёвыми кредитами, чтобы ёбнуло, тогда никто не заметит этот ваш кобол
                          Ответить
                      • Примерно так:
                        https://youtu.be/fB2b-lTjCQA
                        Ответить
      • Неважно какой там жит. Жит не выпилит ГЦ, жит не выпилит рантайм рефлексию, жит не наделит жаву нормальной типизацией, жит не сделает из дженериков что-то уровня крестовых шаблонов.
        Ответить
        • Выпьем за это!

          > жит не сделает из дженериков что-то уровня крестовых шаблонов
          Хвала богам.

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

          И только когда это действительно нужно, жит инлайнит питухов для какого-то отдельного случая. Шаблон заменяется ФВП, инстанцирование на этапе компиляции заменяется инлайном на этапе компиляции или на этапе жидования.
          Ответить
          • ОШИБКА CLASS CAST EXCEPTION. ЭТО ЖЕ ОЧЕВИДНО КАК ЕЕ РЕШИТЬ
            ПРИШЛО ВРЕМЯ КАСТОВАТЬ В OBJECT
            Ответить
    • > провести оптимизации

      А имеет ли право? Скриптушня же, const'ов нет, статической типизации нет. Откуда мы знаем, что print не поменял random.random на что-то другое?
      Ответить
      • О чём я и говорю. Питухи решили из bat-файлов сделать язык программирования, а статическую типизацию не осилили, потому что анскиллябры.
        Ответить
        • Именно. Они как-бы дали макакам недоязычок на котором они могут насрать хелворд.

          И возможность всем сообщить "дак я же как сишка".

          Чего рядовой скриптух сделать не может. Хотя они и пытались.

          Они понимают, что скриптуха - говно.

          Они понимают, что они домохозяйки.

          На этом фоне и развиваются все эти комплексы.

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

            Клоун - ты не сможешь уйти от типизации.

            Ты просто можешь делать вид что типов не существует, до тех пор пока твоя анскильная программа не развалится.

            Потому что ты вторичен по отношению к основам.

            Это проблема всех идиотов.

            Это как С++ возьмёт и скажет «я уйду от си», хотя С++ в контексте именно своей семантики первичен.
            Ответить
      • Это ваше скриптоговно с поздним связыванием вообще плохо поддаётся оптимизации. Питон ещё ничего, а вот в Tcl, например, можно подменить хоть for, хоть return, да даже константые выражения не свернуть, потому что они так же считаются через команду expr.
        Ответить
        • Не ну можно как в v8 - надеяться на разум программиста и откатываться на тормозную реализацию если он обычный скриптушок.

          Т.е. считаем, что random.random не меняется после инициализации модуля random. А если таки поменяется - идём деоптимизировать и чистить кеши вилкой.
          Ответить
          • Сектант понимает, что он бездарность и ничего не может, как и jit недоязычка.

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

            Которое сишка/кресты каждый раз сливает в хламину.

            Именно поэтому они пытались эмулировать сишку в виде asm.js

            Тормозные, глючные gc-отбросы смеялись над Царём, говорившим обезьянам что массив — единственно полезная структура.

            Основа asm.js это ArrayBuffer — гигантский массив, который хранит все структуры данных написанные отбросами.

            Проблема в том, что путём воровства это бездарное говно обманывает рядовую публику.
            Ответить
            • Признайся, ты и ведёшь блог "Царя"?
              Ответить
              • твой автоинкремёнтер кармы уже сильно палится. Здесь нет пятерых участников.
                Гавно ты.
                Ответить
                • Сам ты говно, отъебись от меня!
                  Ответить
                  • Какой hormand )))
                    Палишься же. Слишком быстро сам себе ответил. Всего через минуту. Впрочем что с багра взять.
                    Ответить
                    • да похуй вообще.
                      Мне странно, что файка до сих пор не в блэклистс.
                      Ответить
          • язык на J кстати тоже так делает

            ну, точнее, С2 из хотспота (и наверняка конпель из грааля)
            Ответить
        • >скриптоговно с поздним связыванием

          js-макаки худо-бедно пытались его компилировать. И у отбросов даже что-то получалось.

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

          Но поскольку это скриптуха, то сишка раз разом изваляла в говне все сектантские потуги.

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

          Сначала родили asm.js. Потом wasm.

          asm.js — попытка скриптухов сделать из обезьянего недоязычка божественную сишку.

          https://govnokod.ru/26263#comment516758

          Украл - начни всем врать, что ты что-то сделал.

          Но проблема не в этом.

          Я считаю, что этот биомусор пробил очередное дно. Никак иначе.

          Wasm - это компромисс, который сломает вендорлок на одной из крупных платформ.

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

          Никаких аналогов ему нет.

          Сам по себе он говно, но это базовое свойство этой реальности.

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

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

            И вместо того, что бы это всё фиксить, они придумывают новое ненужное говно.

            Зачем? Зачем?
            Ответить
            • В постиндустриальную эпоху развелось много бесполезых людей.

              Из-за технологической безработицы они не могут найти себе работу.

              >Каждое следующее поколение горе-программистов заново изобретает колесо, яростно отвергая колеса прошлых поколений.

              Потому отбросы чтобы занять себя хоть чем-то и выдумывают всякие Русские Слоны и прочие «прожекты».

              Они не просто едят говно, а «создают два рабочих места и поднимают ВВП на 200 долларов».

              Мы с gost не так давно это обсуждали. Что IT-сфера сейчас не источник сколь-нибудь значимой добавленной стоимости.

              Большей частью это бесцельное перекладывание кирпичиков и перетаскивание байтиков. А так же таскание круглого и катание квадратного.
              Ответить

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