По какому учебнику изучать C++, чтобы работать в современном проекте?
Учебник нужен не столько мне, сколько моему коллеге, который ещё новичок не выше intern'а.
Хотя и мне тоже не помешает почитать. Хоть я и занимаюсь программированием уже несколько лет, за все это время я не прочитал ни одной книги. Мне "авторитетные" люди в свое время сказали, что все книги - дно, а гугл рулит. Я так и сделал, книг не читал, но хорошо научился гуглить и читать статьи и код.
Но сейчас я понимаю, что дно - это как раз статьи. Причем не какие-то конкретные, а любые, и все вместе взятые.
Вводим в гугле, например, "c++ map".
Открываем статью. Нам сразу суют кусок кода. Далее следуют длинные и не очень читаемые объяснения к каждой строчке этого кода. Где-то среди этой простыни затерялась единственная умная мысль, про то, что map сам сортирует значения по ключам. Даже нарочно не заметишь, и не запомнишь. Больше умных мыслей нет. Зато в эту же статью зачем-то засунули multimap. К нему опять код и опять тупые пояснения. И весь код ужасно неряшлив и кишит устаревшими конструкциями, которые в C++11 можно записать покороче. А multimap засунут не в одну, а как минимум в две статьи из топа в поиске.
Ок. Открываем статью на сайте ru.cppreference.com - действительно умном сайте, который позиционирует себя как документацию к C++. Здесь полная противоположность - с первых предложений рассказана сама суть контейнера. Ключи, оказывается, не только сортируются, но и поддерживается их уникальность. Указана алгоритмическая сложность операций. Указан алгоритм, который используется внутри std::map.
Это уже лучше. Такую статью можно использовать хотя бы для повторения знаний при работе над какими-то задачами.
Но для первичного обучения она тоже не подходит. Слишком коротко, и термины такие, которые непосвященный не сможет правильно понять: "std::map - отсортированный контейнер " - что значит отсортированный? Что в нем отсортировано? В нем же еще нет данных...
Вывод из всего этого можно сделать довольно банальный: для первичного обучения - книги, для повторения при работе - нормальные статьи и книги.
Причем, для первичного обучения важно, чтобы книги были на русском языке.
И еще один важный момент. В современном C++ давно уже недостаточно STL. В любом серьезном проекте доступна библиотека Boost. А по ней, например по boost::multi_index, "этих ваших" статей нет ВООБЩЕ. Тут тоже нужны книги.
Нужна книга или книги, которые годятся для обучения, но предоставляют серьезный подход.
Читая книги, невозможно научиться ездить на автомобиле, даже если научишься рассчитывать октановое число.
Поэтому все верно говорят - начинающему нужно много практики. Просто писать код, который работает. Гугл и статьи помогают быстро создать программу, которая в принципе запустится.
Так можно наработать каркас знаний, которые ты не просто слышал, а которые точно работают и ты знаешь как.
Книги - можно читать парралельно. Но лучше начать чуть позже - с багажом практики. Тогда читая книгу ты будешь понимать о чем идет речь, дополнять теорию и навешивать свой каркас более глубоким пониманием.
Если взять по аналогии английский, то для того, чтобы научиться говорить, не нужно годами читать учебники по грамматике. Нужно взять словарь (справочник с++), простой разговорник (статьи с примерами кода) и писать код (пытаться общаться, смотреть мультики/фильмы/подкасты). Так можно сразу понимать и говорить.
А учебники можно уже позже, чтобы углублять свои знания.
Так можно наработать каркас знаний, которые ты не просто слышал, а которые точно работают и ты знаешь как.
Видимо у тебя удачный склад ума изначально. А бывает, что у человека не развито абстрактное мышление. Он может охотно изучать названия классов, функций, такие тезисы как "данная функция появилась в C++ xx версии", но не иметь интереса к принципам, паттернам, общей сути изучаемого. Картину он видит по частям, а целиком увидеть не может. Также нет интереса к математике и алгоритмам, потому что ему это кажется оторванным от реальной жизни.
Так вот, стоит ли вообще из такого человека делать программиста или его интерес к программированию просто считать ложным, это большой вопрос.
Но точно известно то, что все обучение должно быть ориентировано на развитие абстрактного мышления. И давать ему нужно то, чего он сам бы никогда не стал понимать и запоминать. Легко не будет, это как любая тренировка. А вот если он будет просто писать код, как самому заблагорассудится, то получится малоценный говнокодер уровня интерна, даже не джуна. Ну, зато он освоит реально много разнообразных инструментов и то, что он таки будет знать, он будет знать детальнее чем другие.
Но точно известно то, что все обучение должно быть ориентировано на развитие абстрактного мышления.
Точно известно, что образ мышления развивается при попытке мыслить нужным образом. А это делается исключительно на практике.
Чтобы развить математическое мышление, нужно не читать книжки по математике, а решать математические задачки. Чтобы развить художественный взгляд, нужно не читать книжки по рисованию, а много рисовать.
Чтобы развить программиста - нужно программировать.
"будет просто писать код, как самому заблагорассудится, то получится малоценный говнокодер уровня интерна, даже не джуна"
Говнокодер - это не плохо. Это уже программист. А качество кода нарабатывается практикой и книжками. Но уже после того, как человек хоть что-то пишет.
Saboteur, Программировать нужно тоже нужным образом, а не "просто писать код" (c). Само по себе ничто не развивается так, как надо.
Говнокодер - это плохо. Он же не у себя дома говнокодит. Говнокодить у себя дома ему не интересно, по крайней мере в странах с невысоким уровнем жизни. Он будет лезть в реальные проекты, а в моем случае он уже там.
Да, он что-то пишет, и за то что он стал что-то писать ему уже повысили з\п в свое время. Теперь это время прошло. И теперь быть им стало плохо.
beem7, Не книжки превращают говнокодера в программиста.
Это больше философский вопрос - либо человек изначально интеллектуален и эрудирован и ищет возможноси себя развить, либо он работает как может, то есть говнокодит без попыток что-то улучшить в себе.
Оба варианта имеют свое право на существование.
И опять таки, непонятно что именно вы вкладываете в слово "говнокод". Если он пишет программу, она РАБОТАЕТ, ему платят за это деньги - значит заказчика устраивает.
beem7, я вообще не разработчик =)
Но мне не нравится максимализм и фанатичность.
Просто люди часто используют перегибают палку.
* Используют и понимают слово "говнокод" совершенно некорректно.
* Дрочат на "мегакрасивый код", тратя деньги заказчика на ненужную заранее оптимизацию, при этом через год этот код все равно будет выглядеть говнокодом (если разработчик не стоит на месте)
* Ставят код превыше продукта.
Развиваться нужно, но те, кто считают что всегда пишут крутой код или должны писать сразу крутой код в начале карьеры - видимо очень плохо представляют себе необходимый объем знаний.
Я сталкиваюсь со многими моментами интеграции разных компонентов, которые пишут разные команды. И очень часто вижу, что каждая из команд вылизывает свой код, а потом оказывается в своей интеграции они не договорились о достаточно важных вещах. А отлизанный код оказывается меняьт уже не хочется и сложно, а вместо простой реализации притянуто за уши десяток библиотек, и проблема решается моим скриптиком на баше, который пусть и костыль, но работает надежно и сделать его стоит дешевле, чем оплатить еще один спринт двум командам.
Поэтому считаю что к моему мнению стоит прислушиваться и помнить, что лучшее - враг хорошего.
те, кто считают что всегда пишут крутой код ... видимо очень плохо представляют себе необходимый объем знаний.
Несомненно.
те, кто считают что ... должны писать сразу крутой код в начале карьеры
Да это вроде не обязательно. Некоторым по финансовым причинам вроде даже выгоднее за полгода стать джуном, чем за год миддлом. Но было бы круто каким-то образом так подготовиться самому и не сбиться с пути)
проблема решается моим скриптиком на баше, который пусть и костыль, но работает надежно и сделать его стоит дешевле, чем оплатить еще один спринт двум командам.
Верно, что подход должен соответствовать задаче. Иначе это так "полезно" для развития, что уже вредно.
Но если задача серьезная и из серьезного мира, где людям куда охотнее платят деньги, а подход все тот же примитивный, то это говнокод.
Джуну следует иметь две работы - одна требует качества, а другая приемлет гораздо более тупой подход. Проснулся, чувствуешь - устал от первой, берешь выходной и идешь на вторую, чтобы были хоть какие-то деньги за этот день. При этом не надо путать и впаривать подход от одного заказчика другому и наоборот (да-да, более лучший более худшему заказчику тоже не надо, а не только худший лучшему). Но заметь, это уже сильно отличается от того, как написано в твоем ответе: просто взять одного заказчика и если код его устраивает, то он хорош.
Алексей Скуфьин, ок. Давай по нему все сделаем. Приходим работать программистом в доставку пиццы, этому заказчику нравится наш код. Значит он хорош. Значит мы можем прийти в корпорацию Гугл. Приходим в Гугл, а для этого заказчика тот же самый код уже "немножечко" плох. ЧЯДНТ?
Но было бы круто каким-то образом так подготовиться самому и не сбиться с пути)
Понимаете, в чем суть.
Для того, чтобы писать хороший код, нужно обладать опытом. Не просто читать книжки, а обладать реальным опытом работы, чтобы понимать в чем заключается проблема говнокода.
Джуниор по определению не может быть опытным разработчиком. Иначе зачем он тогда устраивается джуниором? пусть сразу идет мидером или сеньором. Ведь никто не запрещает вам научиться программировать и получить огромный опыт программирования вне работы, неважно это в детстве в школе, или как хобби по вечерам.
Но в вопросе четко указано - начинающий. Если для вас слово джуниор означает нечто другое.. ну терминология потому и терминология, что должна быть общая для всех.
Ведь никто не запрещает вам научиться программировать и получить огромный опыт программирования вне работы, неважно это в детстве в школе, или как хобби по вечерам.
Получается, что вне работы (то есть в школе или по вечерам) можно получить огромный опыт программирования?
Если да, то перечитай этот коммент По какому учебнику изучать C++, чтобы работать в современном проекте?
из него понятно, что для огромного опыта надо направлять человека? А в школе и по вечерам направлять некому. И тогда за 6 лет этих вечеров будешь годным лишь на джуна: изучишь кучу всего, а код так и будешь писать не думая как следует. Зависит от врожденных качеств. Это из опыта.
Создание популярных опен-сорс проектов, запуск успешных стартапов
Популярных, успешных - четкой связи с программированием тут нет. Некоторая есть, да. Но главное все-таки в коде. А код можно и написать, если есть ум. Именно ум, а не только теоретические знания.
Получается, что вне работы (то есть в школе или по вечерам) можно получить огромный опыт программирования?
Да, именно этим занимаются, когда пишут пет-проекты и хобби.
Например создатель майнкрафта не работал, когда написал свой майнкрафт - это было его личное хобби.
Но это не значит, что он не был опытным программистом.
Тот, кто читает учебник - новичок. Опыта программирования у него нет, иначе он бы читал не учебник, а поглядывал в документацию или искал конкретные моменты в stackoverflowю
Учебник опять таки направлять не будет. Даст базу и все. Направлять должен человек себя сам.
Но для первичного обучения она тоже не подходит. Слишком коротко, и термины такие, которые непосвященный не сможет правильно понять: "std::map - отсортированный контейнер " - что значит отсортированный? Что в нем отсортировано? В нем же еще нет данных...
Если под непосвященным имеется ввиду ваш интерн, то наверное нужно начать с чего то подобного
Открыл первые две статьи. Это даже мне (а я джун) сложно читать. Хотя я смог сообразить, что под абстрактным типом данных имеются в виду как раз такие типы, как map, vector и т.д. Но, очень много воды. Например, зачем читать вот это - "В программировании абстрактные типы данных обычно представляются в виде интерфейсов" - в C++ такого не наблюдаю, а лезть в какие-то другие языки кроме используемого в проекте не каждый интерн будет.
А терминов опять много новых, хотя я просил разъяснить те же самые.
Если ты все еще настаиваешь, что эти статьи нужны, то укажи конкретную статью и конкретную цитату, которая даст понимание конкретной вещи, а именно: что "отсортированный контейнер" (англ. sorted container) означает "контейнер, который при вставке значений не располагает их в порядке вставки, а сортирует". Причем надо еще и понимать, что значит "сортирует": если ты не задавал порядок сортировки, то откуда он берется для чисел, строк и т.д., и что он такой именно везде, где речь идет о сортировке.
ИМХО, тут нужно что-то вроде "Контейнеры бывают отсортированные (...), ... (...) и ... (...). Еще контейнеры делятся по ..."
Не нужно подменять мышление эрудицией. Доскональное изучение вопроса редко приводит к пониманию основной сути. Как правило, понимания можно добиться намного быстрее. Про таких доскональных потом на работе говорят, "good developer can be 10 times faster than mediocre one".
Если ты все еще настаиваешь, что эти статьи нужны, то укажи конкретную статью и конкретную цитату, которая даст понимание конкретной вещи, а именно: что "отсортированный контейнер" (англ. sorted container) означает "контейнер, который при вставке значений не располагает их в порядке вставки, а сортирует". Причем надо еще и понимать, откуда берется порядок сортировки для чисел, строк и т.д., если ты его не задавал.
ИМХО, тут нужно что-то вроде "Контейнеры бывают отсортированные (...), ... (...) и ... (...). Еще контейнеры делятся по ..."
ИМХО, тут нужно что-то вроде "Контейнеры бывают отсортированные (...), ... (...) и ... (...). Еще контейнеры делятся по ..."
C++ Контейнеры
Библиотека контейнеров является универсальной коллекцией шаблонов классов и алгоритмов, позволяющих программистам легко реализовывать общие структуры данных, такие как очереди, списки и стеки. Существует три вида контейнеров: последовательные контейнеры, ассоциативные контейнеры, и неупорядоченные ассоциативные контейнеры, каждый из которых предназначен для поддержки различных наборов операций.
Контейнер управляет выделяемой для его элементов памятью и предоставляет функции-члены для доступа к ним, либо непосредственного, либо через итераторы (объекты, обладающие схожими с указателями свойствами).
Большинство контейнеров обладают по крайней мере несколькими общими функциями-членами и общей функциональностью. Выбор оптимального контейнера для конкретного случая зависит не только от предоставляемой функциональности, но и от его эффективности при различных рабочих нагрузках.
Ассоциативные контейнерыреализуют упорядоченные структуры данных с возможностью быстрого поиска
std::map — отсортированный упорядоченный ассоциативный контейнер, который содержит пары ключ-значение с неповторяющимися ключами. Порядок ключей задаётся функцией сравнения Compare. Операции поиска, удаления и вставки имеют логарифмическую сложность. Данный тип, как правило, реализуется как красно-чёрное дерево.
Это такая, немного локальная, проблема. К сожалению, кроме тебя оценить сложность или интересность текста для тебя больше ни кто не сможет. И для интерна у тебя такую же оценку вывести вряд ли получится.
Но, очень много воды.
Тут точно так же, оценка водности содержимого сугубо индивидуальна. Скажем, я в тех двух ссылках воды не вижу совсем.
Автор статьи ведет изложение. Для лучшего усвоения сложных моментов, автор предваряет сложное пояснение некоторым информационным фундаментом. Человеку такой фундамент может показаться водой, он пойдет дальше и не сможет усвоить сложную информацию ниже, т.к. ее пояснение опирается на якобы воду выше.
Если ты все еще настаиваешь, что эти статьи нужны, то укажи конкретную статью и конкретную цитату, которая даст понимание конкретной вещи
Конкретно - каждая из приведенных Романом статей дает понимание изложенных там вещей. Понимание надо выстраивать в процессе освоения информации. Информация в статьях изложена в очень доступной форме. Понимание является следствием рассуждений над полученной от статьи информацией.
Скотта Мейерса последнюю книгу по C++14 рекомендую.
Beginning C++17 Ивора Хортона. Не уверен правда, есть ли она на русском.
Солтер, Клеппер. C++ для профессионалов. Вообще, это отличная книга, которая охватывает не только сам язык, но ещё и многие другие аспекты программирования.