Я умею программировать на С++!?

C++

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

Вопрос:


У тебя за плечами восемь лет работы программистом на С++, как я понимаю. Вопрос связан с собственным желанием научиться как-то программировать.

Что включает в себя понятие “знать язык”, или “уметь программировать на нём”? Язык - это синтаксис плюс набор некоторых стандартных функций плюс сотни/тысячи библиотек, содержащих какие-то инструменты. Знание языка есть знание всего этого инструментария и умение его применять?

Что нужно уметь делать (или - что нужно сделать?), чтобы иметь право сказать “я умею программировать на С++”?

Как я себе представляю процесс программирования:
- осмысление поставленной задачи и составление из словесного описания чёткого, структурированного и наиболее оптимального алгоритма;
- реализация этого алгоритма с помощью языка, используя наиболее подходящие и уместные для данной задачи средства.

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

“Умение программировать” и “опыт” есть знание и умение применять нужные методы в нужных местах; не задумываться, не изучать литературу (разве что в справочник подглядеть), а чётко знать, где и что?

Ещё вопрос, до кучи, про составление [оптимальных] алгоритмов. Изучал ли ты теорию алгоритмов или какую-либо смежную дисциплину, или всё сам придумывал, что в работе использовал?

Ответ:

Что нужно уметь делать (или - что нужно сделать?), чтобы иметь право сказать “я умею программировать на С++”?

Очень интересный и неоднозначный вопрос. И ответ на него не может быть однозначным. Частично ответ на этот вопрос я уже дал в посте про 3 важных этапа в профессиональном развитии программиста.
Программист на каждом из этих этапов развития уверен на 100%, что он умеет программировать на C++ и только в момент перехода на следующий этап может вдруг осознать, что не так уж он много и знал и умел раньше. При этом знание именно конкретного языка программирования перестает быть важным уже начиная со второго этапа профессионального развития.
Если программист перестал думать в терминах языка (циклы, указатели и т.п.), а думает алгоритмами и абстракциями, то ему уже язык программирования неважен. Поэтому могу сказать, что “я умею программировать на С++” можно уверенно говорить сразу по выходу на второй уровень профессионального развития.

И тут встает другой вопрос - а нужны ли кому-нибудь программисты, “умеющие программировать на C++”?
Имхо - не особо. Да, есть компании, набирающие программистов без опыта, но отлично владеющих C++.
Но обычно всем нужны программисты, умеющие решать задачи, используя C++ или любой другой язык программирования. А умение решать задачи и знание языка - это параллельные понятия, которые не очень-то пересекаются. Тем более, что задачи бывают самые разные и в разных областях - геймдев, секьюрити, телефония и т.п. И знание C++ для геймдева не очень-то помогает в написании сетевых программ с использованием WinAPI.

Так что важно не “уметь программировать на C++”, а иметь опыт и знания в нужных сферах. Опыт и знания - это именно не задумываться, не изучать литературу (разве что в справочник подглядеть), а чётко знать, где и что? А также знание и опыт работы с множеством библиотек.
Конечно, бывают задачи, которые без гугла и MSDN не решить, но таких меньшинство. И чем больше опыт, тем меньше нужен гугл и MSDN.
Например, после 6 лет программирования игр я заметил, что вообще не открываю MSDN месяцами. Он просто не нужен, т.к. ты все нужное оттуда уже читал и знаешь. Другое дело, что в играх можно изучить API, но невозможно изучить все алгоритмы - их слишком много и все время появляются новые. Так что в геймдеве без постоянного чтения статей, книг и блогов не обойтись.

Ещё вопрос, до кучи, про составление [оптимальных] алгоритмов. Изучал ли ты теорию алгоритмов или какую-либо смежную дисциплину, или всё сам придумывал, что в работе использовал?

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

 Понравилась статья? Подпишись на RSS!

