Как изучать языки программирования



    Я ни в коей мере не утверждаю, что указанный мной способ лучший из возможных. Более того, я вовсе не уверен в том, что он вообще правильный. Возможно, если бы моим первым языком был не Си, а какой-либо из функциональных языков или ассемблеров, моё мнение было бы иным, и жизнь моя сложилось бы совсем иначе. Так что весь нижеизложенный материал воспринимайте со здоровым скептицизмом.

    Немного личных воспоминаний


    С детства я мечтал о карьере биолога, но в тринадцать лет, впервые ознакомившись с компьютером в школе, задумал стать крутым хакером. Когда у меня в пятнадцать лет появился регулярный доступ к компьютеру, первой мыслью было изучение программирования. Мой выбор пал на C++, была куплена книга из серии «Для чайников», но всё было ужасно скучным, непонятным и неинтересным. Уже тогда я понимал, что с C++ что-то не так. И сам ход изложения материала в книге начинался с краткого экскурса в функции, после чего сразу переходили к классам, причём всё объяснялось не на живых примерах, а на уровне глобальных абстракций. Авторы с увлечением рассказывали о прекрасном мире ООП, в котором нам посчастливится жить, про машины с разными функциями или животных с разным поведением. В общем, в то время изучение C++ и сама концепция ООП были заброшены.

    Спустя несколько лет, во время учёбы в университете, я увидел в киоске маленькую книгу «Язык программирования Си», Брайана Кернигана и Денниса Ритчи. Купив её, я сразу же приступил к чтению. И о чудо! Всё было ясно, легко и ужасно интересно. Язык C очень маленький, простой и элегантный (я всё ещё так считаю), а сама книга была написана нормальным человеческим языком, не лишённым однако строгости. Я перечитывал её много раз, выполнял упражнения, и, таким образом, вскоре освоил этот язык и стандартную библиотеку функций.

    Но на чистом Си много не напишешь, а мне хотелось писать серьёзные программы с красивой графикой. Программировал я в Slackware Linux, ибо в Windows как в среде программирования полностью разочаровался. В те времена я вообще много экспериментировал с разными системами, включая QNX и NetBSD. Но в свободных Unix системах выбор вменяемых графических библиотек был невелик: GTK+ и Qt. Причём вторая была написана на C++, с которым я не желал связываться, а в первой не было ясно вообще, как работать. И, если мне не изменила память, их редакторы интерфейсов генерировали огромный код, который ещё нужно было вставлять в свою программу, а не ресурсные файлы, что казалось мне совершенно ужасным.

    Так бы я и не начал карьеру, если бы случайно не познакомился с Mac OS X, которую недавно портировали на Intel процессоры. Попросив у знакомого диск с Mac OS X 10.5 Leopard, я установил её на свой HackBook и первый раз ощутил себя на Земле Обетованной.

    Помня о своём неудачном первом разе, я ещё долгое время скептически относился к объектно-ориентированному программированию. В начале даже планировал писать программы на чистом Си, используя библиотеку Carbon. И, как выяснилось – зря. Objective-C я изучил по официальному руководству компании NeXT – Object-oriented programming and the Objective-C language. В те времена изучающих новый язык ещё не считали поголовно идиотами или школьниками, поэтому книга написана нормальным языком, а авторы предполагают знание Си и общее представление о программировании. Оказалось, что ООП – это легко, интересно и очень удобно, а объекты – вовсе не абстрактные сущности, а всего лишь структуры, объединённые с функциями. На мой взгляд, именно так и нужно рассказывать основы объектно-ориентированного программирования.

    В Xcode и основам Mac OS X я разобрался по замечательным урокам Алексея Борескова. После чего сразу же нырнул в Mac Developer Library, взялся за изучение официальных руководств по Cocoa и прочим библиотекам, параллельно начав писать программы.

    Моим первым серьёзным проектом было портирование уроков по OpenGL с Windows на Mac OS X, которое растянулось на целый год. Лишь закончив его, я почувствовал себя достаточно уверенно, чтобы устроиться на регулярную оплачиваемую работу.

    Изучая Objective-C, нельзя не услышать о Smalltalk, ибо на него очень часто ссылаются в материалах по Objective-C, видимо, извиняясь за непривычный синтаксис. Но Smalltalk был похож на Неуловимого Джо – все о нём слышали, но мало кто его видел или использовал. В конце концов и мне стало интересно, откуда есть пошла русская земля.

    Узнав, что компания Cincom – лидер в сфере решений на Smalltalk – в рекламных целях предоставляет свои инструменты для некоммерческого использования, я сразу же заказал их. Менее чем несколько недель в мою дверь постучал курьер и вручил мне фирменную коробку с несколькими CD дисками и официальным руководством. Всё было совершенно бесплатно, даже за доставку не пришлось платить. На одном из дисков обнаружился VisualWorks – одна из самых мощных и быстрых коммерческих сред по разработке на Smalltalk в мире.

    После я узнал про Squeak – свободную реализацию Smalltalk, основанную на оригинальной версии Smalltalk-80, – и познакомился со многими её разработчиками. Для обучения и исследований он подходит намного больше, чем прочие версии. Кстати, сообщество программистов на Smalltalk очень дружное.

    Почти все серьёзные проекты являются кроссплатформенными, и их ядра написаны на C++, ибо Objective-C очень мало распространён за пределами Apple экосистемы. Главным образом из-за отсутствия удобных средств разработки. (Будем надеяться, что благодаря LLVM ситуация вскоре улучшится.) Так что мне пришлось изучить C++, несмотря на явную нелюбовь к нему. К счастью, к этому времени я уже научился отделять зёрна от плевел.

    Впрочем, хакером я так и не стал.

    Порядок изучения языков


    C – первый язык


    Это маленький (всего 32 ключевых слова в C89, 37 слов в C99 и 44 слова в C11) императивный язык, и его первичное изучение не займёт у вас много времени. В то же время C – очень мощный промышленный язык. Главным образом используется в системном программировании, написании аппаратно независимых компонент операционных систем, компиляторов и трансляторов языков, библиотек, программировании микроконтроллеров. По версии TIOBE Programming Community Index Си всё ещё лидирует по использованию, изредка вежливо уступая первенство Java.

    /* Hello world in C */
    
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
        printf("Hello World!\n");
        return EXIT_SUCCESS;
    }
    

    Objective-C – второй язык


    Он представляет собой очень тонкий слой поверх чистого Си. Все знания, полученные при изучении Си понадобятся вам в Objective-C. Причём объектно-ориентированная парадигма концептуально и синтаксически отделена от процедурной: в нём вы никогда не спутаете вызов функции и посылку сообщения. Основное его применение – создание пользовательских программ на устройствах компании Apple.

    /* Hello world in Objective C */
    
    #import <Foundation/Foundation.h>
    
    int main (int argc, const char *argv[])
    {
        NSAutoreleasePool *pool = [NSAutoreleasePool new];
            NSLog (@"Hello, World!\n");
        [pool drain];
        return 0;
    }
    

    Smalltalk – третий язык


    После Objective-C он покажется вам очень знакомым. И не зря, ведь именно его синтаксис и объектная модель были положены в основу Objective-C. Интересен прежде всего чистой реализацией объектно-ориентированной парадигмы. Все конструкции языка, включая условия, циклы, управляющие структуры и операторы, реализованы через механизм сообщений и вынесены в стандартную библиотеку классов. Несмотря на малое распространение он используется в крупных сложных проектах, где важна масштабируемость, гибкость и возможность изменений во время работы. Например, в финансовой сфере (Kapital – система оценки и управления рисками в JPMorgan), управлении производством (CIM в Texas Instruments), логистике (IRIS-2 в Orient Overseas Container Lines), страховании (Desjardins General Insurance Group) и прочих.

    "Hello world in Smalltalk" 
    
    Transcript show: 'Hello World!'; cr.
    


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

    C++


    Очень избыточный (число ключевых слов превалило за 100), запутанный и сложный в изучении язык, со множеством исключений и массовыми нарушениями ОО парадигмы. Но если вы хотите работать в индустрии, знать его нужно, так как альтернативы ему не предвидится. На C++ написана большая часть научных и инженерных программ, игр, фото- видео- аудиоредакторов и много чего ещё. После того, как Objective-C и Smalltalk сформировали у вас правильное представление об ООП и программировании, C++ уже не сможет повредить ваш разум. Но всё равно будьте очень осторожны. Вообще, слово «знать» в применении к C++ имеет несколько иное значение, ибо знать его в том же смысле, в каком можно знать, например, Objective-C или Java мало реально. Хорошая новость: в большинстве случаев для успешной работы вам нужно освоить лишь небольшое подмножество языка. Великолепным примером грамотного использования C++ является I/O Kit – интерфейс программирования драйверов в Mac OS X.

    // Hello world in C++ 
    
    #include <iostream>
     
    int main()
    {
      std::cout << "Hello World!\n";
      return 0;
    }
    

    Assembler


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

    # Hello World in GNU Assembler on Mac OS X 10.8 using System V AMD64 ABI calling convention
    
    .data
    _hello:
        .asciz "Hello world!\n"
    
    .text
    .globl _main
    _main:
        subq $8, %rsp
    
        movb $0, %al
        leaq _hello(%rip), %rdi
        call _printf
    
        movq $0, %rdi
        call _exit
    

    JavaScript


    Пожалуй, главный язык программирования Всемирной Паутины. Основное его применение – создание динамических web страниц на клиентской стороне. Каждый браузер снабжён интерпретатором и средствами для анализа и разработки на нём. Если вы хотите заниматься web программированием, JavaScript – ваш выбор. В нём реализованы по меньшей мере три парадигмы: процедурная, функциональная и объектно-ориентированная, причём последняя основана на прототипах. На первый взгляд JavaScript кажется очень лёгким, ибо позволяет писать в C-подобной манере, но в реальности он сложный. Большинство JavaScript разработчиков программируют не с использованием языка и даже не на языке, а на одной из библиотек.

    // Hello world in JavaScript
    
    document.write("Hello World!");
    

    Язык Ada


    По крайней мере его стоит выучить, чтобы шокировать знакомых священников громким заявлением. Шучу. Благодаря правильному дизайну, многочисленным встроенным механизмам и проверкам Ada является одним из самых безопасных языков программирования. Вряд ли вы будете регулярно использовать его (если, конечно, вам не повезло работать в Министерстве Обороны США, авиационной или космической сфере), но ознакомиться с ним крайне полезно. После его изучения вы узнаете, каким должен был быть C++.

    -- Hello world in Ada
    
    with Ada.Text_IO; use Ada.Text_IO;
    procedure Hello is
    begin
      Put_Line ("Hello, world!");
    end Hello;
    

    Scheme


    Функциональный язык, разработанный в Массачусетском Технологическом Институте специально для обучения студентов программированию. Один из диалектов знаменитого Lisp. Интересен своей элегантностью и минимализмом. В промышленности не замечен, главным образом используется (и весьма успешно) в образовательных учреждениях. Своё знакомство с миром функционального программирования лучше начать именно с него.

    ;; Hello world in Scheme
    
    (begin (display "Hello, World!")
        (newline))
    

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

    Особое мнение


    Многие авторы советуют первыми изучать скриптовые языки высокого уровня, такие, как Shell, Perl, JavaScript или Scheme. Но лично я рекомендую первым языком учить именно Си. Скриптовые языки с автоматическим управлением памятью, скрывающие всю сложную работу с указателями глубоко в недрах программы, действительно легче в освоении, но все их преимущества можно в полной мере понять и оценить лишь после изучения языка уровнем ниже.

    Когда вы научились считать каждый байт, привыкли проверять границы массивов, освоили ручное управление памятью и разобрались с указателями и адресной арифметикой, переход на любой скриптовый язык покажется вам лёгкой прогулкой. Обратное же, как правило, не верно. Если вы привыкли, что ваш интерпретатор всё делает за вас, освоиться в C или C++ будет намного сложнее, особенно, в процессе смены специализации. Ещё вы будете знать, что происходит под капотом вашей программы, и сможете примерно представлять в уме, как могли бы выглядеть на Си выражения используемого языка.

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

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

    Также не нужно выбирать первым объектно-ориентированный язык. Не бегите впереди паровоза. Дело в том, что временные затраты на проектирование и реализацию классов весьма существенны. И в маленьких учебных программах польза от них не очевидна. ООП является логическим расширением процедурного программирования, и изучать его лучше именно в таком ключе. После того, как вы написали несколько сложных программ на процедурном языке, естественным путём пришли к объектным моделям, вам сразу будут ясны все преимущества языков, реализующих объектно-ориентированную парадигму. И ещё, на первом языке обычно изучают основы программирования и алгоритмы, а применение объектной парадигмы, требующей немалого объёма «лишней» работы, будет отвлекать ваше внимание.

    Хороший пример объектной модели, реализованной на языке C – библиотека CoreFoundation в Mac OS X.

    Как учить язык?


    Изучение языка программирования очень похоже на изучение обычного человеческого языка общения. Чтобы выучить новый язык вам понадобятся:

    Во-первых, хороший учебник. Не «Для чайников» и не «За 21 день». Лучше, если это будет учебник именно по языку, а не руководство по созданию и выкладыванию игры в App Store (в котором процессу выкладывания посвящено больше времени, чем самому программированию). Во-вторых, стандарт языка ANSI/ISO и справочник по стандартной библиотеке. И, в-третьих, учебные и реальные примеры, которые можно найти в Сети.

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

    Лучшее упражнение – это написание небольших программ, реализующих различные структуры данных и алгоритмы – деревья, списки, таблицы, графы, поиск и сортировку из книги «Алгоритмы. Построение и анализ», Томас Кормен, Чарльз Лейзерсон, Рональд Ривест, Клиффорд Штайн (Introduction to Algorithms by Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest and Clifford Stein). Несложные функции стандартной библиотеки или утилиты командной строки. Не нужно пытаться сразу писать большие и сложные программы, всё равно вы ещё плохо знаете язык.

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

    У многих на фоне первых успехов возникает желание сразу начать писать большие серьёзные программы. Я крайне не рекомендую вам следовать их примеру. Взявшись за сложный проект, вы через месяц обнаружите, что ваш первый код был ужасен и приметесь его переписывать, вполне возможно, вам потребуется ещё несколько итераций. В результате вы потратите время и силы на то, что нужно отрабатывать на учебных или небольших программах. Так что не торопитесь – к счастью, примерно за год изучения и упражнений легко можно выйти на приемлемый уровень коммерческой разработки.

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

    Подпишитесь на каналы и новостные группы, списки рассылки, посвящённые вашему языку. Ценным источником информации и ответов на многие вопросы являются профильные сообщества в stackexchange.com и аналогичных ресурсах.

    В последнее время получил широкое распространение иная стратегия – нацеленная на немедленный результат. Появилось множество книг и курсов, обещающих сделать из человека без малейшего представления о программировании высококлассного специалиста менее чем за месяц. Немало людей посещают подобные курсы (за приличные деньги), учатся писать screensaver, радостно публикуют его в Сети и получает на выходе красивый сертификат с которым бегут устраиваться в фирмы. Подобный подход опасен тем, что создаёт иллюзию знания: человек наспех выучивает одну технологию (как правило не самую лучшую) и считает её единственно возможной.

    Заключение


    До сих пор речь шла о языках программирования. Но языки представляют собой лишь одну ось в многомерном пространстве программной инженерии. Хорошее знание языков необходимо, но, вообще говоря, недостаточно для разработки программ. Не менее важно знание принципов проектирования программ, алгоритмов, предметной сферы. Всё это нужно изучать параллельно. Продолжая аналогию с реальным миром, можно сказать, что кроме развёрнутых измерений, которые благодаря объёму рынка хорошо видны, существует намного большее число свёрнутых маленьких измерений. Обычно их не видно, но без них привычный мир бы не существовал. Чаще всего именно узких нишах находится наиболее интересная инженерная работа и исследования.
    Поддержать автора
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 346

      +8
      Важно не упустить «введение» (биты, байты, слова, системы счисления и т.п.). Тут как нельзя кстати подходит ассемблер (у вас он почему-то оказался в середине), а уже после него можно плавно и вдумчиво переходить на С.
        +4
        Ну для того, чтобы разобраться в «битах, байтах, словах, системах счисления» ассемблер в общем-то необязателен. Он как раз выступит естественным продолжением после С, углубляя знания студента. Но начинать с C я бы не стал.
        Зачем учить мертвые языки вроде Smalltalk и Ada мне вообще непонятно.
          +2
          мертвые языки
          лишь в вашем воображении. ;-) Я ясно написал, где они используются. А изучть их можно затем, чтов них много лет назад было реализовано то, чего и сейчас нет в широко распространённых языках. Зная разные языки, вы сможете более или менее легко эмулировать недостающие возможности в вашем языке.
            +6
            Написали, но живее они от этого не становятся. Почти нет сообщества, на stackoverflow ответов, я думаю, не найти, применить особо негде, скорость изучения из-за этого будет ниже. И что потом с этими знаниями делать? Для общего развития? Для изучения обширной темы «какими разными бывают языки программирования» не имеет смысла прыгать по всем языкам какие есть, лучше глубоко изучить два-три языка, реализующих различные парадигмы и теоретическую часть.

            Кстати, а сколько времени вы отводите на изучение 8 (!) языков программирования? Отмечу, что среди них нет большинства самых востребованных из КДПВ — Java, C#, PHP, Python. Их потом дополнительно учить?
              +1
              Вы думали или проверяли? Smalltalk on stackoverflow.com Ну и проверьте списки рассылки Squeak.
                +2
                Там ещё и 500 ответом про brainfuck есть. И на логарифмической шкале, увы, Smalltalk всё-таки ближе к Brainfuck'у, чем к какому-нибудь pythonу. А если есть желание покопаться в истории — то можно и на BCPL и на Cobol взглянуть, зачем Smalltalk'ом-то ограничиваться?
                  +2
                  Кстати, учить Кобол хоть, наверно, и скучно, зато прибыльно. Софта на нём написано немерянно, и его нужно сопровождать/расширять, а знающих этот ЯП всё меньше и меньше.
                    0
                    Там, где на Коболе программируют, знанием одного лишь языка не отделаться — матчасть нужно знать, на Коболе же в основном финансовые и экономические программы написаны.
                      0
                      Ровно настолько, насколько и в любых других сферах. Иногда это программирующие консультанты, которые матчасть знают. Иногда просто программисты, которые умеют программировать, но в бизнесовую суть их кода особо не вдаются — как написано в ТЗ, так и делают.
            +1
            Зачем учить мертвые языки вроде Smalltalk и Ada мне вообще непонятно.

            Это как латынь. Никто не говорит, но все лингвисты учат:)
              0
              Ну что вы, латынь же учат далеко не только лингвисты же и даже как-то используют.
                0
                Ну если вы собираетесь разработывать новый язык, то посмотреть на Smalltalk может быть полезно. Но если вы хотите что-то такое запрограммировать — то вряд ли…
                +1

                На латыни говорят врачи и биологи

              0
              Биты, байты, слова, системы счисления, арифметика указателей — всё это и есть C. А вот ИМХО после — если еще останется желание залезть глубже в кроличью нору — asm.
                0
                Во введении имхо более важно понимать как работает парсер. Что такое блок ворожение оператор и тд. У меня товарищ у себя в городе делал интернет магазины на заказ, я ему минут 30 объяснял что доллар в jquery это просто функция.
                  +1
                  Минуту убил, чтобы понять при чем тут «ворожение»…
                +2
                Согласен с автором, чтобы всецело понимать процесс, которым занимаешься, нужно знать его основы. Другое дело, что, в частных случаях нет необходимости в понимании той, или иной, основы, наверное. Для того и есть программисты, которые знают, преимущественно один язык высокого уровня.
                  +7
                  Для меня ВМКашная последовательность изучения канонична: Паскаль, Ассемблер, Си, Си++, Лисп, Пролог. Т.е. сначала нужно просто понять, что такое алгоритм. А потом идти от самых глубин. Потому что, нужно знать, как работает процессор. А изучая Си, нужно понимать, что это платформонезависимый Ассемблер. А дальше нужно ознакомиться с различными парадигмами. При этом Си++, мне кажется, знать необходимо.
                    +5
                    Полностью C++ знать невозможно. Для его знания на более-менее приемлемом уровне необходимо не менее 2 лет практики.
                      +3
                      Честно говоря, я не понимаю всего этого хейтерства вокруг Си++. Есть такая замечательная книга «С++ за 21 день». Не думаю, что мои знания выходят за рамки этой книги, даже с учетом года изучения в университете. При этом мне не попадалось реального кода, который был бы непонятен. Где же используется весь тот сложный Си++, о котором так много пишут на Хабре? Наверное, у меня мало опыта, но тот опыт, что есть, считаю весьма полезным. И он мне говорит, что Си++ не такой уж сложный.
                        +5
                        Всё дело в том, что между «писать на C++» и «эффективно писать на C++» — огромная пропасть.
                        Ничто не мешает писать на C++ как на C с классами — но в этом случае я бы порекомендовал Java или C# — это уменьшило бы время разработки.

                        C++ сложен кучей нюансов, которые непременно вылезут в процессе разработки (привет, stackoverflow). Есть ещё C++11 и C++14, которые внесли много нового, в т.ч. и принципиально нового.
                          +2
                          Вы библиотеками из Boost много пользовались или ограничились STL?
                            0
                            Буст настолько запутан?
                              0
                              Да, буст очень запутан. Если внутренности STL ещё можно худо-бедно читать, то в Boost лучше вообще не залезать, и вот почему:

                              1. Boost кроссплатформенен — мы увидим мешанину из директив препроцессора.
                              2. Boost позволяет эмулировать возможности новых стандартов C++ на старых компиляторах: например, лямбды, functional, move semantics, variadic templates. Какими костылями и какой ценой это было достигнуто, лучше не смотреть.
                              3. Время компиляции программы с Boost на порядок выше, чем на STL. У меня есть простой проект с Boost, который делает простую фильтрацию изображений, который компилируется 30 секунд, и аналогичный без Boost, который компилируется за секунду. Если есть возможность отказаться от буста — лучше отказаться.

                              Но в целом Boost не так плох. Boost можно рассматривать как передний край развития C++. Именно благодаря Boost C++ эволюционирует: вещи из Boost переходят в стандарт C++ и становятся частью STL.
                                0
                                Например вот
                                https://github.com/boostorg/dynamic_bitset/blob/develop/include/boost/dynamic_bitset/dynamic_bitset.hpp

                                В принципе все прочитать можно. Но местами оно переусложнено для портабельности и полноты API.
                                  0
                                  Приятно читать, однако.

                                  А теперь взгляните вот сюда (отдельная библиотека boost.preprocessor):
                                  https://github.com/boostorg/preprocessor/tree/develop/include/boost/preprocessor/tuple

                                  Ну или сюда (кусок из boost.mpl):
                                  https://github.com/boostorg/mpl/blob/develop/include/boost/mpl/aux_/preprocessed/msvc70/map.hpp

                              +4
                              Проблема C++ в том, что написать непонятный код на нем очень легко. Сделать непонятным код, который был понятным, добавив пару условий (и пару багов) — еще проще. А вот понять потом этот код и провести рефакторинг должным образом — задача другого порядка. В итоге без твердой руки в управлении проектом качества кода постепенно падает, особенно если «нужно быстрее».

                              Также вам передают привет простыни в описании ошибки при использовании шаблонов, проблемы с поддержкой современных фич в современных компиляторах, segmentation fault, толпы ifdef'ов, неявное приведение типов, heap/stack corruption и все прочее, что вы должны по долгу службы держать в голове, но не можете.

                              В итоге в каком-нибудь лохматом громоздком проекте, где многое писалось без использования STL просто потому, что тогда в нем были баги, это многое проще просто переписывать с нуля. Проблему, конечно, решает строгое следование гайдлайнам, но код, который попадает к вам в руки, часто про них не слышал.
                                +1
                                А вы смотрели, например, во внутренности Boost'a?
                                  +3
                                  «Научиться программировать за 21 день очень легко. Это как перевести стрелки часов. Солнечных. Через дорогу. На португальский.»
                                    +1
                                    Не судите по названию.
                                  0
                                  C++ очень похож на естественный язык. Сказать:«Я знаю полностью язык c++», — могут немногие, но это не беда, ведь в каждой «социальной группе» используется только его часть.Это эквивалентно правилу 2500 слов в английском языке. Если вы хотите не только «разговаривать» на языке, но и писать хорошие произведения, то нужно изучать С++ глубже. В культурном обществе употребление мата разрешается только спонтанно, а когда за речью не следят, матом разговаривают. Аналогично на с++ — одна и та же задача решается различными способами. Можно написть красиво и понятно, а можно ******(много мата). Однажды из-за проектной ошибки, один и тот же код писали разные програмисты разного уровня. Спектр решений на с++ меня шокировал, от чистого С до шаблонов.
                                    0

                                    Три года практики? Если кто-то говорит вам, что он знает С++ и у него нет очков и бороды, то он либо врет, либо просто не читал Александреску.

                                      –1
                                      Не-не, извращенства с шаблонами — это уже не эффективное программирование, а баловство.
                                        +1

                                        STL и Boost — это сплошняком извращенства с шаблонами. А человек, который считает, что он знает С++, должен хотя бы уметь понять исходники.

                                    +2
                                    Это не то что бы ВМКашная последовательность, это каноничная. У нас единственно Ассемблер изучали после С++, до Лиспа с Прологом, как раз перед изучением «Организации ЭВМ».

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

                                    Золотые слова: последовательность «сначала машинная арифметика, потом Ассемблер, а уж потом что-нибудь еще» не работает. Человеку надо сначала влезть на ступеньку, с любым языком — будь то хоть Паскаль, хоть, прости господи, Бейсик. Почувствовать, попробовать программирование на вкус, а уж потом нырять.
                                    +13
                                    А вот я приверженец стратегии программирования, нацеленной на результат. Сначала ставим задачу, а затем с интересом её решаем, попутно изучая язык программирования. Переписывать через месяц код с новыми значениями — это нормально, это не трата времени, а естественный процесс обучения. А вот накапливать в течении года теорию и только потом приступить к практическую программированию — нереально.

                                    Также я считаю, что не нужно смешивать следующие моменты:
                                    1. Изучение архитектуры, логики и парадигм и технологий программирования.
                                    2. Изучение синтаксиса языков.
                                    3. Изучение алгоритмов и структур данных.
                                    Мне становится грустно, когда я вижу студентов, которые без уверенного знания архитектуры и синтаксиса языка сразу лезут в алгоритмы.

                                    Роль учебников для каждого индивидуальна. Я считаю чтение учебников скучным, для меня это пустая трата времени, т.к. теория без практики не откладывается. А если и использую учебники, то исключительно как документацию и справочный материал — впрочем, сейчас всё то же самое есть в интернете.

                                    Многие, например, очень настойчиво советуют всякие модные книги по написанию совершенного кода и паттернам. Новичку эти книги будут вредны. Например, паттерн — это просто способ оформления кода с определённой логикой, а не готовое решение, которое обязательно нужно куда-нибудь воткнуть.

                                    Ещё крайне важно знать английский язык. Потому что документация и обучающие примеры в подавляющем большинстве будут на английском.
                                      +2
                                      Вы не поверите, но и мне в первую очередь важен результат. При условии, что вы уже профессионал. Но я против алчного желания мгновенного результата, когда человек лишь начал учёбу. В первое время изучения программирования результатом должно являться усвоение знаний. Начните уже воспринимать программирование как инженерное искусство и науку, а не как набор магических заклинаний.
                                        +3
                                        Программирование — это никак не наука. Программист не производит знание, он производит код. Есть специальный термин «компьютерные науки», но это не программирование само по себе.
                                        Искусство тоже мимо, только если код не экспонат. Но мы все к этому стремимся, да.
                                        Программирование — это инженерное дело, то есть ремесло. А в ремесле очень важен практический опыт и умение соотнести затраты и результат, которое с ним приходит.
                                          +3
                                          Вы путаете программирование и кодинг. Кодеры производят код, а программисты также как и физики, матиматики и тд ищут решение проблемм.
                                            +2
                                            Какие хорошие слова!
                                              0
                                              Нет слова «кодинг» в русском языке. Есть программирование — создание программ, и кодирование — процесс написания программного кода. Соотносятся они примерно как постройка дома и перекладывание кирпичей. Мы все-таки говорим о первом.
                                              Физики и математики создают научное знание, программисты создают программы.
                                              Решением проблем занимается человек абсолютно любой профессии, не было бы проблемы — его бы не звали.
                                                0
                                                Можете привести примеры работы «кодера»? Например, в типичной компании, разрабатывающей свой продукт. Что будут делать кодеры, и что будут делать программисты? Как этим понятиям соответсвуют Junior/Middle/Senior Developer из типичных вакансий?

                                                Пока что я не уверен, что профессия «кодер» существует в 2016 году за пределами интернет форумов.
                                                  0
                                                  Лично я «кодерами» называю программистов, способных писать код, но не обладющих развитым аналитическим мышлением.

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

                                                  Например, была у меня пара студентов: с одной стороны, уже подрабатывали разработчиками, с другой — не могли решить элементарные задачи. Одна студентка-разработчица под iOS вообще убила: за год не смогла написать свёртку изображений (функция-велосипед пишется за 5 минут), потому что не понимала, как. Искала готовые решения, пытаясь разобраться с OpenCV, но так и смогла этого сделать. Пришлось в итоге её выгнать.
                                                    0
                                                    Ну по вашей версии это тот же программист, просто хуже.

                                                    Мне больше интересна версия, где кодер и программист каким-то образом кардинально отличаются.

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

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

                                                    Возможно, это просто мой pet peeve, но такая двойственность (с одной стороны, говорят о том, как важно быть логичным и прочее, а с другой, без оглядки используют такое расплывчатое понятие) выглядит очень странно.

                                                    Напомнило TDD, почему-то. Часто сталкиваюсь, что в последнее время под «TDD» понимается тупо «пишите ли вы какие-нибудь тесты?».
                                                      0
                                                      В русском и английском многие слова имеют разный смысл. Так, слова «менеджер» и «manager» имеют разный смысл, «девелопер» и «developer» — тоже и т.д. Это вполне естественная эволюция значений слов при заимствовании.

                                                      А для философов даже слова «детерминированный» и «определённый» имеют разный смысл.
                                                        0
                                                        А я и не говорю, что они обязательно должны иметь одинаковый смысл.
                                                        0
                                                        Мне больше интересна версия, где кодер и программист каким-то образом кардинально отличаются.
                                                        Вы действительно не видите разницы? По-моему отличие между «кодером» и «программистом» — это всё то же самое различие между наукой и псевдонаукой, скажем алхимией и химией.

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

                                                        Но, тем не менее, это не помешало алхимикам толочься буквально на одном месте сотни лет! Просто потому что у тебя нет плана и объективного способа оценки результатов, то можно ходить кругами на одном месте годами.

                                                        Вот и описанная студентка-разработчица, судя по описанию, была занята поисками «философского камня». Что, глаз бешенного койота не подходит? Ну давай мочу доископаемого бизона попробуем. Вдруг да сработает…

                                                        И, к сожалению, очень часто современные курсы приводят вот именно к такому результату: человек не воспринимает компьютер как тупую числодробилку, которую он сам (при наличии достаточного времени, понятно) может разобрать на части снизу доверху и собрать обратно.

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

                                                        К сожалению использование высокоуровневых языков поощряет формирование именно такого видение мира — потому их и опасно использовать для обучения программированию. При всём их практическом удобстве. Хорошие учителя могут эту проблему сделать не такой острой, но есть более простой способ: просто начать с какого-нибудь более низкоуровневого языка. Pascal, при всей своей архаичности, вполне годится: в нём нет никакой магии! Вы не поверите, но в Turbo Pascal User's Guide были не только подробно описаны функции Mark/Release но и было подробно описано — как устроена «куча» внутри, чем отличаются реализации «кучи» в версиях 5 и 6 и прочее.

                                                        Возможно, это просто мой pet peeve, но такая двойственность (с одной стороны, говорят о том, как важно быть логичным и прочее, а с другой, без оглядки используют такое расплывчатое понятие) выглядит очень странно.
                                                        Не вижу ничего странного. Отличить науку от лженауки зачастую не так-то просто — но, тем не менее, одно — приносит нам новые, улучшенные процессоры, увеличивает «удои» и прочее, а второе — приводит примерно вот к такому.
                                                          0
                                                          > Вы действительно не видите разницы?

                                                          Разницу между чем и чем? Посмотрите сверху, там ещё один мой пост есть (над постом от DistortNeo) — я там как раз и попросил примеры кодера/программиста, чтобы понять, кто под ними подразумевался в данном конкретном случае, и разницу между ними.
                                                            0
                                                            Я сталкиваюсь (на собеседованиях) с кодерами постоянно, но так как моя задача — их отсеять, то я понятия не имею чем они занимаются там, куда их берут на работу.

                                                            Но разница между программистом и кодером — довольно простая: задача кодера — написать код, задача программиста — создать программу. Кажется, что это одно и то же? Нет, нифига.

                                                            Написать код — это как в известной притче: «Если достаточно долго месить чан с перловой кашей, в синтаксическом мусоре можно рано или поздно узреть лик Ларри Уолла». Есть задача, мы её решаем и если всё сделано «как написано», то… «я лично пришиваю пуговицы — к пуговицам претензии есть?»

                                                            А написать программу — это другое. У тебя есть задача и заказчику пофигу что у тебя там не работает — IndexDB, OpenCV или ASP.NET. По-фи-гу. Ему нужно чтобы программа работала.

                                                            Бич программирования — это пресловутые протекающие абстракции. В проекте, над которым я сейчас работаю — сотни миллионов строк. Я работаю над маленьким компонентом (где-то с полмиллиона строк), но баги, которые у нас «выстреливают» (в смысле — нам на них жалуются)… примерно в половине случаев — на самом деле они не у нас, а где-то в другом месте — и мне нужно понять (хотя бы примерно) — где (и кто за эту часть отвечает). Потому что багов быть не должно, а то, что они не у нас — не означает, что нам на них можно «забить».

                                                            Так вот без хотя бы примерного понимания того, как все эти бесконечные слои абстракций работают — я этого сделать не могу. А люди, освоившие «на специальных курсах visual, научившиеся расставлять формочки и прочее» — даже не предствляют что делать если у них возникла проблема из-за того, что где-то в огромном стеке технологий, которые они используют, случилась очередная «протечка» и «что-то пошло не так». Вернее «представляют» и «делают» — «месят чан с перловой кашей». При этом одна и та же ошибка «загоняться вглубь» множеством разных способов — но будет неизменно «всплывать», так как люди, которые с ней борются не понимают не только откуда она проистикает, но и не имеют представления о том, что ответ на этот вопрос вообще существует!

                                                            «Почему сервер иногда отвечает за две минуты вместо двух сукунд?» «А фиг его знает — но мы watchdog поставили и перезапускаем его, когда он начинает подтомаживать».

                                                            Какое-то время это работает, но когда количество костылей переваливает за критическую массу… про историю с Windows Longhorn — слышали? А ведь там кодеров участвовало не так и много в процессе. Большинство разработчиков в Microsoft — неплохие профессионалы.
                                                            +2
                                                            Вот так много слов и совсем нету смысла. Знаете что вы сказали? Что есть профессионалы и есть шарлатаны. Вот смысл вашего многословия.
                                                            Хотя я даже с этим не соглашусь — очень многие наработки алхимии легли в основу химии. Нет, ну правда. Люди накопили опыт, который потом удалось систематизировать. Не было бы опыта — и что бы химики систематизировали? Да если ещё и без помощи физиков?

                                                            Что там ваша бедная девочка с картинками — она хоть раз работала с таким классом задач? Ей помогали? Была ли достаточно дружелюбной атмосфера, чтобы она могла спросить сама? Нам ничего этого не известно. Интересно было бы уточнить у DistortNeo этот момент. Просто если «девочка студентка» впервые видит этот класс задач, а на её вопросы её посылают лесом — то она вполне естественно ничего не сделает. Это ж джун зелёнейший!

                                                            И вдруг появляются такие странные утверждения… джун имеет право не знать ни про выделение памяти ни про сборку мусора… первые полгода-год погружения в практические задачи. Вот чтобы вырасти из джуна (самое близкое к описываемому «кодеру») — да, требуется погружение, понимание и много чего ещё.

                                                            Использование высокоуровневых языков позволяет на стадии изучения алгоритмов игнорировать некоторые особенности реализации этих алгоритмов на исполняющей машине. А то, что после этого почему-то забывают людям дать остальные знания — язык-то точно не виноват. А низкоуровневые просто работают этаким «фильтром» — справится с концепциями и алгоритмами разом или нет… ну нет — значит «не программист».

                                                            PS иногда видел разделения программист/кодер в виде, присваивающем программисту менеджерские/аналитические/архитектурные задачи… видел даже экономические задачи реализации алгорима! Хотя программист, по большому счёту, менеджерскими и большей частью аналитических задач заниматься не должен. Т.е. проанализировать прикладную область, проанализировать инструментально-библиотечные возможности, безусловно, должен программист, а вот пообщаться с заказчиком и выяснить, а что же он хочет — это всё-таки задача аналитиков/менеджеров. Но некоторые почему-то накладывают на программиста умение договариваться с заказчиком…

                                                            PPS а вообще разделение программист/кодер появляется когда ну очень хочется почешить ЧСВ и под программиста закладывается то, чем пишущий по факту занимается.
                                                              +1
                                                              джун имеет право не знать ни про выделение памяти ни про сборку мусора…

                                                              Серьезно? Можно мне другой глобус, пожалуйста?
                                                                –1
                                                                Серьёзно. Другой глобус — это к Маску.

                                                                Вы забываете, что помимо языков с прямым управлением памяти бывают «managed» языки (java, javascript) и сессионные языки (php как минимум 4ая версия, более поздние не смотрел). Сессионным языкам, как можно логично предположить — болт положить на утечки, т.к. создать утечку, которая в пределах одной сессии сожрёт всю память — это надо очень постараться. Чуть ли не специально так писать придётся. В «managed» языках так же сложно писать так, что будут серьёзные утечки… Хотя на StackOverflow действительно реалистичная ситуация. Ну так она классическая «учебная».

                                                                В итоге получаем — знать по факту — не обязательно. Но только совсем-совсем зелёному (да не троллю! джуну!).

                                                                При дальнейшем развитии — ему придётся писать более сложные алгоритмы/обращаться к внешним ресурсам — вот здесь уже потребуется реальное понимание (а не то, что он вынес из ВУЗа/курсов), как это всё работает… он с этим должен будет разобраться (хотя и будет по прежнему джуном).
                                                                  +1
                                                                  При чем здесь «есть другие языки»? Джун — это уровень квалификации — «начальный», т.е. человек без опыта, но с базовым набором знаний. Выделение памяти — в пределах первого курса любого ВУЗа. Если человек закончил ВУЗ по профилю и не знает про выделение памяти, то ему стоит выкинуть свой диплом. Если не учился и не знает, то он просто не обладает достаточной квалификацией, чтобы быть «джуном».
                                                                    –1
                                                                    А если забыл, ввиду того что не пользовался этим C/C++ с того самого первого курса?.. Возьмём тот же JS — там ведь вообще выделять по сути не требуется (точнее это легко можно упустить, т.к. язык не требует каких-либо действий кроме присвоения).

                                                                    Ну и знает хоть что-то о выделении памяти (в рамках того самого первого курса) и сколько-нибудь достаточно понимает — вещи очень разные. Я имел ввиду больше 2ое.
                                                                      0
                                                                      А если забыл, ввиду того что не пользовался этим C/C++ с того самого первого курса?..

                                                                      Это субъективно, конечно, но на мой взгляд, это некое базовое знание, примитив к тому же. Если отложить в сторону JS, то даже в той же Java понятно, что объект создается не из «пустоты». Более того, вопросы работы с памятью входят в экзамен на самый начальный сертификат.
                                                                      Язык, которым мы пользуемся — это только инструмент, принцип работы кучи (условно) — это знание, которое не зависит от инструмента.

                                                                      Ну и знает хоть что-то о выделении памяти (в рамках того самого первого курса) и сколько-нибудь достаточно понимает — вещи очень разные. Я имел ввиду больше 2ое.

                                                                      Не знаю… нам давали это на первом курсе, в упрощенном виде (список свободных блоков, дробление, фрагментация и т.п.), но общее представление это дает всем — проще быть не может.
                                                                        0
                                                                        точнее это легко можно упустить, т.к. язык не требует каких-либо действий кроме присвоения
                                                                        В этом и проблема — легко упустить, а потому нужно постоянно об этом помнить. И тот факт, что явно освобождать память не требует не делает задачу проще — наоборот, это загоняет проблему «вглубь». Вам по прежнему нужно думать о том, чтобы все ссылки на более ненужные объекты обнулились, однако при этом у вас в коде даже нет «реперных точек», которые отмечают момент, где это происходит.

                                                                        Ну и знает хоть что-то о выделении памяти (в рамках того самого первого курса) и сколько-нибудь достаточно понимает — вещи очень разные.
                                                                        Конечно. Проблема в том что «практический подход» призывает к тому, чтобы просто не думать о том, что память — это вообще ограниченный ресурс. А результат — у меня телефон, которые в 1000 раз мощнее чем компьютер, на котором я впервые увидел электронную почту, не всегда позволяет мне написать письмо в 100 килобайт размером (нет, я всё понимаю: Unicode и всё такое… но тексты подобного размера я редактировал на компьютере MSX-2 с памятью, на минуточку, 128K и процессором 3.58MHz, а мой телефон с памятью в гиг и процессором в 2GHz этого не может — это вообще в какие ворота?).
                                                                          0
                                                                          Ага, еще забавно было видеть примеры в учебниках по программированию вида «создадим простейший редактор текста. Вот у нас строковая переменная, читаем в нее файл...». И возникает внезапный прикол, что во-первых эта программа отожрет памяти по размеру файла, при том, что мы видим в каждый момент времени только «окно», а во-вторых, будет доооолго открывать этот файл. При этом какой-нибудь Volkov Commander откроет и отредактирует тот же 1Гб файл в реальном режиме.
                                                                            0
                                                                            При этом какой-нибудь Volkov Commander откроет и отредактирует тот же 1Гб файл в реальном режиме.
                                                                            Не откроет — это вам не МироМир.

                                                                            Но, кстати, прообраз того самого Volkov Commander'а очень хорошо показывает к чему приводит бездумное применение модных технологий.

                                                                            Кокретнее — в его 5й версии. Правда началось это с 4'й (где появился NCZIP), но апофигей — это 5я.

                                                                            Она в 20 раз больше (притом что новых фич появилась горстка), но вот как раз NCEDIT объёмом почти в 200K — это финиш.

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

                                                                            Однако в версии 5.0 этот редактор — отдельный файл почти в 200K размером. При этом файлы, которые он может редактировать — по прежнему не могут быть больше 64K (тогда это считалось нормальным… Turbo Pascal 5.x тоже не умеет файлы больше 64K редактировать, к примеру).

                                                                            Вот кем надо быть, чтобы задизайнить систему, которая не сообщает о загрузке с диска файла в 200K, но потом показывает процесс загрузки файла размером не более 64K? С прогресс-баром и прочими прелестями?
                                                                              0
                                                                              Не откроет

                                                                              Значит, я путаю с каким-то другим файловым менеджером, но не суть, я думаю, довод понятен: окно против целого блока.

                                                                              Кокретнее — в его 5й версии. Правда началось это с 4'й (где появился NCZIP), но апофигей — это 5я.

                                                                              Ага, это было печально, когда он перестал влезать на дискету. ЕМНИП, 5ю версию переписали на другом языке, поэтому она такая пухлая.
                                                                  +1
                                                                  Отвечаю про девочку-студентку. Цель заданий — избавиться от типичных ошибок джунов при работе с изображениями: они забывают про диапазон 0-255 и выход из него, иногда выходят за границы массива, в неправильном порядке обходят изображения (из-за чего падает скорость). Только после этого студентам можно ставить более-менее приличные задачи, имеющие хоть и небольшую, но практическую ценность.

                                                                  Все студенты перед заданием получают теорию (что такое свёртка и как её считать), программу-болванку для работы с изображениями (загрузка и сохранение). Консультируем студентов с удовольствием. Дополнительных материалов (учебники, интернет) навалом. В чём проблема решить простую задачу? Но если человек не может хоть как-то решить даже простую задачу, то такой человек нам не нужен, и тратить своё время на него мы не видим смысла.
                                                                    0
                                                                    DistortNeo в такой ситуации проблема, скорее всего, в том, что девочка по сути не программист. Согласно тому, что вы описали здесь идёт простейшее непонимание принципов работы компьютерных систем. Т.е. это равносильно ситуации «гуманитарий поизучал курсы программирования». Отсутствие базовых знаний и понимания.
                                                                    Это НЕ кодер. Это неспециалист.
                                                                    И у неё выбор простой — или стать-таки специалистом (вполне возможно, что она это может), или отказаться от этой специальности и заняться чем-то более релевантным её знаниям/умениям. В виду калечности её знаний — пусть становления специалистом её будет крайне затруднён. Т.е. «кодера» мы тут не нашли.

                                                                    vlad72 Вопрос не в уровне. Есть специалисты, есть неспециалисты. В текущей дискусси кодеры не появлись. И от методики может зависеть качество специалиста и процент выхода годного продукта (специалистов). Я не знаком с методиками, которые из любого человека сделают специалиста. Есть методики которые неспособны сделать специалистом.

                                                                    PS возьмём простой пример (действительно простой, если знать как работает компьютер и как работает js… единственное но — нахождение проблемы требует некоторой усидчивости): есть проблема — после нажатия shift+а (русская) в некотором поле поле перестаёт принимать символы.
                                                                    Можете описать примерный процесс поиска?
                                                                    Уточню — библиотек и js-кода много и всё это свалено в кучу (там ещё и говнокод местами… в общем-то проблема как раз в куске такого «щастя» и нашлась). Я (плохо знакомый с кодом — 3ый месяц в проекте) потратил чуть больше 5 часов на эту (в общем-то простую, но нудную) задачу, джуны-мидлы более-мене знакомые с проектом не знали с какой стороны к ней подступиться. Впрочем и здесь надо уточнить — у меня, судя по всему, самый сильный скилл по вебу (хотя я себя позиционирую больше как бекэндера, хотя и умею фуллстек)
                                                                      0
                                                                      > Я не знаком с методиками, которые из любого человека сделают специалиста.
                                                                      Но зато есть методики, как из потенциального специалиста сделать законченного неспециалиста ))
                                                                        0
                                                                        В такой ситуации проблема, скорее всего, в том, что девочка по сути не программист. Согласно тому, что вы описали здесь идёт простейшее непонимание принципов работы компьютерных систем. Т.е. это равносильно ситуации «гуманитарий поизучал курсы программирования». Отсутствие базовых знаний и понимания.
                                                                        Это НЕ кодер. Это неспециалист.
                                                                        Почему не специалист? Это — уровень 90% «разработчиков на 1С» и где-то половины «натягивателей шкурок на CMS». Они сами — считают себя программистами. Ну потому что программы-то они пишут :-)

                                                                        Есть специалисты, есть неспециалисты. В текущей дискусси кодеры не появлись.
                                                                        А кто тогда появился? Как этих людей назвать? Они «что-то знают» про CSS, JS, HTML, пишут какой-то код, получают за это зарплату, некоторые работодатели, надо полагать, довольны (иначе они не приходили бы к нам на собеседования, а либо научились бы программировать, либо «переквалифицировались бы в управдомы»). Кто они? Как их назвать?

                                                                        Можете описать примерный процесс поиска?
                                                                        Ну как я могу описать то, чего я не делал? Понятно что чудес в мире не бывает, значит нажатие этого самого shift+а изменило что-то в документе. Либо DOM, либо состояние какой-нибудь JS переменной. То есть вначале нужно сравнить DOM «до» и «после» нажатия. Если он поменялся (скажем поле поменяло аттрибуты), то нужно смотреть — кто и когда и поменял, если нет — значит у нас где-то кто-то перехватывает event'ы и нужно искать — кто и где. Если вы за 5 часов проблему нашли, то, надо полагать в внутренности браузера не лазили, так что можно считать, что ошибок в реализации браузера нету и, скорее всего, кто-то где-то неправильно обрабатывает сообщения и, получив, «чужое» сообщение блокирует не то поле, которое хотел. Может страничка пытается сама поиск реализовать (чтобы по Ctrl+F не открывалось окошко поиска — это, конечно, перепутать Ctrl+F и Shift-А непросто… но я ещё и не то видел) или ещё чего-нибудь в этом же духе.

                                                                        В общем не очень понятно — чего вы хотели увидеть… и не очень понятно почему джуниор должен в подобных местах «в ступор» впадать…
                                                                      +1
                                                                      >Знаете что вы сказали? Что есть профессионалы и есть шарлатаны. Вот смысл вашего многословия.

                                                                      Вопрос состоит не в уровне развивающего программиста, а в том, что одна методика обучения готовит людей, готовых к развитию, а другая просто информированных на некоем уровне и теряющихся при новых для него проблемах.
                                                                    0
                                                                    Я придерживаюсь версии, что «кодер» — это сленговое название техника-программиста по классификаторам профессий (выпускник техникума или колледжа), а «программист» — инженер-программист (выпускник вуза). Понятно, что некоторые выпускники вузов даже кодером работать не смогут, а кто-то и без формального образования как инженер большинство выпускников за пояс заткнёт, но в целом по квалификационным требованиям можно посмотреть чем отличается «кодер» от «программиста». Базовое же различие, по-моему, «кодер» решает технические задачи, а «программист» — производственные техническими средствами.
                                                                    0

                                                                    А что именно (какой ньюанс) не понимала студентка и какими подходами Вы пользовались для объяснений?

                                                                      0
                                                                      Я так и не понял, в чём была проблема.
                                                                      На предложение показать проблему — ноутбук не с собой.
                                                                      Ещё и ходила на занятия один раз через два.
                                                                    0
                                                                    Обожэмой, кодеросрач, ўсё пропало…
                                                                      0
                                                                      Программист рисует UML и задаёт алгоритмы которые используются конкретными методами. Кодер переносит это всё в код.
                                                                        0
                                                                        А если от UML тошнит, да и вообще графика не особо воспринимается?
                                                                          0
                                                                          Что простите? попросили привести пример что делают кодеры и программисты
                                                                            +2
                                                                            UML как правило рисует не программист. Это задача или архитектора или технического писателя. Программиста обычно заставить рисовать эти штуки можно разве что под угрозой расстрела или хотя бы пыток.
                                                                              0
                                                                              Собственно правда заключается в том, что программист и кодер — разные профессии. То есть совсем.

                                                                              Грубо говоря там, где у вас создание программ поставлено на поток (как выпечка пирожков или Биг Маков) — там у вас есть архитекторы и кодеры. Там, где делаются штучные изделия (как в любом, пусть даже маленьком, ресторанчике) — им делать нечего.

                                                                              И тут, также как с поварами: хороший повар может «дорасти» до создателя новых рецептов очередных гамбургеров (хотя немногим это понравится), но человек, засовывающий картошку во фритюрницу — поваром никогда не станет. Хотя может стать менеджером…

                                                                              P.S. И тут также, как с фастфудом — вопрос о том, нужен ли он вообще, в принципе — будет, наверное, обсуждаться вечно, но на практике — он существует, а потому существуют и кодеры.
                                                                                0
                                                                                Думаю, на этом обсуждение можно закончить ))
                                                                                  0
                                                                                  Собственно правда заключается в том, что программист и кодер — разные профессии. То есть совсем.

                                                                                  но на практике — он существует, а потому существуют и кодеры.


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

                                                                                  А люди, освоившие «на специальных курсах visual, научившиеся расставлять формочки и прочее» — даже не предствляют что делать если у них возникла проблема из-за того, что где-то в огромном стеке технологий, которые они используют, случилась очередная «протечка» и «что-то пошло не так».



                                                                                  «Почему сервер иногда отвечает за две минуты вместо двух сукунд?» «А фиг его знает — но мы watchdog поставили и перезапускаем его, когда он начинает подтомаживать».



                                                                                  А ведь там кодеров участвовало не так и много в процессе. Большинство разработчиков в Microsoft — неплохие профессионалы.


                                                                                  Если я не прав, то можете сказать, в чём разница между плохим программистом и кодером?
                                                                                    0
                                                                                    Если я не прав, то можете сказать, в чём разница между плохим программистом и кодером?
                                                                                    В требованиях.

                                                                                    Как было написано на самом верху:
                                                                                    Кодеры производят код, а пирограммисты также как и физики, матиматики и тд ищут решение проблемм.
                                                                                    Если у вас производство программ поставлено на поток и рисуются все эти UML-схемы и прочее, то у вас появляется в цепочке ниша для «условного индуса», которые «кодит». Ему снаружи приходит список фукций — и он их реализует. К каждой функции приложены граничные условия — и от успешно преобразует текстовое представление в набор тестов для JUnit или gTest.

                                                                                    Собственно UML-диаграммы — это как лакмусовая бумажка: если они у вас являются частью производственного процесса и рисуются для всех частей системы (и не как что-то высокоуровневое для презентации уже после того, как система написана) — то и кодеры у вас, почти наверняка, есть тоже. Обратное, впрочем, не совсем верно, так как кроме UML есть несколько других способов донести эту информацию от «архитектора» до «кодера».

                                                                                    Кодера совершенно не интересует и не волнует существование в природе таких вещей как алгоритмы, кеши и прочее — и от него этого не требуют. Вообще. Его задача — перевести набор «картинок» в код. Всё. Если полученный код тормозит или неправильно работает — это ошибка «архитектора», в слудующий раз будет ставить задачу детальнее…

                                                                                    Java, в частности, очень сильно заточена под эту категорию — и осторожность во введении новых фич, во-многом, связана с тем, что возрастут затраты на кодинг, так как не все кодеры смогут освоить все эти новомодные лямбды и навставляют var где только смогут, так что потом в этом коде сам чёрт ногу сломит.

                                                                                    Да, наверное, даже «плохой» программист может справиться с обязанностями кодера. Зависит от того, насколько он «плох», конечно, но может. Обратное — неверно.
                                                                                      0
                                                                                      > Кодера совершенно не интересует и не волнует существование в природе таких вещей как алгоритмы, кеши и прочее

                                                                                      Неужели на UML прорисовывают все детали алгоритмов, вплоть до последнего бита в кэшах??
                                                                                        0
                                                                                        Не прорисовывают. Потому созданные таким образом приложения часто безбожно тормозят. Но если заказчика это устраивает…
                                                                                          0
                                                                                          Ну вот видите, вы тоже приходите к тому, что ваш образ «кодера» — это всего лишь программист, у которого проблемы с качеством кода.
                                                                                            0
                                                                                            А человек на стойке в Макдональдсе — просто плохой повар, ага.

                                                                                            Кодер — это человек, умеющий перерабатывать тексты в код и всё. Большо от него — ничего не требуется. Соответственно дизайн приложения должен быть таков, чтобы накосячить было нельзя. Обычно это обозначает что приложение будет тормозить потому что в нём будет много «лишних» слоёв, но каждый слой будет «покрыт тестами» настолько, что даже при условии что его писал «индус» — вся конструкция вместе — будет работать.

                                                                                            Та же самая ситуация, что и гамбургерами, собственно: дизайн приводится к такому виду, чтобы даже если человек ничего не знающий о кулинарии породил что-то, что можно есть. То, что там ну будет места импровизации и что это никтогда не будет заслуживать эпитета «вау» — неважно. Важно, чтобы никто не отравился.
                                                                                            0
                                                                                            Вот вы пишете, что кодер переводит набор картинок в код. Так или иначе, какие-то решения по написанию кода он в процессе этой деятельности принимать неизбежно будет (иначе «набор картинок» или любая другая спецификация, по которой он работает, не оставляя никакой свободы интерпретации, должна быть полной, непротиворечивой и исчерпывающей и, как следствие, функционально эквивалентной готовой программе, зачем тогда «кодер» — бери да запускай). Например, решения какого уровня кодер принимает, а какого — не принимает?
                                                                                              0
                                                                                              Любые решения, требующие знания чего-то, кроме, собственно, языка программирования — принимает дизайнер. Если нужна сортировка пузырьком — ссылка на описание этой сортировки в википедии. Нужна база данных? Описание этой базы данных — картинка со списком таблиц и связями.

                                                                                              Названия переменных — да, оставляются на усмотрение разработчика. Тех, которые private, конечно.

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

                                                                                              Потому что задача — не сделать «лучше, чем у других», а «сделать, потратив на это XX часов дизайнера и YY часов кодера». Предсказуемость — важнее качества результата.

                                                                                              Вы не поверите — сколько такого говнософта в мире создаётся в самых разных областях…
                                                                                                0
                                                                                                > Любые решения, требующие знания чего-то, кроме, собственно, языка программирования — принимает дизайнер.
                                                                                                > Если нужна сортировка пузырьком — ссылка на описание этой сортировки в википедии.
                                                                                                Тогда кодеров согласно вашему пониманию вообще практически не существует в природе. В любой, даже самой забюрократизированной конторе, где разработчик не в курсе, что за программу он пишет (такие реально существуют, впрочем, вы наверняка знаете), устройство внутренней логики остаётся на откуп разработчику. Дизайнер даёт общую спецификацию, что на входе, что на выходе, а уж как оно там должно быть внутри реализовано, решает сам разработчик.
                                                                                                И вот именно по этой причине и появляется говнософт. Если бы было как вы пишите, чтобы при разработке программ всё вплоть до алгоритмов сортировки задавалось бы проектировщиками, говнософта было бы намного меньше :)
                                                                                                  0
                                                                                                  Почему «дизайнер»? Design != дизайн.
                                                                                                  [англ. design — проектировать, конструировать] — художественное конструирование предметов, изделий; создание эстетического облика среды.

                                                                                                  To design = разрабатывать, designer в этом контексте = разработчик. Инженер в конце концов.
                                                                                                    0
                                                                                                    > Почему «дизайнер»
                                                                                                    Потому что митап, колл, кастомер и т.д. Мода такая.
                                                                                                      0
                                                                                                      Неа, мимо. «Митап», «колл» — правильные американизмы, англицизмы. «Дизайн» в данном контексте — неверно используемое слово. Примерно как «мы продаем нашу экспертизу». Т.е. слово-калька уже используется в языке, и имеет иной смысл.
                                                                                                        0
                                                                                                        > «Митап», «колл» — правильные американизмы, англицизмы.
                                                                                                        А по-моему, и то, и другое — барахло, которое тянется в язык лишь потому, что фраза «Мы проводим митап» кажется солиднее, чем «Мы проводим встречу». На этом фоне назвать дизайнером проектировщика ничуть не хуже. Слово «дизайн» в его классическом понимании в русский язык было притянуто тоже не слишком давно, в конце 1980-х.
                                                                                                          0
                                                                                                          На этом фоне назвать дизайнером проектировщика ничуть не хуже.

                                                                                                          Хуже. Вы не понимаете сути претензии.

                                                                                                          Слово «дизайн» в его классическом понимании в русский язык было притянуто тоже не слишком давно, в конце 1980-х.

                                                                                                          Тем не менее, слово «дизайн» уже вошло в язык. Нравится вам это или нет. И имеет оно определенный смысл, как и слово «экспертиза», например. Употреблять «дизайнер» в значении «разработчик» или «экспертиза» вместо «опыт, мастерство, знания» — неверно, это ошибка. Такая же, как если назвать табуретку арбузом. Употребление «колл» — просто пижонство, но не ошибка.
                                                                                                            0
                                                                                                            > Употреблять «дизайнер» в значении «разработчик» или «экспертиза» вместо «опыт, мастерство, знания» — неверно, это ошибка.
                                                                                                            Вы уж извините, но я все равно еще немного позанудствую :) В язык можно привлекать как новые слова, так и новые значения для существующих слов. Не существуют какие-либо правила, которые одобряют первое и запрещают второе. Всё это субъективно. Поэтому никакой ошибки тут нет. Тем более что «дизайнер» уже достаточно давно в русском языке встречается и в значении «конструктор». До «разработчика» уже немного осталось.
                                                                                                              0
                                                                                                              Тем более что «дизайнер» уже достаточно давно в русском языке встречается и в значении «конструктор»

                                                                                                              Ни разу не видел. В словаре нет.
                                                                                                            0
                                                                                                            Ну во-первых митап это != «встреча». Это слово привносит дополнительный смысл — встреча по проекту/обсуждение текущих наработок/… Т.е. в вашем случае «мы проводим встречу по проекту» будет верной расшифровкой вашей первой фразы, а вот ваша расшифровка — не корректна. Аналогично с коллом — он привносит некоторые дополнительные смыслы. Вполне возможно, отсутствующие в оригинальном языке. Ваше же употребление дизайн пытается сменить устоявшееся значение у существующих слов — это более сложный я тяжёлый процесс… и эффектинов происходить он может только в условиях обозначившегося несоответствия изначального смысла. Т.е. технически-то оно возможно, но будет восприниматься более «в штыки», чем привлечение новых слов.
                                                                                                              0
                                                                                                              > Это слово привносит дополнительный смысл — встреча по проекту/обсуждение текущих наработок
                                                                                                              А ещё есть такое слово как «собрание» :)

                                                                                                              > Аналогично с коллом — он привносит некоторые дополнительные смыслы.
                                                                                                              А тут соглашусь с MacIn, это слово привносит дополнительный вкус пижонства.

                                                                                                              Помню лет двадцать назад преподавателя по экономике, она так любила выражаться, у неё вместо «задач» были «таски», а вместо определений «дефиниции». Это и тогда смотрелось пижонством, и в общем-то и сейчас.
                                                                                                                0
                                                                                                                А тут соглашусь с MacIn, это слово привносит дополнительный вкус пижонства.

                                                                                                                Есть случаи, когда это пижонство, есть случаи, когда делается упор на коннотацию американизма.
                                                                                                      0
                                                                                                      > Вы не поверите — сколько такого говнософта в мире создаётся в самых разных областях…

                                                                                                      Почему не поверю, я сам так часто пишу, только вместо «дизайнера» обычно собственная богатая фантазия, а вместо «кодера» — интерпретатор Питона с библиотеками. Нужна сортировка — вызвать функцию sort/sorted, даже не заботясь, что там внутри, пузырёк или квиксорт. Нужна база данных — прикрутить левой ногой какой-нибудь ORM, даже не факт, что подходящий под задачу, а тот, который первый в голову придёт. Об оптимальности и речи не идёт — работать такое поделие будет в 10-20-100 раз медленнее даже наивного кода на С++. Ни до какого продакшена, правда, оно и близко не доживает — после нескольких итераций либо выкидывается за ненадобностью, либо перепиливается уже более-менее по-уму.
                                                                                              0
                                                                                              В принципе государственные российские классификаторы разделяют инженера-программиста (выпускник вуза в общем случае), техника-программиста (выпускник техникума-колледжа) и просто программиста (выпускник пту-лицея, а то и просто средней школы). По образовательным стандартам теоретических знаний больше, конечно, у инженера.
                                                                                              0
                                                                                              > Собственно правда заключается в том, что программист и кодер — разные профессии. То есть совсем.
                                                                                              Я вам возражу :) Нет такой профессии «кодер». В принципе нет. Это просто обидное словечко, которое придумали те программисты, которые имеют творческую составляющую в своей работе, чтобы обозначать тех программистов, которые этой творческой составляющей не имеют (либо в силу умственных неспособностей, либо в силу унылых должностных обязанностей).
                                                                                                –2
                                                                                                > Собственно правда заключается в том, что программист и кодер — разные профессии

                                                                                                И то и другое не является профессией, это описание рабочей деятельности людей.
                                                                                    0
                                                                                    Ремесло — Это написание отчётов в 1C, а создание системы управления грузовыми перевозками, авиарейсами или производством — сложная инженерная работа в которой иной раз изобретаются новые концепции и парадигмы программирования.
                                                                                      +2
                                                                                      Ремесло — Это...
                                                                                      Вы так говорите, будто это что-то плохое. Между тем, хороших ремесленников куда как меньше, чем требуется.
                                                                                        +1
                                                                                        Ни в коем случае! Я всего лишь против подмены понятий.
                                                                                        +1
                                                                                        Написание отчётов в 1C вполне может потребовать труд нескольких человек, если отчет строится неприлично долго и нужно оптимизировать обработку данных. Управления грузовыми перевозками/производством некоторые умельцы решают таблицей и парой формочек в каком-нибудь Oracle Forms. Вопрос масштаба и конкретной задачи. И то, и другое — это программирование.

                                                                                        Что вы пытаетесь доказать? Что есть программисты и Программисты? Вы из этих?
                                                                                          +2
                                                                                          Вообще, я с вами не соглашусь. Ремесло от творчества в программировании отличается не сутью задачи, а тем, сколько раз вы её уже решали. Делая свой первый отчет в 1С, вы точно так же первопроходец. Делая стопятидесятый, вы ремесленник. Делая свою первую систему логистики, вы тоже изучаете для себя новую отрасль, собираете материалы по автоматизации (если вам повезло работать «самостоятельным» программистом, а не винтиком большой девелоперской машины) и т.д.
                                                                                          А для следующего клиента вы уже будете идти знакомым путем, и это уже тоже будет ремесло.
                                                                                          +2
                                                                                          Не путайте инженерное дело и ремесло. А инженерное дело — отрасль научно-технической деятельности.
                                                                                          +3
                                                                                          Совсем не обязательно ставить целью результат, имеющий какую-то практическую ценность. Плюс к этому теория без применения на практике очень тяжело запоминается, а если и запоминается, то быстро улетучивается. А вот если в качестве «результата» поставить, например, решалку квадратных уравнений (с комплексными числами и вырожденными случаями), крестики-нолики или морской бой (возможно, с последующим добавлением сетевой игры), то по идее обучение должно стать проще и эффективнее, ибо теория сразу применяется на практике. А в связи с отсутствием практической ценности (кроме собственно обучения) и относительной простотой задачек всё выкинуть и переписать с нуля, набравшись опыта, будет совсем не жалко. И я сам так изучаю новые языки и технологии)
                                                                                            +1
                                                                                            Ну да, у меня сначала был тетрис, потом домино (компьютер меня даже обыгрывал), потом творческий подход к решению задач по обработке изображений в университете (дано задание, решать можно любыми средствами), затем — полноценный бот для онлайн-игры, имеющий сервер обновления и около 50-100 пользователей, ну и потом просто работа.
                                                                                            0
                                                                                            Для новичков как раз нужны книги для новичков («за 21 день», «на примерах» и т.д.).
                                                                                            Сложно представить, что кто-то может научиться программировать по толстому учебнику, приправив его ещё чтением стандарта и справочника по библиотеке.
                                                                                            Имхо, так можно учить 3-й, 4-й язык (я сам так C# когда-то давно изучал по 2 книгам Шилдта + стандарт), но не первый.
                                                                                              +1
                                                                                              С толстыми книгами есть другая проблема — они могут пытаться быть настолько всеобъемлющими, что хорошая их часть — банальщина и «из пустого в порожнее».

                                                                                              Мне вот понравилась книга «Core Java for the Impatient», например. Я не могу адекватно оценить т.к. много не работал (пока) с Java и многого не знаю, но подобное выглядит гораздо лучше, чем несколько книг от того же автора, где всё разжёвывают с самых нулей.
                                                                                                0
                                                                                                Это тоже. Когда уже знаешь несколько языков, наступает момент, когда читать в очередной раз про float vs double или про видимость методов и т.д. становится невыносимо скучно )
                                                                                                Серия «для нетерпеливых» уже лучше, но если оценивать «Scala for the Impatient», которую я недавно читал, то там тоже банальщины выше крыши.
                                                                                                Впрочем, есть и более хардкорные способы изучения, например: Learn X in Y minutes + документация по стандартной библиотеке (читать не целиком, а по мере необходимости).
                                                                                          +3
                                                                                          Согласна с автором, Си очень удобный язык для изучения азов программирования, правда нам в универе давали сначала функциональный CAML, а потом уже к Си переходили. Мотивировалось это тем, что большинство студентов до универа программированием вообще не занимались и если им сразу дать Си, то ничего компилироваться не будет. Не знаю, насколько верно это утверждение, правда.
                                                                                            0
                                                                                            Как он может быть удобным, если даже для «Hello, World!»-программы надо написать (а преподавателю объяснять (обычно словами «Так надо. Потом поймёте.»)) кучу неочевидных (а для начинающего — неестественных) вещей?
                                                                                              +2
                                                                                              Так на любом языке для «Hello, World!» нужно программный код писать. А удобство Си в том, что на основе его синтаксиса построен синтаксис огромного количества языков программирования. Плюс, как уже говорилось в статье, в языке достаточно немного основных ключевых слов, но при этом на нем можно написать много чего благодаря множеству уже существующих библиотек и системных функций.
                                                                                                0
                                                                                                > но при этом на нем можно написать много чего благодаря множеству уже существующих библиотек и системных функций.
                                                                                                Ага, попробуйте на C заменить в строке все вхождения одной подстроки на другую подстроку произвольной длины :)
                                                                                                  0
                                                                                                  Это не сложнее, чем в любом другом языке. Просто берете что-нибудь вроде https://github.com/stephenmathieson/str-replace.c и пользуетесь.
                                                                                                    0
                                                                                                    Неа, в том-то и дело, что «в любом другом языке» (ну, не в любом, конечно, но в подавляющем большинстве используемых ныне) эта типовая задача, и куча других типовых задач решаются стандартными библиотеками. А программист на С вынужден или писать велосипед или искать чужие велосипеды, к тому же тратить время на выяснение, можно ли чужому велосипеду доверять.
                                                                                                      +1
                                                                                                      Ну, блин. Доверять чему-то придется. На стадии прототипа или учебной задачи можно доверять вообще всему, а нервничать о производительности/корректности опосля.

                                                                                                      У меня вот недоверие к пресловутым стандартным библиотекам. Покажите мне, как на этих самых языках с библиотеками решить весьма тривиальную задачу — декомпозиция/нормализация utf-8 строки с выхлопом опять же в utf-8 — чтобы идентично работало, например, в java, c++, as3, js. Т. е. чтобы строки на естественном языке, обработанные в совершенно разных средах, можно было корректно сравнивать, считать хеши от них и тд.
                                                                                                        0
                                                                                                        > чтобы идентично работало, например, в java, c++, as3, js
                                                                                                        Это ж задача совсем другого плана. Примерно как подружить между собой весь мир, и чтобы никто не воевал :) В случае одной платформы стандартным библиотекам всё-таки больше доверия, т.к. они потому и стандартные, что кто-то ответственный, наверняка понимающий, умный, справедливый, мудрый (надеюсь, ребята из Комитетов стандартизации меня сейчас читают) их одобрил.
                                                                                                          0
                                                                                                          Дак нет, того же плана :) Того плана, что даже библиотеки для работы со строками довольно унылые, и в случае любого чиха приходится садиться на велосипед. Того плана, что нет общего стандарта ни на эти вот самые строки, ни на функционал библиотек — покамест все отдано на реализацию саппортерам конкретных языков.

                                                                                                          Ладно, сие не есть проблема, реально требующая обсуждения :)
                                                                                                            +1
                                                                                                            Ладно, сие не есть проблема, реально требующая обсуждения :)
                                                                                                            В том-то и дело, что это — и есть центральная проблема, которую мы тут обсуждаем.

                                                                                                            Дело в том, что замена в строке на подстроки на подстроку другого размера — это не сложная, а очень сложная задача. Как любая банальность эта — тоже обсосана Джоелем.

                                                                                                            Соответственно все языки делятся на два класса:
                                                                                                            1. Языки в которых очевидно, что это — сложная задача (C — один из них).
                                                                                                            2. Языки в которых прилагаются неимоверные усилия к тому, чтобы сделать вид что это — простая задача.

                                                                                                            Так вот: человека, который, этого не понимает, по большому счёту, программистом — назвать нельзя. Ибо он не понимает по какому минному полю он ходит. Он может быть художником, архитектором или даже говнокодером, но это — не программист! У него нет в руках миноискателя, который «звенит» возле проблемых участков кода! Он может реагировать на разрывабщиеся под ногами мины — но только наступая на них.

                                                                                                            Означает ли это, что C — обязателен в программе обучения? Нет, конечно, какой-нибудь Pascal демонстрирует это не менее выпукло. А вот в «большинстве используемых ныне» языков — это неочевидно. И это — большая трагедия.

                                                                                                            Человек, который этого не осознал и не прочувствовал может сколь угодно хорошо рассуждать на тему всяких алгоритмов, но у него нет понимания того, что с этими чёртовыми O(N), O(N log N) и O(N2) он всречается постоянно, на каждом шагу, при написании почти любой строчки кода!

                                                                                                            А без этого понимания — нет хорошего программиста.
                                                                                                      0
                                                                                                      Начинающий программист должен писать велосипеды для самообучения.

                                                                                                      Понятно, что в продакшене нужно использовать готовые проверенные решения, но нет ничего хуже использования готовых решений без понимания, как они устроены изнутри.
                                                                                                    0
                                                                                                    Так на любом языке для «Hello, World!» нужно программный код писать

                                                                                                    Не, человек сказал «кучу неочевидных вещей», а не «код».

                                                                                                    Например, чтобы написать HW на Quick Basic, нужно ввести ровно одну строку:
                                                                                                    PRINT «Hello world!»
                                                                                                    И все. И объяснить начинающему, что это, несложно: вот оператор вывода, вот текст, который мы выводим.

                                                                                                    Возьмем Си:
                                                                                                    #include <stdio.h>

                                                                                                    int main(){
                                                                                                    printf('Hello world!\r\n');
                                                                                                    return 0;
                                                                                                    };

                                                                                                    Здесь уже сложнее: это потом, когда ты продвинулся, ты понимаешь, что инклюд позволяет тебе связать твой код с библиотекой, но изначально, для новичка — это ненужное, вспомогательное действие. Лишнее на этом этапе обучения.
                                                                                                    Потом — зачем нам нужна «главная» функция, почему и кому она возвращает результат, почему вывод сделан вот так, и почему перевод строки выглядит вот так…

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

                                                                                                    Это я не к холивору, просто пытаюсь на пальцах показать разницу для новичков (ну, раз уж о HW речь зашла).
                                                                                                      0
                                                                                                      Выскажусь с позиции такого новичка. На первом курсе мы изучали одновременно C++ и Pascal, до этого я знал только Visual Basic на очень базовом уровне. Не было никаких проблем понять, что include нужен для подключения функции printf(), не только у меня, но и у многих других. Перевод строки в первых программах особо и не нужен, но после объяснения тоже все понятно — курсор в начало / курсор вниз. Писали void main(), главная функция — точка начала программы. У всего есть понятная причина, никаких магических конструкций, которые работают сами по себе.

                                                                                                      Да и с Паскалем была прямая аналогия: include — uses, printf — write/writeln. begin/end — {} (только слова набирать дольше и опечатки в них иногда делаешь).
                                                                                                        0
                                                                                                        до этого я знал только Visual Basic на очень базовом уровне

                                                                                                        То-есть та самая начальная подготовка уже была, о чем я и написал.

                                                                                                        но после объяснения тоже все понятно — курсор в начало / курсор вниз

                                                                                                        Я не говорил, что «перевод строки» — непонятная хрень, я говорил о другом.

                                                                                                        Писали void main(), главная функция — точка начала программы

                                                                                                        А почему у программы должна быть точка начала, почему начало в виде функции?
                                                                                                        Вот в примере на Бейсике все понятно: начался лист — началась программа. И так далее.
                                                                                                        Вы идете все по тому же полю: "это можно понять, если приложить немного усилий". Я не говорю о том, что это дико непонятная вещь; я говорю о том, что это лишнее и мешает понять суть.
                                                                                                          0
                                                                                                          начался лист — началась программа

                                                                                                          А потом в середине листа встречается объявление функции и становится очень непонятно, почему ее операторы не исполняются, ведь мы уже привыкли, что программа это лист.

                                                                                                          А почему у программы должна быть точка начала, почему начало в виде функции

                                                                                                          Потому что у всего есть начало и конец, программа разделяется на функции, начало и конец программы это главная функция. Я о том, что если есть простая причина почему надо делать какие-то действия, то это более понятно, чем пример и без действий и без объяснений, который просто почему-то работает. Мне кажется, это не лишнее, это и есть та суть, которую нужно понять — как работает программа.
                                                                                                          Впрочем, может я и не прав, никогда не обучал программированию новичков.
                                                                                                            0
                                                                                                            А потом в середине листа встречается объявление функции и становится очень непонятно, почему ее операторы не исполняются, ведь мы уже привыкли, что программа это лист.

                                                                                                            Во-первых, понятно — это отдельная поименованная область. Как текст/статья в рамке/блок в блок-схеме.

                                                                                                            Во-вторых, при обучении элементарщине user defined функции не используются, они описываются позже.

                                                                                                            В-третьих, отдельный модуль.

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

                                                                                                            А если нет никаких причин делать что-то ради того чтобы делать, еще лучше.

                                                                                                            Мне кажется, это не лишнее, это и есть та суть, которую нужно понять — как работает программа.

                                                                                                            Мы о разных стадиях говорим. Я имел дело с людьми, которые не знали совсем ничего. Такому ты объясняешь императивный принцип: вот твои действия: первое, второе, третье. Выполняются одно за одним, именно в таком порядке, никак иначе. Вот ветвление, вот цикл.
                                                                                                            Потом, потом, уже идет «вот это повторяется, мы выделим это, назовем и вызовем. Это функция/подпрограмма».
                                                                                                            Вот представьте, что вы объясняете по блок-схеме: здесь действия в чистом виде, никаких побочных объявлений, описаний, включений и пр. Чем лучше блок-схема отражается на язык, тем лучше для новичка.
                                                                                                            Или тот же непопулярный нынче алгоритмический язык/мнемокод — описывает чисто алгоритм, используя базовые конструкции и никакой побочки.
                                                                                                +9
                                                                                                Может скажу банальность, но язык программирования это прежде всего «инструмент», а как известно прежде чем с ним работать (изучать) надо знать как его держать в руках. Моё мнение, начало это Алгоритм! Надо научиться алгоритмически мыслить, строить цепочки связей (команд) и видить цель.
                                                                                                Пусть меня закидают «тапками» но моё мнение алгоритмизацию лучше начинать с Паскаля. Как учебный язык нулевого уровня ему нет равных. Сам преподаю (уже 25 лет) и вижу что мода приходит и уходит, а классика остается.
                                                                                                  –3
                                                                                                  Возможно. Вы представляете немного иной подход — начинающийся не с машины, а с алгоритмов. Но тогда, наверное, лучше взять Modula или Oberon того же Никлауса Вирта, как более прогрессивные языки.
                                                                                                    0
                                                                                                    Если все же вспомнить слова Вирта (отца Паскаля, Модулы и Оберона ;) ) когда его спросили какой язык программирования он считает наиболее подходящий для обучения, он ответил Паскаль как наиболее приближенный к человеческому :)
                                                                                                    Да согласен, для студентов что направление ИТ учить надо с классики, С потом уже все остальное, НО для первоначального (нулевого) обучения (школьники) предпочтителен Паскаль.
                                                                                                    Например, первые алгоритмические конструкции циклов (Пока/While, До/Until, Для/For) наиболее понятны именно здесь.
                                                                                                    НО опять, на вкус и цвет, все фломастеры разные, сколько людей столько и мнений :)
                                                                                                    Ваш покорный слуга основывается своём скромном мнении и опыте (25 лет пед работы ;) ) :)
                                                                                                      +2

                                                                                                      А вы пробовали учить чему-то другому? Не оберону/модуле, а, скажем, Scheme, Python?

                                                                                                        +1
                                                                                                        На Питоне пробовал.
                                                                                                        Но сразу говорю, средние и менее ученики взвыли :) Питон очень не плох для обучения, но (да опять НО ;) ) только в том случае если они понимают уже структуру алгоритма, То есть знают какому блоку (циклу или ветвлению) что принадлежит, а выделения программного блока отступами для них вообще кошмар, в Паскале, Си и прочих, программные скобки физически видны. С этого как раз и начинается практика, учу выделять блоки, что бы знали что кому принадлежит.
                                                                                                          +1
                                                                                                          Space — символы как часть синтаксиса языка была на мой взгляд очень глупой идеей. По этой причине его и не люблю.
                                                                                                            0
                                                                                                            А не пробовали ли вы объяснять, что выделение отступами логических блоков им, ученикам, прекрасно знакомо на примере многоуровневых списков, которые они легко, не задумываясь, клепают в своих рефератах/курсовых:
                                                                                                            А)
                                                                                                            Б)
                                                                                                            С)
                                                                                                            1.
                                                                                                            2.
                                                                                                                 -
                                                                                                                 -
                                                                                                             3.

                                                                                                            И вообще, какими теориями и приемами, изобретенными великими педагогами и методистами, преподавателями компьютерной грамотности (Ушинский, Ершов, Макаренко и др.) Вы пользовались в работе?
                                                                                                            Отступы в списке выше нормально не отображаются, но идея должна быть ясна...

                                                                                                              0
                                                                                                              Если бы мне в школе про списки начали говорить, я бы не понял еще больше.
                                                                                                              — Отступы в списке можно сделать любого уровня, а не ровно 4 пробела, длина отступов на смысл не влияет.
                                                                                                              — Отступы делаются для визуального разделения, а не для логического. Для логического как раз используются цифры и буквы.
                                                                                                              — В списках нет циклов.

                                                                                                              Я питон почти не знаю, мы в школе VB изучали, но когда начало и конец блока чем-то обозначены это более понятно.
                                                                                                                0
                                                                                                                Не все с вами согласятся. Если бы мне в школе преподавали питон, я бы сразу понял эту абстракцию.
                                                                                                                — В питоне тоже не нужно делать ровно 4 пробела, можно и табуляцией это делать.
                                                                                                                — Отступы делаются для выделения логического разделения, иначе список может читаться так же как постом выше, где парсер сожрал список — тружно понять где какой уровень и что за чем идет.
                                                                                                                — Вы не представляете циклы в списках, а я представляю. Если список является пошаговым набором инструкций, то цикл в нем может быть реализован в таком виде: «Шаги А.4.1 — А.4.8 повторять до получения результата, но не более 8 раз».

                                                                                                                В школе изучал QBasic и мне никто не говорил, что надо делать отступы — я их сам машинально начал делать для выделения логических блоков и повышения читаемости кода.
                                                                                                                  0

                                                                                                                  "— В списках нет циклов."


                                                                                                                  Если использовать ссылки на пункты то циклы появятся: "п. 3567. Заявителю при подаче заявления… повторить последовательно, в порядке возрастания номеров пунктов, 567886543 раз п. 700-3576"; появятся условия — "п. 766544321. ЕСЛИ заявитель соответствует пп. 788765 п. 765 раздела А Критериев, заявитель [исполнитель алгоритма] обязан произвести процедуру сертификации (см. п. 000-8765325799ф, раздела 765-87-у-7654н-123н, приложения 124-987-543-НКАРОЛ- 14986- 14Б:6Э Порядка обязательной сертификации заявителей...), если заявитель не соответствует ...".
                                                                                                                  На таких списках можно даже ассемблер разъяснить, объяснив, что метка в ассемблере — это аналог такой вот ссылки на нужное место ф формальном документе или списке из этого документа.

                                                                                                                    0
                                                                                                                    Это не цикл, а goto. С пониманием goto проблем обычно и нет. А сама инструкция «перейти наверх на пункт такой-то» — это и есть понятное обозначение конца блока, о чем я и говорил.
                                                                                                                    Цикл со счетчиком в виде списка на бумаге сделать не получится. Можно записать оператор словами, но если не знать как он работает, то будет непонятно.

                                                                                                                    Скрытый текст
                                                                                                                    Мне например сначала казалось, что словом for задается диапазон — «для» значений переменной i от A до B делать то-то (то есть как будто if (i >= A && i <= B)). При чтении обычного списка с листа оно примерно так и воспринимается, потому что это декларативное описание.
                                                                                                                      0
                                                                                                                      Для вас цикл — это не goto, но тут я с вами не согласен.
                                                                                                                      Я бы сказал, что пусть первым в меня кинет камень тот, кто скажет что с помощью goto нельзя организовать цикл.
                                                                                                                      P.S. И цикл со счетчиком на бумаге пишется на раз.
                                                                                                                        0
                                                                                                                        Я не говорил, что нельзя. Я сказал, что это не одно и то же, и воспринимаются они по-разному.
                                                                                                                        Впрочем, это уже оффтоп, я изначально говорил о том, что новичкам понятнее, когда границы блока явно обозначены, а не зависят от количества невидимых символов.
                                                                                                                      0
                                                                                                                      Вы говорите больше о программировании на списках, а я говорю о том, что списки вполне нормально соотносятся с логикой визуальных отступов.
                                                                                                                      Не путайте теплое с мягким.
                                                                                                                  0
                                                                                                                  Отступы в списке выше нормально не отображаются
                                                                                                                  Вот как бы и я о чём.

                                                                                                                    0
                                                                                                                    От отступов в Питоне поначалу действительно колбасит, но довольно быстро привыкаешь и даже начинаешь получать удовольствие. У меня поначалу больше проблем вызывало то, что зачастую непонятно, где ты используешь ссылку на объект, а где — копию.
                                                                                                                    0
                                                                                                                    Милый вы мой :) что вы говорите, 7-8 и даже 9 класс не то что нормальные рефераты сделать и оформить не могут, а об многоуровневых списках вообще молчу :)
                                                                                                                    Кстати пример не очень удачный. Как раз Паскаль в этом отношении с его Begin и end наиболее понятен.

                                                                                                                    По теории педагогики ;) это не ко мне :) пед образования не имею :) зато в активе военное (Можайка) и инженерное (программист) :)
                                                                                                                    А прием очень простой, ты должен объяснить так что бы любой человек смог понять :) ну и конечно армейский принцип «делай как я» :)
                                                                                                                      0
                                                                                                                      Ну я всё же не про школьников писал, а про студентов или образованных самоучек (естественные или инженерные направления). Школьники или 'нулевые' ученики — вообще отдельный разговор, я, например, не очень знаю, как учить человека с полного нуля. На мой взгляд всё же должна сначала стихийно накопиться некая критическая масса знаний, чтобы было общее представление. И у школьников программирование обычно как обязаловка, мало связанная с их желаниями.
                                                                                                                        0

                                                                                                                        Армейский принцип «делай как я»:
                                                                                                                        Познакомьте из с TeX, LaTex, потом с OMdoc — только осторожно, не залезая в дебри — для этого уже есть книжка "Сверстай диплом красиво: LaTeX за три дня" (http://www.stolyarov.info/books/latex3days). Тем кто не одолеет его — покажите руководства (прямо ткните в страницы по текстовым стилям) по OOWriter, онлайн документацию по MS Word.

                                                                                                                          0

                                                                                                                          Text Encoding Initiative (TEI) — с ним можно познакомить гуманитариев — это их специализированный инструмент.

                                                                                                                        0
                                                                                                                        Разве на Питоне нельзя, при желании, писать, как на Паскале?
                                                                                                                        (Надо ли на Питоне писать, как на Паскале — другой вопрос.)
                                                                                                                          0
                                                                                                                          Это как? :)
                                                                                                                            0
                                                                                                                            На Питоне нельзя писать как на Паскале. Вот на C — можно, а на Питоне — нет. У него просто нет базовых структур данных со сложность O(1).

                                                                                                                            Это как заниматься гимнастикой на батуте: тренированный атлет это сделать может, но новичка этому учить — боже упаси. Лучше уж твёрдый пол и устройчиво стоящие на нём снаряды…
                                                                                                                              0
                                                                                                                              > У него просто нет базовых структур данных со сложность O(1).
                                                                                                                              Эмм… щито?
                                                                                                                                0
                                                                                                                                Нет вообще ничего, что работало бы за константное время. Два числа нельзя за константное время сложить! Или присвоить!

                                                                                                                                Потому что всё-на-свете хранится в ассоциативных массивах, которые расширяются по мере необходимости. А числа в BigNumы превращаются, если нужно. Это удобно, спору нет — но это же и обозначает, что вы никогда ни в чём можете быть уверены.

                                                                                                                                Для человека, которые уже имеет представление об алгоритмах — это не проблема, но когда вы пытаетесь рассказать о том что такое «сложность вычислений» и «потребление памяти» — это ужасно. У человека возникает чёткое ощущение, что преподаватель «чего-то недоговаривает».
                                                                                                                                  0
                                                                                                                                  Признаться, всё ещё не улавливаю сути вашего педагогического посыла. Вот, например, человек пишет о внутреннем представлении целых чисел в Питоне: http://www.laurentluce.com/posts/python-integer-objects-implementation/

                                                                                                                                  Т. е., может так получиться, что я сложил два числа, и результат сохранится в уже выделенном блоке памяти. А может так, что интерпретатор должен будет выделять новый блок, и это займёт больше времени — вы об этом?
                                                                                                                                    0
                                                                                                                                    Не только об этом. Там в совокупности много чего набирается: обращение к переменным идёт через хеш (у нас же интерпретируемый язык, причём, в отличие от древноего BASIC'а переменных не фиксированное число, а сколько угодно), для части переменных есть отдельные оптимизации и т.д. и т.п. Простейший пример:

                                                                                                                                    $ python3
                                                                                                                                    Python 3.4.3 (default, Oct 14 2015, 20:28:29) 
                                                                                                                                    [GCC 4.8.4] on linux
                                                                                                                                    Type "help", "copyright", "credits" or "license" for more information.
                                                                                                                                    >>> a = 100
                                                                                                                                    >>> b = 100
                                                                                                                                    >>> a is b
                                                                                                                                    True
                                                                                                                                    >>> a = 1000
                                                                                                                                    >>> b = 1000
                                                                                                                                    >>> a is b
                                                                                                                                    False
                                                                                                                                    

                                                                                                                                    Как? Почему? За что?

                                                                                                                                    Туева хуча «протекающих» абстракций! Да, обычно они вас не беспокоят, а если вдруг что-то случится — вы знаете где и что искать. Но это вы — человек с опытом работы и знающий где что происходит.

                                                                                                                                    А если человек только учится? И только лишь пытается разобраться в том, как работает инструмент, который ему дали?

                                                                                                                                    Скорее всего решит «это магия, иногда она срабатывает, иногда нет, что ж тут такого»… а что будет, если потом в реальной работе магия не сработает?
                                                                                                                                      0
                                                                                                                                      Если развить вашу мысль, разве не получится, что магия вообще везде, и иногда работает так, а иногда — иначе? Сложить два числа хоть на Си, хоть на Паскале, хоть на Ассемблере за константное время? Ну разве что в ОС жёсткого реального времени или на голом железе (очень распространённые среды для обучения начинающих программистов, ага). А вот от такой, к примеру, магии и вообще ничего не спасёт: http://stackoverflow.com/questions/11227809/why-is-it-faster-to-process-a-sorted-array-than-an-unsorted-array
                                                                                                                                        0
                                                                                                                                        > Сложить два числа хоть на Си, хоть на Паскале, хоть на Ассемблере за константное время?
                                                                                                                                        Сложение, это же не обработка строки. В любой ОС это будет константное значение. Процессор не переключит контекст, пока он выполняет по сути атомарную операцию сложения.
                                                                                                                                        > А вот от такой, к примеру, магии и вообще ничего не спасёт
                                                                                                                                        Это ж не магия, а дюже умный современный процессор
                                                                                                                                          0
                                                                                                                                          Процессор не переключит контекст, пока он выполняет по сути атомарную операцию сложения.
                                                                                                                                          А кто его остановит? Вопрос в частоте, конечно.
                                                                                                                                            0
                                                                                                                                            > Процессор не переключит контекст
                                                                                                                                            Пацаны, написавшие InterlockedIncrement и прочие наборы атомарных арифметических функций, опять не знали?
                                                                                                                                            > Это ж не магия, а дюже умный современный процессор
                                                                                                                                            И? В чём принципиальная разница, кто виноват и что делать?
                                                                                                                                              0
                                                                                                                                              И? В чём принципиальная разница, кто виноват и что делать?
                                                                                                                                              Принципиальная разница в том, что «магия» — это что-то непознанное и постижимое, а процессор — это что-то, сделанное людьми и людьми же обслуживаемое.

                                                                                                                                              Если уж совсем без магии хочется — возьмите эмулятор Atari 2600. Отличная вещь: без вских OS, но главное — видопамять на одну строку и отсутствие прерываний. То есть вам нужно за время показа одной строки выполнить определённый кусочек программы, который породит вам следующую строку. С точностью до такта!

                                                                                                                                              И никакой магии.
                                                                                                                                                0
                                                                                                                                                Интерпретатор Питона — это что-то, сделанное людьми и людьми же обслуживаемое.
                                                                                                                                                0
                                                                                                                                                > Пацаны, написавшие InterlockedIncrement
                                                                                                                                                Пацаны знали, но писали его не для тех данных, которые целиком вмещаются в регистр процессора. По крайней мере, если речь идет об x86.

                                                                                                                                                > И? В чём принципиальная разница, кто виноват и что делать?
                                                                                                                                                Принципиальная разница в том, что поведение процессора логично и ожидаемо.
                                                                                                                                                  0
                                                                                                                                                  > которые целиком вмещаются в регистр процессора
                                                                                                                                                  Лолшто? 32-битный аргумент функции InterlockedIncrement не вмещается целиком в регистр процессора? При том что для х86 эти регистры стали 32-битными начиная, кажется, с i386?
                                                                                                                                                    0
                                                                                                                                                    Зря лолштокаете. В самой документации по Interlocked-функциям написано, что арифметические операции с 32-битными числами на 32-битных ОС являются атомарными :)
                                                                                                                                                      0
                                                                                                                                                      Ссылку, сестра, ссылку!
                                                                                                                                                        0
                                                                                                                                                        Ну вот, например:
                                                                                                                                                        https://msdn.microsoft.com/en-us/library/ms684122.aspx
                                                                                                                                                        А что, у вас есть сомнения, что 32-битный процессор в состоянии атомарно обработать 32-битное число? Ему обязательно дробить на микрооперации действие, которое делается сумматором из полусотни вентилей?
                                                                                                                                                          0
                                                                                                                                                          Ему обязательно дробить на микрооперации действие, которое делается сумматором из полусотни вентилей?
                                                                                                                                                          Нет, конечно. Но ему обязательно нужно будет разбить одну инструкцию как минимум на три: чтение из памяти, модификация данных и запись. И тут полусотней вентилей никак не обойтись: сколько блоков участвует в «походе в оперативную память» на современном CPU даже представить себе страшно!
                                                                                                                                                            0
                                                                                                                                                            Слуште, ну не надо так пугать меня на старости лет! Вы сами-то пробовали читать, что там написано? «Приложения должны синхронизировать доступ к переменным… Приложения должны обеспечивать атомарность операций...» И далее: «Простые операции чтения и записи на выровненные 32-битные переменные атомарны, т. е. не возникнет ситуации, когда только часть переменной была обновлена, все биты обновляются атомарно. Однако синхронизация доступа не гарантируется. (...)»

                                                                                                                                                            > А что, у вас есть сомнения…
                                                                                                                                                            Не сомнения у меня есть, а твёрдая уверенность. Вот вам пример из Рихтера. Инкрементируем переменную в одном потоке:

                                                                                                                                                            MOV EAX, [g_x]; значение из g_x помещается в регистр
                                                                                                                                                            INC EAX; значение регистра увеличивается на 1
                                                                                                                                                            MOV [g_x], EAX; значение из регистра помещается обратно в g_x

                                                                                                                                                            В двух потоках по-очереди:

                                                                                                                                                            MOV EAX, [g_x]; поток 1 в регистр помещается 0
                                                                                                                                                            INC EAX; поток 1. значение регистра увеличивается на 1
                                                                                                                                                            MOV [g_x], EAX; поток 1. значение 1 помещается в g_x

                                                                                                                                                            MOV EAX, [g_x]; поток 2. в регистр помещается 1
                                                                                                                                                            INC EAX; поток 2. значение регистра увеличивается до 2
                                                                                                                                                            MOV [g_x], EAX; поток 2. значение 2 помещается в g_x

                                                                                                                                                            В двух потоках параллельно:

                                                                                                                                                            MOV EAX, [g_x]; поток 1. в регистр помещается 0
                                                                                                                                                            INC EAX; поток 1. значение регистра увеличивается на 1

                                                                                                                                                            MOV EAX, [g_x]; поток 2 в регистр помещается 0
                                                                                                                                                            INC EAX; поток 2. значение регистра увеличивается на 1
                                                                                                                                                            MOV [g_x], EAX; поток 2. значение 1 помещается в g_x

                                                                                                                                                            MOV [g_x], EAX; поток 1. значение 1 помещается в g_x

                                                                                                                                                            Это лишь один из многих вариантов, ассемблерные инструкции могут быть перетасованы и любым другим образом. Ну вы чего, в самом деле…

                                                                                                                                                              0
                                                                                                                                                              Не нужно ничего перетасовывать даже. Банальный «inc [g_x]» не гарантирует атомарности если не используется префикс LOCK". А какой, собственно, в этом префиксе был бы смысл, если бы всё и так всегда атомарно работало бы?

                                                                                                                                                              Кстати скорость работы инструкций «inc [g_x]» и «lock inc [g_x]» очень заметно отличается. В несколько раз.
                                                                                                                                                                0
                                                                                                                                                                Ага, я даже пытался замерить это время: из нескольких потоков инкрементил одну и ту же области памяти и считал сумму за секунду.

                                                                                                                                                                У меня получилось 175M инкрементов в секунду при одном потоке и всего 47M при 2 и большем числе потоков. Получается, что при инкременте в 4 потока каждый из потоков выполняет инкремент всего 12M раз. Т.е. когда к памяти имеет доступ один поток, получается около 23 тактов на операцию, а когда несколько (например, 4), то значение увеличивается до 300-350 тактов. Для сравнения: простой инкремент — 1-2 такта.
                                                                                                                                                      0
                                                                                                                                                      Корни проблем неправильного понимания атомарности растут со старых архитектур. Когда у нас процессор (ядро) был один, то да, любая операция, которая выражалась одной ассемблерной командой, была атомарна. Потому что никто параллельно не мог работать с той же областью памяти. А вот действия, состоящие из несколько команд, могли быть прерваны посередине.

                                                                                                                                                      В случае многопроцессорных систем для обеспечения атомарности стало необходимо также блокировать совместный доступ к памяти. Поэтому Interlocked команды используются даже если аргумент влезает в регистр процессора.
                                                                                                                                                        +1
                                                                                                                                                        Корни неправильного понимания атомарности растут из неправильного понимания атомарности. Да, когда у вас система достаточно простая, то всё работает так, как вы описываете. На том же Atari 2600 просто некому «испортить малину». Но уже на первом IBM PC (а это, так, на минуточку, 81й год) есть DMA и 8087й сопроцессор, который, на минуточку, ходит в память параллельно и независимо от основного процессора! И там уже можно испытать все «прелести» неатомарности операции inc и нарушения правил алиасинга (а вы как думали — откуда они в C/C++ взялись? вот именно отсюда… не конкретно от 8087го, конечно, а в принципе — от архитектур где CPU и FPU независимо ходят в память).
                                                                                                                                                          0
                                                                                                                                                          Даже i8080 (1974) уже имел в чипсете DMA.
                                                                                                                                                            0
                                                                                                                                                            Ну не преувеличивайте :) Ни DMA, ни сопроцессор, не смогут захватить шину независимо от основного процессора у IBM PC. Это «мнимый» параллелизм. Только тогда, когда он её сам готов отдать. В случае DMA — даст контроллеру команду на загрузку данных, в случае сопроцессора — когда он сам выберет из очереди инструкцию Fxxxx. Аппаратные прерывания? Тоже нет, у 8086 перед переходом по вектору прерывания сначала целиком завершается текущая инструкция.
                                                                                                                                                            Опять же таки, что касается атомарности, если рассматривать многопоточную работу, да еще когда несколько потоков лезут к общим данным в оперативной памяти, то естественно, вы правы. Но сама операция сложения действительно атомарна :) Более того, если вы попробуете сложить два целых числа в простом примере, вы увидите, что компилятор вам сделает сложение регистр-регистр, а не будет тянуть их из памяти. Так что не всё так сложно, как вы пишите.
                                                                                                                                                              0
                                                                                                                                                              Только тогда, когда он её сам готов отдать.
                                                                                                                                                              Проблема в том, что он вполне себе «готов её отдать» посреди одной инструкции — а иначе префикс LOCK смысла бы не имел. А он, напоминаю, в 8086 уже был.

                                                                                                                                                              В случае DMA — даст контроллеру команду на загрузку данных, в случае сопроцессора — когда он сам выберет из очереди инструкцию Fxxxx.
                                                                                                                                                              Записать в память сопроцессор осуществляет не тогда, когда он «выберет из очереди инструкцию», а когда у него данные появятся, что, опять-таки может произойти непонятно когда. Опять-таки: если бы было не так, то команда WAIT была бы не нужна — а она тоже в 8086м появилась.

                                                                                                                                                              Описанную вами «сферическую» атомарность невозможно увидеть и ощутить без обращения в память, а как только мы туда начинаем обращаться — у нас начинаются гонки. И, собственно, тот факт что средства для борьбы с ними появились в 8086м процессоре — это очень такой толстый намёк.

                                                                                                                                                              Не понимаю с чем вы спорите и зачем.
                                                                                                                                                                0
                                                                                                                                                                > если бы было не так, то команда WAIT была бы не нужна
                                                                                                                                                                Команда WAIT же не для того, чтобы гарантировать «атомарность» работы операций процессора. Она для того, чтобы корректно обработать результат работы FPU.
                                                                                                                                                                > Не понимаю с чем вы спорите и зачем.
                                                                                                                                                                Я ни с чем оне спорю, я просто объясняю свою позицию, что неоднозначности с синхронизацией в работе процессора не существенны для обучения на императивных языках, где действительно время и порядок выполнения операций прогнозируемы. С ними можно столкнуться в специальных случаях, а не в работе учебных приложений. А как работает IBM PC, я, в общем-то, знаю. Примерно на таком уровне:
                                                                                                                                                                http://zx-pk.ru/threads/22102-pk-poisk-adapter-som-portov.html
                                                                                                                                                                  0
                                                                                                                                                                  Команда WAIT же не для того, чтобы гарантировать «атомарность» работы операций процессора. Она для того, чтобы корректно обработать результат работы FPU.
                                                                                                                                                                  Команда WAIT нужна для того, чтобы получить сигнал «всё, я отстрелялся». Так как 8087 сам, независимо ходит в память, то она нужна, в частности, для того, чтобы «иметь право» обратится к памяти, в которую пишет FPU. В частности если вы организуете целочисленные вычисления на FPU (это не дикость: Turbo Pascal имел ажно специальный тип Comp для этих целей), а потом начинаете работать с данными из CPU, то вам нужно использовать либо LOCK, либо WAIT, иначе атомарности может и не получиться.

                                                                                                                                                                  Я ни с чем оне спорю, я просто объясняю свою позицию, что неоднозначности с синхронизацией в работе процессора не существенны для обучения на императивных языках, где действительно время и порядок выполнения операций прогнозируемы.
                                                                                                                                                                  На однопроцессорной системе, в случае когда не используется сопроцессор и так далее? Да, наверное. Но как-то в ваших предыдущих выступлениях я этого не уловил. Наоборот — там были странные рассуждения про «атомарные арифметические операции» и прочее. Которые нифига не атомарны (если не прилагать специальных усилий) даже при использовании DOS'а. Уже в IBM PC они не были атомарными — и на это легко можно было нарваться если прерывания перехватывать (да, да, в те времена это было нормальным и естественным), 8087й процессор или DMA использовать.

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

                                                                                                                                                                  Современные компьютеры выполняют миллиарды операций в секунду (а скоро могут и до триллионов добраться) — при таких масштабах оказывается, что вещи, случающиеся «очень редко», происходят, скажем, раз в минуту. Вам будет приятно пользоваться программой, которая раз в минуту падает? Вот об этом и речь.
                                                                                                                                                                    0
                                                                                                                                                                    Касаемо 8086: да, прерывание может произойти во время выполнения команды: процессор может считать из памяти операнд и начать выполнять операцию, но не успеть записать результат. С точки зрения программиста это будет выглядеть как если бы команда не выполнялась вообще.

                                                                                                                                                                    DMA и сопроцессор — отдельные темы. Скорее всего, вам никогда не понадобится лезть в область памяти в тот момент, когда с ней работает сопроцессор или гадит DMA.
                                                                                                                                                                      0
                                                                                                                                                                      Скорее всего, вам никогда не понадобится лезть в область памяти в тот момент, когда с ней работает сопроцессор или гадит DMA.
                                                                                                                                                                      Про DMA — не знаю, наверное. А с сопроцессором как раз это постоянная история. Вычислили вы что-нибудь этакое (размер какого-нибудь буфера) с использованием плавучки (типичный пример: «время ожидания» и «частота опроса» заданные как числа с плавающей точкой), а потом — крутитесь в цикле обработки. Забудете WAIT — получите джиттер в лучшем случае (это если вы потеряете только один «цикл обработки», если получите просто «мусор» в этой памяти, то программа просто упадёт, скорее всего).

                                                                                                                                                                      Тут, правда, вам ещё и прерывания будут подмешаны в кучу… но, в общем, на PC («настоящей PC», модель 5150) это бола та ещё головная боль.

                                                                                                                                                                      Интеграция сопроцессора в 80486й (и все последующие модели) — одна из вещей, где количество абстракций упало со временем, а не возросло… правда тот же 80486й добавил кеш, так что в целом — «протечек» стало больше… но конкретно «пляски с бубном вокруг сопроцессора» 80486й (и 68040 у «конкурентов» — что интересно тоже одновременно добавивший кеш и сопроцессор на кристал) — оставили в прошлом.
                                                                                                                                                                        0
                                                                                                                                                                        Обычно заботу о вызове WAIT берёт на себя компилятор.

                                                                                                                                                                        Пикантная ситуация возможна, опять же, при прерываниях, если обработчик прерывания хочет прочитать область памяти, куда может писать сопроцессор. Обработчик прерываний не имеет права вызвать WAIT.
                                                                                                                                                                          0
                                                                                                                                                                          Обычно заботу о вызове WAIT берёт на себя компилятор.
                                                                                                                                                                          Если не используется каламбур типизации.

                                                                                                                                                                          Обработчик прерываний не имеет права вызвать WAIT.
                                                                                                                                                                          Кто ему вдруг запретит? Я боюсь вы путаете запрет, который налагают многие операционки, (для упрощения написания x87 эмуляторов) с ограничениями железа.

                                                                                                                                                                          Впрочем всё это ушло уже ооочень далеко от вопроса о том, как изучать языки программирования.
                                                                                                                                                                      0
                                                                                                                                                                      > На однопроцессорной системе, в случае когда не используется сопроцессор и так далее?
                                                                                                                                                                      На любой. Если вы сами ничего специально для этого не сделаете, вы не получите непрогнозируемый результат. Ни на 8086, ни даже сейчас, т.к. ОС контексты процессов тоже не переключает произвольным образом, а делает это по планировщику.
                                                                                                                                                                      > Вам будет приятно пользоваться программой, которая раз в минуту падает?
                                                                                                                                                                      Я, честно говоря, не понял смысла этого замечания. Я вроде бы нигде не писал, что «долой ГМО и синхронизацию потоков в многопоточном приложении». Если был нетрезв и написал, дайте цитату.
                                                                                                                                                                  0
                                                                                                                                                                  Да