Я умею программировать на С++!?
К одному из предыдущих постов я получил комментарий с вопросами про программирование. Вопросы интересные, так что отвечаю на них в отдельном посте.
Вопрос:
У тебя за плечами восемь лет работы программистом на С++, как я понимаю. Вопрос связан с собственным желанием научиться как-то программировать.
Что включает в себя понятие “знать язык”, или “уметь программировать на нём”? Язык - это синтаксис плюс набор некоторых стандартных функций плюс сотни/тысячи библиотек, содержащих какие-то инструменты. Знание языка есть знание всего этого инструментария и умение его применять?
Что нужно уметь делать (или - что нужно сделать?), чтобы иметь право сказать “я умею программировать на С++”?
Как я себе представляю процесс программирования:
- осмысление поставленной задачи и составление из словесного описания чёткого, структурированного и наиболее оптимального алгоритма;
- реализация этого алгоритма с помощью языка, используя наиболее подходящие и уместные для данной задачи средства.
Тут, конечно, всё очень грубо и упрощённо, и я, быть может, заблуждаюсь - если да, то хотелось бы знать, где.
“Умение программировать” и “опыт” есть знание и умение применять нужные методы в нужных местах; не задумываться, не изучать литературу (разве что в справочник подглядеть), а чётко знать, где и что?
Ещё вопрос, до кучи, про составление [оптимальных] алгоритмов. Изучал ли ты теорию алгоритмов или какую-либо смежную дисциплину, или всё сам придумывал, что в работе использовал?
Ответ:
Что нужно уметь делать (или - что нужно сделать?), чтобы иметь право сказать “я умею программировать на С++”?
Очень интересный и неоднозначный вопрос. И ответ на него не может быть однозначным. Частично ответ на этот вопрос я уже дал в посте про 3 важных этапа в профессиональном развитии программиста.
Программист на каждом из этих этапов развития уверен на 100%, что он умеет программировать на C++ и только в момент перехода на следующий этап может вдруг осознать, что не так уж он много и знал и умел раньше. При этом знание именно конкретного языка программирования перестает быть важным уже начиная со второго этапа профессионального развития.
Если программист перестал думать в терминах языка (циклы, указатели и т.п.), а думает алгоритмами и абстракциями, то ему уже язык программирования неважен. Поэтому могу сказать, что “я умею программировать на С++” можно уверенно говорить сразу по выходу на второй уровень профессионального развития.
И тут встает другой вопрос - а нужны ли кому-нибудь программисты, “умеющие программировать на C++”?
Имхо - не особо. Да, есть компании, набирающие программистов без опыта, но отлично владеющих C++.
Но обычно всем нужны программисты, умеющие решать задачи, используя C++ или любой другой язык программирования. А умение решать задачи и знание языка - это параллельные понятия, которые не очень-то пересекаются. Тем более, что задачи бывают самые разные и в разных областях - геймдев, секьюрити, телефония и т.п. И знание C++ для геймдева не очень-то помогает в написании сетевых программ с использованием WinAPI.
Так что важно не “уметь программировать на C++”, а иметь опыт и знания в нужных сферах. Опыт и знания - это именно не задумываться, не изучать литературу (разве что в справочник подглядеть), а чётко знать, где и что? А также знание и опыт работы с множеством библиотек.
Конечно, бывают задачи, которые без гугла и MSDN не решить, но таких меньшинство. И чем больше опыт, тем меньше нужен гугл и MSDN.
Например, после 6 лет программирования игр я заметил, что вообще не открываю MSDN месяцами. Он просто не нужен, т.к. ты все нужное оттуда уже читал и знаешь. Другое дело, что в играх можно изучить API, но невозможно изучить все алгоритмы - их слишком много и все время появляются новые. Так что в геймдеве без постоянного чтения статей, книг и блогов не обойтись.
Ещё вопрос, до кучи, про составление [оптимальных] алгоритмов. Изучал ли ты теорию алгоритмов или какую-либо смежную дисциплину, или всё сам придумывал, что в работе использовал?
Это одна из самых главных моих ошибок вначале - я не читал ничего. Почти все алгоритмы придумывал сам - это был огромный фан, но и огромная глупость.
Все начинающие программисты должны постоянно помнить, что большинство алгоритмов уже придумано и описано. Всегда проще, правильнее и быстрее их найти, чем придумывать свой. Используйте гугл, читайте профессиональные форумы и блоги, читайте книги и вы в разы сократите свой период перехода на профессиональный уровень.