39 комментариев к Я умею программировать на С++!?

  • Eugene Kudashev

    Спасибо.
    Весьма развернутый ответ, но вопрос все равно остается открытым - именно ввиду неоднозначности последнего ;)

    Ты продолжишь писать в оба блога, сюда - на профессиональную тематику, а в жж - “о жизни”, или как?

    • Ага, план такой. В этот блог - профессиональное, в жж - личное и мысли.
      Хочу попробовать так - через несколько месяцев посмотрим, что получится.

    • Надо не уметь “программировать на …”, а уметь программировать вообще - знать основные алгоритмы, условия их применения, уметь проектировать программы, решающие конкретную задачу (и соответственно знать свою предметную область).
      Желательно изучить несколько разных языков (с разными парадигмами) - это очень полезный опыт, даже если их не будешь применять напрямую, то все равно их знание влияет на умение формулировать и решать задачи.
      Ну и читать - существует много прекрасных книг на тему программирования и разработки ПО - SICP, Introduction to Algorithms, Кнут и т.д.
      В качестве обзорной литературы про разные языки программирования могу посоветовать Finkel “Advanced Programming Languages Design” - оно бесплатное и легко находится в сети

      • Согласен. Конкретный язык со временем перестает быть важным. Начинаешь думать алгоритмами, а программа пишется как-то сама :)

        >>Желательно изучить несколько разных языков

        Эх, на это время нужно. Я уже несколько лет не могу его найти, чтобы изучить хотя бы 2-3 новых языка. Обычно хватает только на прочтение книги с основами и на пару экспериментов. То есть, могу сказать “я знаю C#”, но реально я знаю только синтаксис…
        И до “я умею решать задачи на C#” еще очень далеко.

        • ну может быть не изучить до мельчайших подробностей, но иметь представление о используемых парадигмах и т.п. + небольшой опыт написания программ.
          иногда прояснение наступает сразу после чтения книги, еще без реальных экспериментов, ты начинаешь смотреть на текущую разработку с совершенно другой точки зрения.
          P.S. ну C# это та же ява, и также как в яве, основное - знание API. А я в основном хотел указать на изучение совершенно новых языков, например Haskell/OCaml/Common Lisp/Prolog/Occam для программиста, работавшего только на С++, ну и т.д.

          • P.S. ну C# это та же ява, и также как в яве, основное - знание API. А я в основном хотел указать на изучение совершенно новых языков, например Haskell/OCaml/Common Lisp/Prolog/Occam для программиста, работавшего только на С++, ну и т.д.

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

            • Ну существуют короткие туториалы по хаскелю :-)
              а вообще, для начала стоит посмотреть на книгу финкеля, про которую я писал уже - там описывается большая часть парадигм программирования

              • Короткий туториал опять же даст только понимание синтаксиса и основ.
                Чтобы начать использовать язык типа Хаскеля и понимать его - нужно “с ним пожить” несколько месяцев.

          • 2Alex: А потом начинается “ломка” из-за того, что в языке, используемом на работе, нет тех возможностей, которые бы так хотелось иметь, или они есть, но уж больно непросто реализованы.

    • Несовсем так. То есть не полный ответ.

      Знание языка это помимо синтаксиса, библиотек которыми вы оперируете еще и понимание внутренней кухни среды исполнения.

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

      Если говорить о прекрасном и сильном объектном языке то это шаблонный С++.

  • “При этом знание именно конкретного языка программирования перестает быть важным уже начиная со второго этапа профессионального развития.”

    Категорически не согласен. Помнится по этому поводу даже вступал в дискуссию на DTF: http://www.dtf.ru/forum/flat.php?id=7317&page=1&page_size=20#m99717

    P.S. Олег, удали пожалуйста мой предыдущий комментарий, что-то я там со ссылками напортачил.

  • gineer

    Вопрос вроде был по С++
    Последняя хорошая книга которую встретил — C++ Common Knowledge
    Думаю по тому факту что я считаю её хорошей можно непрямо оценить мое знание языка. ;)

    Еще. По движку блога.
    Есть у меня один знакомый блог, человека который достаточно много времени потратил на разработку своей версии стэндалон блога.
    Если интересно — ник в ЖЖ vitus_wagner
    Пишет много о чем, и интересно.
    Правда о своей разработке блога уже давно не писал, так что нужно или обращатся напрямую, или искать в истории блога.

  • Xor

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

    В итоге, возвращаясь к посту, хороший программист сейчас должен знать как формальные требования при написании программ, так и особенности конкретных языков/компиляторов.
    При чём программисту НАЧАЛЬНОГО уровня важнее именно особенности языка с необходимым минимумом формальных знаний, а для движения дальше приёмы разработки становятся всё важнее.

    P.S. Кстати, какой язык лучше посмотреть в свободное время, если на работе в основном идёт C# + сейчас Java?
    Колеблюсь между Pithon и F#.

  • KmDm

    Первый раз после долгого времени Бишоп порадовал, т.к. начал писать про IT и программирование, а не про поднятие штрафов ГИБДД в 10 раз и про остальную хрень ради поднятия популярности своего блога.
    А вообще идея с отдельным блогом хороша.)

    • Я и раньше про программирование писал, просто перемежал это с постами на другие темы :)
      Но в какой-то момент стало ясно, что пора разделяться.

      А вообще идея с отдельным блогом хороша.)

      Посмотрим :) Пока что тут многовато багов.

  • Несовсем так. То есть не полный ответ.

    Знание языка это помимо синтаксиса, библиотек которыми вы оперируете еще и понимание внутренней кухни среды исполнения.

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

    Если говорить о прекрасном и сильном объектном языке то это шаблонный С++.

  • коменты режуться….

    ммммммммммм вы точно можете быть уверены что понятние объекта в этом случае соовершнно оптимизированное опнятие для конкретного процессора и операционной системы.

    Вот это вот - знать С++.

  • вот мой момментарий, и две строчки, одна маленькими буквами. следующая я заменю букву и на большую.
    вот мой момментарий,

  • я не расчитывал что это будет воспинято руководством к действию :D

    • Забавно, режется именно большая буква И :)
      Спасибо еще раз за наводку, пишу в саппорт плагина.

    • я думаю там проблема при редиректах, когда текст сообщения кодируется, да и наверно не в одной букве проблема…

      можно порекомендовать пользователям портала писать все комментарии в base64, должно помоч.

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

  • SS

    Считаю вообще не удачным ответом… Можно читать как личное узкое мнение автора…
    Никогда не считал что я “умею программировать на C/C++” хотя работаю уже давно и только по специальности, а начинал вообще очень давно с такого языка как FoxBase (потом появился FoxPro 2.0) в те далекие времена когда в штатах 86-я была хорошим компьютером и стоила больше 1700$…
    Перед вступлением в институт начал писать на C на перекор всем преподавателям писал все лабораторки на Си а не на паскале. Работать программистом Си стал с 4-го курса, сменил за эти годы много работ, но ни на одной не было так что “мы клепаем табуретки и я про них все знаю и даже все их модификации…” всегда появлялись новые задачи новые прикладные области, соответственно новые задачи новые алгоритмы, интернет еще не вошел так в жизнь и не был обычной вещью имеющейся у всех, даже организаций. И повторюсь, выучить все хотя бы для одной прикладной области чтобы сказать что я все знаю нереально даже в разрезе одного языка! Маленький пример, электронные весы, может видили весовые где взвешивают грузовики и фуры? Ставили когда то такие весы со своим ПО под них…
    1) имеем работу с внешним устройством кто может сказать что он знает все про работу с внешними устройствами через COM порт и USB знает протоколы для всех устройств и сможет составить универсальный алгоритм для работы с ними?
    2) имеем работу с GUI все всё знают? От написания контролов до знания всех библиотек которые для этого используются в том числе которые вы решили что они не пригодны для использования? :) Алгоритмы вывода большого количества данных в эти контролы для? А для компьютеров моей молодости? :)
    Тему можно развивать включить сюда и ActiveX и Com и т.д.
    3) Данные взвешиваний хранятся базе данных. Автор наверно точно убежден что умеет работать со всеми БД умеет оптимальным образом выбирать для всех БД структуру таблиц, индексы и хранимые процедуры и конечно с первого раза (т.к. перешел на какой то там этап) сможет написать все запросы самым оптимальным образом вне зависимости от того сколько клиентов будут работать с этой БД и т.д.
    4) Данные отправляются руководству которое не любит сидеть в колхозах но хочит знать скоко собрали урожая имеем работу по протоколам HTTP, FTP и т.д. Автор наверно является ходячей энциклопедией RFC и знает как все реализовать оптимальным образом :)
    и т.д. и т.д.
    Если кто то скажет что да, он просто врет или не представляет о чем говорит :) Я не говорил под какую операционную систему, т.е. если человек сказал что может то это значит под любую :) Я знаю много ОС под часть которых вообще компилятора C/C++ нет :)
    И это всего поверхностое описание часть одной из задач одной из организаций…
    Поэтому сказать я умею программировать на С++ при работе с базами Access и знать все как можно работать с ними и все технологии которые можно использовать для этого и все ньюансы совсем разные обьемы знаний :)
    А как говорили великие, еще в древности, чем я больше знаю, тем больше я знаю того что я не зню…
    Насколько полезно знание других языков? Скорее это все таки для общего развития, считаю что да надо иметь общее представление но быть специалистом в своей области и расширять ее. Я думаю что мало кто любит автомастеров нового поколения из модных автосервисов, т.е. ребят которые закончили ПТУ и 3 месяца учили пользоватся диагностическим оборудованием и менять блоки открутив несколько винтов, но когда компьютер говорит что “коробка передачь автомобиля не обноружена…” они разводят руками и говорят что ничего починить не могут т.к. копьютер не сказал что сломано :) Я думаю вы предпочтете специалиста по бензиновому двигателю который скажем умеет настроить ваши 4-ре карбюратора даже без оборудования но имеет общие представления об электрике автомобиля и при крайней необходимости сможет разобратся и с ней.

    • Считаю вообще не удачным ответом… Можно читать как личное узкое мнение автора…

      Я же в статье написал примерно то же самое, что вы в комментарии :) Можно сколько угодно считать, что ты умеешь “программировать на С++”, но это нафиг никому не надо на самом деле без конкретного приложения к нужной предметной области

Ответить

 

 

 

Вы можете использовать эти HTML тэги

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>