Собираюсь учиться программированию на С++,с чего следует начинать?
Интерестно узнать у опытных людей с чего лучше начинать,какие книжки лучше прочитать и есть ли вообще смысл учиться по книжкам? может лучше пойти на курсы С++ ?
Интересно узнать у опытных людей с чего лучше начинать,какие книжки лучше прочитать и есть ли вообще смысл учиться по книжкам? может лучше пойти на курсы С++ ?
Имхо -
Не лучше, по крайней мере поначалу.
Подавляющее большинство курсов по программированию (особенно в провинции) придумано хитрыми уродами для выбивания денег из желающих учиться.
Да, согласен, некоторые знания они дают. Но гораздо более глубокие знания можно почерпнуть из хороших книг, которые стоят гораздо меньшие деньги. Кроме того, я считаю, что преподаватели курсов сами обычно не слишком сильные и современно-развитые практики программирования.
Исключения есть. Но не уверен что тебе повезет на них попасть, я бы на такое не рассчитывал.
Большой вред этих курсов часто в том, что они прививают начинающему совершенно дурацкую и необоснованную уверенность в том, что
он хорошо знают какой-то язык или технологию (не понимая, что за 3 месяца или около того широко, а тем более глубоко изучить ничего нельзя, вдобавок знания, почерпнутые на курсах в быстром темпе так же и забываются), и потом он может стать воинствующим чайником, из
которого такую уверенность выбить бывает трудно.
Мой совет - это изучать по книгам, статьям и форумам в интернете.
Писать свои программы, продвигать их на конференции в вузе и .т.п.
И только когда выйдешь на некоторый более-менее серьезный уровень, уже идти устраиваться на работу в какую-то приличную компанию, чтобы на этой работе уже как минимум уметь видеть и понимать слабые и сильные стороны коллег и руководителей.
А дальше - в хорошей компании часто есть собственные курсы повышения квалификации сотрудников (+ помощь в сертификациях и т.п.). Вот на них уже ходить и надо :).
P.S. Все - мои личные ощущения из опыта.
P.S. насчет
взято из индии,китая?
Многие цитаты там мне понравились.
Не лучше, по крайней мере поначалу.
Подавляющее большинство курсов по программированию (особенно в провинции) придумано хитрыми уродами для выбивания денег из желающих учиться.
Да, согласен, некоторые знания они дают. Но гораздо более глубокие знания можно почерпнуть из хороших книг, которые стоят гораздо меньшие деньги. Кроме того, я считаю, что преподаватели курсов сами обычно не слишком сильные и современно-развитые практики программирования.
Исключения есть. Но не уверен что тебе повезет на них попасть, я бы на такое не рассчитывал.
Большой вред этих курсов часто в том, что они прививают начинающему совершенно дурацкую и необоснованную уверенность в том, что
он хорошо знают какой-то язык или технологию (не понимая, что за 3 месяца или около того широко, а тем более глубоко изучить ничего нельзя, вдобавок знания, почерпнутые на курсах в быстром темпе так же и забываются), и потом он может стать воинствующим чайником, из
которого такую уверенность выбить бывает трудно.
Мой совет - это изучать по книгам, статьям и форумам в интернете.
Писать свои программы, продвигать их на конференции в вузе и .т.п.
И только когда выйдешь на некоторый более-менее серьезный уровень, уже идти устраиваться на работу в какую-то приличную компанию, чтобы на этой работе уже как минимум уметь видеть и понимать слабые и сильные стороны коллег и руководителей.
А дальше - в хорошей компании часто есть собственные курсы повышения квалификации сотрудников (+ помощь в сертификациях и т.п.). Вот на них уже ходить и надо :).
P.S. Все - мои личные ощущения из опыта.
про провинции согласен фигня полная
но есть же курсы Microsoft IT Academy где деньги зря не выбивают
советую автору не жалеть денег и записаться
когда я проходил их все было нормально
1 пара лекции потом 2 пары практики
при чем все идет не по книжкам а на уровне общения со студентами
ну и книжки тоже хороши - берн страуструп FOREVER
архангельский
но лучше всего найди с
он не сильно отличается от пхп только типы есть
освой цмд и рви всех
советую автору не жалеть денег и записаться
когда я проходил их все было нормально
не заметно, по вопросам, оставляемым на форуме
интересно кто так считает и почему
Пример, как минимум эта тема: http://forum.codenet.ru/showthread.php?t=48228
В теме вопроса вы не разбираетесь, но других участников форума оскорбляете.
Как собственно и в этой теме: http://forum.codenet.ru/showthread.php?t=48371
Из-за фраз:
материть может только тот кто умнее
И еще многих других факторов, которые показывают вас абсолютно в негативном свете, как с точки зрения проффессиональных навыков, так и с точки зрения вашей способности работы в команде, так и вашей культуры общения.
Вот вам, пожалуйста, яркий пример. :)
Вот это правильно.
Лучше изучать чегонить подружественней к новичку - Delphi, Java,
но стопудово не С или C++.
Вообще, если топикстартер пробовал себя в PHP, логично было бы развить тему веба дальше, исследуя возможности Ruby.
Зачем изучать c до c++? Чтобы изучить не нужные в c++ макросы, чтобы привыкнуть к неудобным строкам, чтобы ставить где не надо указатели? Зачем нужны эти знания? Нет уж, c++ тут дружественнее к новичку.
Зачем учить Delphi до c++ ? чтоб потом путаться гда ставить =, где ==, а где := ? Чтобы забывать после if ставить скобочки? Классы, на мой взляд, проще изучить в c++. Возможно, в Delphi меньше используются указатели, но их можно не использовать и в c++ при первом знакомстве.
Хотя бы ради того, что не везде одним С++ сыт будешь. С++ не панацея от всех проблем, а лишь один из распространенных ООП языков программирования. Плюс, изучение иных языков, никоим образом не помешает, а даже наоборот. Да будет Вам известно, что множество библиотек написано например на "чистом" Си. Это ли не повод, хотя бы, к ознакомлению с ним?
[QUOTE=Kogrom]Зачем изучать c до c++? Чтобы изучить не нужные в c++ макросы, чтобы привыкнуть к неудобным строкам, чтобы ставить где не надо указатели? Зачем нужны эти знания? Нет уж, c++ тут дружественнее к новичку.[/QUOTE]
Позвольте спросить...а что в С++ отменили "ненужные" макросы, "неудобные" строки и указатели??? Смею заметить, что С++ является расширением языка Си, а так же, повторюсь, являет собой ООП язык программирования. Он создавался не для того что бы избавиться от Си, а для того что бы лаконично сочитаться с ним и дополнять его!
[QUOTE=Kogrom]Зачем учить Delphi до c++ ? чтоб потом путаться гда ставить =, где ==, а где := ? Чтобы забывать после if ставить скобочки? Классы, на мой взляд, проще изучить в c++. Возможно, в Delphi меньше используются указатели, но их можно не использовать и в c++ при первом знакомстве.[/QUOTE]
Если человек путается в таких вещах, то..... можно ограничиться изучением одного единственного языка программирования...или вообще тогда ничего не учить и не тратить на это время и усилия.
Сейчас, одни единственный язык программирования, не решит всех поставленных задач, темболее, если Вы заняты над серьезным проектом.
Согласен, что изучение разных языков может пригодиться, но если хочется (требуется) изучать c++, зачем начинать с си? Можно его изучить потом.
Не отменили, но использование большинства макросов (например #define) в c++ не требуется и может даже быть вредным. си-строки тоже не отменили, но в си++ есть намного более удобные std::string и изучение лучше начать с них. Указатели тоже есть, но в c++ есть много случаев, когда лучше их не использовать, в то время как человек, изучивший прежде си по привычке будет их применять.
Тут можно применить такое сравнение: человек, который долго печатал на машинке будет со страшной силой ударять и по компьютерной клавиатуре. Текст, конечно, будет такой же, но усилий тратится больше, да и клавиатуру жалко.
Сейчас, одни единственный язык программирования, не решит всех поставленных задач, темболее, если Вы заняты над серьезным проектом.
Опять же не спорю. Изучайте хоть 200 языков. Но делать это надо по потребности или из интереса. А если мы собрались изучать си++, зачем нам перед этим учить Дельфи?
Одним С++ сыт не будешь, огромное количество задач гораздо лучше решать на других языках (например, на Лиспе). Но их будут решать другие люди. Профессионалы в своей, также узкой, области.
В разумной степени узкой, конечно же.
Главным образом, С нужно сейчас для программирования под *nix.
Позвольте спросить...а что в С++ отменили "ненужные" макросы, "неудобные" строки и указатели??? Смею заметить, что С++ является расширением языка Си, а так же, повторюсь, являет собой ООП язык программирования. Он создавался не для того что бы избавиться от Си, а для того что бы лаконично сочитаться с ним и дополнять его!
Ну так использование C-style в программировании на С++
давно признано очень существенной проблемой для людей, переходящих с С на С++.
Если человек путается в таких вещах, то..... можно ограничиться изучением одного единственного языка программирования...или вообще тогда ничего не учить и не тратить на это время и усилия.
Сейчас, одни единственный язык программирования, не решит всех поставленных задач, темболее, если Вы заняты над серьезным проектом.
Знать несколько языком программирования полезно в том плане, что
их можно сравнивать, и мыслить более широко, видеть плюсы и минусы каждого языка.
Но, в серьезном проекте, имхо, рулит узкая, (умеренно узкая, а не "специалист по правой ноздре") специализация. Например - я ни разу в жизни не встречал человека, который бы был гуру по C++ и Java, нигде - ни здесь, ни на одном форуме, ни в университете (хотя это конечно, не показатель), ни на работе. И не думаю, что встречу когда-нибудь. (Скажу даже более конкретно - я ни разу не встречал гуру по ВСЕЙ ВООБЩЕ платформе Java, а только по отдельным частям (J2ME, J2EE и т.п.).) Можно знать много языков, можно быть спецом в одном и нормально знать несколько дополнительно. Но имхо, быть гуру в нескольких языках программирования сразу - невозможно.
Я не согласен так же с теми, кто считает, что начинать нужно с более дружественных Java или Delphi.
Во-первых, не определено понятие "дружественный".
Во-вторых, у этих языков разное предназначение и разная философия.
Они мало связаны (кроме синтаксиса, но синтаксис далеко не самая главная часть языка).
Ну так использование C-style в программировании на С++
давно признано очень существенной проблемой для людей, переходящих с С на С++.
Если ты годами писал на С, а потом решил попробовать С++, то возможно, да и то спорно. Реально встречается только одна проблема - приведение типов в С++ используя C-style.
Если у человека есть голова на плечах и он знает С, то используя С++ он должен понимать что в этом языке лучше, а что хуже и выбирать оптимальные методы. За время своей работы я не встретил ни одного хорошего С++ программиста, который не знал бы С. Те, кто начинал с С++ потом тратили много времени на изучение С, дабы уметь писать эффективный код.
К тому же стандартные библиотеки С++ часто не дают нужного эффекта и приходит некоторые вещи реализовывать вручную, а человек который знает только С++ многого просто не сможет сделать, потому как это является нормальным для С, а в С++ не распространено (управление памятью к примеру).
Где Green ходит? Тут такое говорят, а он молчит :)
Я еще начинающий программист, может чего-то не понимаю. Вы говорите про динамическое выделение памяти? А чем тогда операторы new и delete вас не устраивают? Не хотите же вы сказать, что malloc и free эффективнее. Тем более, что при использовании контейнеров STL даже эти операторы редко бывают нужны.
Назовите хотя бы одну ситуацию, когда структурные языки превосходят ООЯ или какую задачу нельзя решить при помощи ООЯ?
ЗЫ: не далее как 2 дня назад завершил проект на ООЯ который делали на фортране 8!!! чел 5!!! лет, у меня ушло на это 1.5 месяца.
ЗЫЗЫ: Почти все современные ООЯ берут свою концепцию (а часто и синтаксис) от С++
Я говорю не об операторах, а о различных манипуляциях с памятью вручную. Ты часто используешь reinterpret_cast в С++? В С аналогичное приведение (и куча разных иных манипуляций) это норма.
Реально С менее строгий чем С++, и поэтому можно наделать по неопытности кучу ошибок, но зато потом будет легче ;)
А использование по привычке средств С, там где С++ предоставляет больше возможностей?
[quote=specter]
Если у человека есть голова на плечах и он знает С, то используя С++ он должен понимать что в этом языке лучше, а что хуже и выбирать оптимальные методы. За время своей работы я не встретил ни одного хорошего С++ программиста, который не знал бы С. Те, кто начинал с С++ потом тратили много времени на изучение С, дабы уметь писать эффективный код.
[/quote]
Поясни, что ты понимаешь под эффективным кодом. Скорость выполнения?
[quote=specter]
Я говорю не об операторах, а о различных манипуляциях с памятью вручную. Ты часто используешь reinterpret_cast в С++? В С аналогичное приведение (и куча разных иных манипуляций) это норма.
[/quote]
Ты считаешь это преимуществом? Объективным, при практическом программировании?
[quote=specter]
Реально С менее строгий чем С++, и поэтому можно наделать по неопытности кучу ошибок, но зато потом будет легче
[/quote]
Чем?
Реально С менее строгий чем С++, и поэтому можно наделать по неопытности кучу ошибок, но зато потом будет легче ;)
В приведенной цитате я вообще ничего не понял. Зачем тут оператор преобразования типов reinterpret_cast?
Ну хорошо. Допустим, для какой-то задачи си лучше, чем си++, но из этого не следует в какой очередности надо изучать эти языки.
А если исходить из того, что надо начинать с менее удобного и ошибкоемкого при создания больших программ языка, то почему бы не начать с ассемблера? После него будет совсем легко :)
[QUOTE=Zorkus](Скажу даже более конкретно - я ни разу не встречал гуру по ВСЕЙ ВООБЩЕ платформе Java, а только по отдельным частям (J2ME, J2EE и т.п.).[/QUOTE]
Отвечу только на твою цитату Zorkus. Соглашусь с тобою, не каждый программист на Java становиться в последствии Java Arhitect Developer'ом. Думаю ты знаешь какими знаниями необходимо обладать для подобного "зачета" на сертификации. Скажу больше, мне доводилось встречать подобных, можно сказать, единичных людей. Да и С++ они тоже неплохо знают + являются кодерами под замечательную ОСьку, Solaris называется :)
Удачи всем и не подеритесь только. Спор до добра не доводит!
Имеешь в виду SCEA?
Думаю ты знаешь какими знаниями необходимо обладать для подобного "зачета" на сертификации. Скажу больше, мне доводилось встречать подобных, можно сказать, единичных людей. Да и С++ они тоже неплохо знают + являются кодерами под замечательную ОСьку, Solaris называется :)
Завидую по хорошему :)
Дай угадаю - случайно, не из Sun ребята?
Гммм.. а вы правда считаете что манипуляция памятью вручную это офигенный плюс?
Если так, то мне вас жаль.
Типы данных тоже видимо придумали для детей, которые не могут отличить void* от void*?
Если в программе приходится часто использовать reinterpret_cast или его аналоги, значит с архитектурой приложения полная задница. Вам так не кажется?
ээээ... простите?
Поясни, что ты понимаешь под эффективным кодом. Скорость выполнения?
Скорость и минимальное использование памяти.
А если исходить из того, что надо начинать с менее удобного и ошибкоемкого при создания больших программ языка, то почему бы не начать с ассемблера? После него будет совсем легко :)
Для начала автор не будет работать над большими проектами, а на небольших будет очень полезно познать некоторые особенности.
Если так, то мне вас жаль.
В С++ исключительно редко, в С - часто. Суть в том, что используя С человек получит практическое представление о работе с памятью. На С++ лично мне приходилось писать хитрый memory poll для экономии долей секунд в скорости выполнения, и я уверен, что не работая до этого с С я не смог бы быстро и эффективно выполнить эту задачу.
Все противники С, скажите - это нормально, когда человек приходит на собеседование и не может написать элементарнейший алгоритм переворота односвязного списка, потому что он толком и не знает как вручную пользоваться списками, ведь все время он использовал std::list и больше ничего не знает. Примерно такой специалист и получится из автора, если он сразу полезет в ООП и STL.
Прошу прощения, что встряну, но как раз в большинстве случаев скорость выполнения достигается в ущерб размеру и соответственно использованию памяти. Программы, в которых достигнуто и то и другое, являются произведениями искусства. Так что, имхо, эффективный код - это такой код, в котором найдено наилучшее для данной задачи соотношение сорость/размер. но это так, мое скромное мнение.
Напрямую памятью полезно манипулировать в системных приложениях, а так, с++ средства для этого удобнее.
Насчет с чего начинать, с или с++ даже не знаю)) сам с С начинал, и сейчас параллельно их использую. доводы насчет того, что начинающие не имеют представления о механизмах манипуляции с памятью, возможно, имеют основу. можно вспомнить хотябы жертв визуального борландовского "программирования" :).
Возможно, это из-за большой разницы в типах задач, которые мы решаем - но я считаю эффективность лишь одним и далеко не самым важным компонентом первоклассного код. А эффективность работы
достигается за счет архитектурных решений и стратегий управления
ресурсами на высоком уровне абстракции.
Ну ведь можно заглянуть в исходники std:list. И почерпуть прекрасный
пример реализации списка. Было бы желание. Незнание кандидатом алгоритма - это не из-за того, что он не работал с языками более низкого уровня. Это ненормально - но это не связано с незнанием С.
Все противники С, скажите - это нормально, когда человек приходит на собеседование и не может написать элементарнейший алгоритм переворота односвязного списка, потому что он толком и не знает как вручную пользоваться списками, ведь все время он использовал std::list и больше ничего не знает. Примерно такой специалист и получится из автора, если он сразу полезет в ООП и STL.
А Вы знаете как бегают токи в компе при умножении сложении и делении? какие двоичные команды куда подаются?
А вот если знать все это, то можно дюже эффективные программы писать.
Однако языки высокого уровня отличает абстагированность от реализации низкого уровня.
Я не знаю как устроен std::list и мне это не надо, мне достаточно того что я могу в хелпе прочитать как им пользоваться а все его внутренности пусть делает автор STL.
Элементарная задача. На них тренируются новички, когда изучают язык. "Своя" реализация списка, "своя" реализация хэш-таблицы и еще длинный список необходимых велосипедов. И для этого совсем не нужно бросаться изучать C - хватит и скромных возможностей C++.
Тоже вставлю свои 5 копеек.
А если человек пишет программы под win32 он должен заниматься рисованием окон и кнопочек вручную?
По вашей логике - программист должен обладать некоторым набором умений, но это далеко не главное. Главное для программиста - способность широко и гибко мыслить. Методики программирования через 10 лет будут сильно отличатся от сегодняшних, так зачем человеку нагружать ими свой мозг? Он должен уметь изобретать свой велосипед, то-есть мыслить креативно с новаторским подходом, а не зацикливаться на знании\не знании чего-либо.
То-что кандидат не может развернуть список - показывает его как человека, не способного творчески мыслить, и решать задачи, с которыми он не сталкивался раньше, а не говорит о качестве его знания языка С. Более-менее адекватный подход для найма сотружников, описывается в той же книге "Как сдвинуть гору Фудзи".
Нервно курю...
Боже, всё это время я писал не эффективный код!
Никому не говорите: я не знаю C.
[QUOTE=Zorkus]
А использование по привычке средств С, там где
Поясни, что ты понимаешь под эффективным кодом. Скорость выполнения?
Скорость и минимальное использование памяти.
[/QUOTE]
Типичное заблуждение.
Во-первых, эффективность - это не всегда скорость и размер, а, например, универсальность, функциональность, удобство использования. К примеру, STL basic_string значительнее эффективнее с этих позиций, чем CRT strxxx.
Во-вторых, "скорость и минимальное использование памяти" в первую очередь достигается за счет "правильной" архитектуры и применения "правильных" алгоритмов, а не за счет реализации. Как пример, тот же твой список можно отсортировать за n^2, а можно за n*log(n).
С другой стороны более высокоуровневые языки дают существенный выигрыш в скорости разработки, а это значит, что я быстрее могу получить результат, проанализировать его и внести изменения в "бутылочные горлышки".
Эффективный код невозможно получить сразу, это процесс итерационный (и не скончаемый). А за одно и то же время при использовании ЯВУ я получаю больше итераций разработки, а сл-но - и более эффективный код.
По поводу эффективности - алгоритмы исключительно важны, но не все достигается за счет них. Важно все... и алгоритмы, и архитектура, и хорошее знание самого языка, и представление внутреннего функционирования. Я думаю стоит закончить этот спор - никто никого не сможет переубедить. В моей практике знание С очень помогло как практически так и теоретически (при изучении С++). У кого-то возможно все обстоит иначе.
И раз подняли тему алгоритмов - автор, начни лучше с них, очень полезная штука на практике ;)
Угу, Sun Certified Enterprise Architect, я именно это и имел ввиду. Это наивысшая точка....хотя пределу нет границ, да и не обязательно SCEA, помоему такие компании как Oracle тоже сертифицируют.... не помню. :)
[QUOTE=Zorkus] Дай угадаю - случайно, не из Sun ребята?[/QUOTE]
Ребятам из Sun Microsystems не нужны сертификаты, они уже там работают и уже их наполучали до работы в Sun :)
Нет, другие ребята. Есть же проект OpenSolaris, не в курсе разве?
Кстате...в последнее время участились сертификации Индийских и Китайских парней... Недавно паренек из Индии получил награду Code for Freedom Winner, как участник проекта Campus Ambassador ...вот так вота вота.
Да. Вроде бы больше толковых аргументов в споре не предвидится, а потому он теряет смысл.
Хотел посоветовать какую-нибудь книгу и понял, что сделать мне это пока трудно. Вроде бы надо "Язык программирования c++" Страуструпа посоветовать, но помню, что когда я начал изучать c++ мне она показалась непонятной, не рассчитаной на новичка.
Да мне бы SCBCD сдать :) До SCEA мне...