Спасибо.
Весьма развернутый ответ, но вопрос все равно остается открытым - именно ввиду неоднозначности последнего
Ты продолжишь писать в оба блога, сюда - на профессиональную тематику, а в жж - “о жизни”, или как?
Ага, план такой. В этот блог - профессиональное, в жж - личное и мысли.
Хочу попробовать так - через несколько месяцев посмотрим, что получится.
Надо не уметь “программировать на …”, а уметь программировать вообще - знать основные алгоритмы, условия их применения, уметь проектировать программы, решающие конкретную задачу (и соответственно знать свою предметную область).
Желательно изучить несколько разных языков (с разными парадигмами) - это очень полезный опыт, даже если их не будешь применять напрямую, то все равно их знание влияет на умение формулировать и решать задачи.
Ну и читать - существует много прекрасных книг на тему программирования и разработки ПО - 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. Олег, удали пожалуйста мой предыдущий комментарий, что-то я там со ссылками напортачил.
Имеется в виду, что ко второму этапу ты уже язык достаточно хорошо знаешь. И можешь уже забыть про его проблемы, а сконцентрироваться на алгоритмах.
P.S.:
А ты разве сам не можешь удалить?
Да, наверное я не понял что ты имеешь в виду.
P.S. Не-а :/
P.S. Не-а :/
Зайду вечером под юзер акаунтом и попробую настроить, чтобы мог. Еще не до конца разобрался с Wordpress.
Вопрос вроде был по С++
Последняя хорошая книга которую встретил — C++ Common Knowledge
Думаю по тому факту что я считаю её хорошей можно непрямо оценить мое знание языка.
Еще. По движку блога.
Есть у меня один знакомый блог, человека который достаточно много времени потратил на разработку своей версии стэндалон блога.
Если интересно — ник в ЖЖ vitus_wagner
Пишет много о чем, и интересно.
Правда о своей разработке блога уже давно не писал, так что нужно или обращатся напрямую, или искать в истории блога.
Немного офф.
Читая пост возникла интересная мысль (перекликающаяся со статьёй одного нашего старого программера, которую ты когда-то выкладывал): раньше программирование, как новая не сложившаяся наука, была больше искусством. И по-моему многие так стремились сюда потому, что возможности по самовыражению (по части придумывания алгоритмов и тп) были огромные.
Сейчас же программирование становится всё более формализованной областью человеческой деятельности, и начинает напоминать такие отрасли, как строительство.
Кстати, сравнение с архитекторами здесь подходит ещё и потому, что там также можно пытаться выдумать новые красивые решения, либо пользоваться уже готовыми схемами.
При чём если первое кажется более интересным на первом этапе, то второе более продуктивно, и часто ведёт к более интересному результату и большему личному удовлетворению - потому что гарантированно и эффективно достигаешь нужного результата, на который, к тому же, приятно смотреть.
В итоге, возвращаясь к посту, хороший программист сейчас должен знать как формальные требования при написании программ, так и особенности конкретных языков/компиляторов.
При чём программисту НАЧАЛЬНОГО уровня важнее именно особенности языка с необходимым минимумом формальных знаний, а для движения дальше приёмы разработки становятся всё важнее.
P.S. Кстати, какой язык лучше посмотреть в свободное время, если на работе в основном идёт C# + сейчас Java?
Колеблюсь между Pithon и F#.
Python прост, как пробка. Изучишь быстро. F# не смотрел.
Понятно.
F# - интересен примерно как Haskel, т.е. нечто очень сильно отличающееся.
По нему интересная ИМХО лекция есть здесь:
http://platforma2009.ru/materials/showitem.aspx?MID=77110d82-f458-4231-a6ba-441b0dac6478
Это видео.
Ещё немного есть в блоге на MSDN
http://blogs.msdn.com/sos/
Если интересно
http://books.google.com/books?id=n1DEBdl_oloC&pg=PP1&dq=foundations+of+F%23
Ух ты, спасибо за линк. Я и не знал, что есть books.google.com
Буду изучать.
Прост, да не прост. Синтаксис - да, проще некуда, правда неудобно поначалу, особенно, если нет привычки соблюдать отступы. А вот если глубже копнуть: генераторы, лямбды, метаклассы, опять же map и reduce.
Я бы лично посоветовал не выбирать Python или F#, а посмотреть и то и другое, и ещё добавить в список JavaScript, от мощи которого просто захватывает дух, а синтаксис в то же время, совершенно привычен.
А вот если глубже копнуть: генераторы, лямбды, метаклассы, опять же map и reduce.
После C++ это все на неделю развлечений. А потом становится скучно
Мощь Питона в библиотеках. Когда в гугле вбиваешь, что тебе надо и оно ВСЕГДА находится - вот где мощь
А с С++ разве не так? Всмысле библиотек.
Совсем не так. В C++ все всё прячут и кодом не любят делиться.
Открытость комьюнити Пайтона поражает после работы и поиска примеров кода на C++.
Ну в итоге-то оно так и получится
А про JavaScript - пока не слишком разделяю восторги по его поводу :/ . Сейчас у меня веб-приложение в разработке, и как-то не всё нравится после строго типизированных языков. Хотя многие наоборот ставят это в огромный плюс - может быть, опыта не хватает.
.
В общем, будем посмотреть, спасибо
Вы не любите кошек? Да вы просто не умеете их готовить!
А я и не спорю
.
.
Но всё равно пока считаю, что как минимум для некоторых задач - строго типизированные языки лучше
Первый раз после долгого времени Бишоп порадовал, т.к. начал писать про IT и программирование, а не про поднятие штрафов ГИБДД в 10 раз и про остальную хрень ради поднятия популярности своего блога.
А вообще идея с отдельным блогом хороша.)
Я и раньше про программирование писал, просто перемежал это с постами на другие темы
Но в какой-то момент стало ясно, что пора разделяться.
А вообще идея с отдельным блогом хороша.)
Посмотрим
Пока что тут многовато багов.
Несовсем так. То есть не полный ответ.
Знание языка это помимо синтаксиса, библиотек которыми вы оперируете еще и понимание внутренней кухни среды исполнения.
Вот тогда когда вы понимаете что ваши дизайн паттерны, которые так хорошо описали, совершенно не оптимизируются компилятором, просто не интересны в серезных алгоритмах и проектах.
Если говорить о прекрасном и сильном объектном языке то это шаблонный С++.
коменты режуться….
ммммммммммм вы точно можете быть уверены что понятние объекта в этом случае соовершнно оптимизированное опнятие для конкретного процессора и операционной системы.
Вот это вот - знать С++.
вот мой момментарий, и две строчки, одна маленькими буквами. следующая я заменю букву и на большую.
вот мой момментарий,
я не расчитывал что это будет воспинято руководством к действию
Забавно, режется именно большая буква И
Спасибо еще раз за наводку, пишу в саппорт плагина.
я думаю там проблема при редиректах, когда текст сообщения кодируется, да и наверно не в одной букве проблема…
можно порекомендовать пользователям портала писать все комментарии в base64, должно помоч.
а вообще завели бы журнал на блогпосте, бесплатный хостинг с кучей возможностей. как раз пуликойте там все технические вопросы, что я тут читаю мне интересны, в отличии от штрафов и того что тут еще было.
Считаю вообще не удачным ответом… Можно читать как личное узкое мнение автора…
Алгоритмы вывода большого количества данных в эти контролы для? А для компьютеров моей молодости? 

Я не говорил под какую операционную систему, т.е. если человек сказал что может то это значит под любую
Я знаю много ОС под часть которых вообще компилятора C/C++ нет 

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