Я часто слышу, что настоящий программист может легко выучить любой язык в течение недели. Мне говорят, что языки - это всего лишь инструменты для достижения цели. Программирование - это высший навык, который нужно освоить и освоить.
Как я могу убедиться, что я на самом деле учусь программировать, а не просто изучаю детали языка? И как я могу развить навыки программирования, которые можно применять ко всем языкам вместо одного?
"What do you mean you're not an expert in LanguageX?!? I can learn a language in a Week!"
, 1 неделя спустя:"See, I've learnt the language, and here's a Hello World example I copied from Wikipedia to prove it!"
Ответы:
Не беспокойтесь о том, чтобы встретить какую-то нелепую концепцию «навыка», которую обычно можно услышать в таких высказываниях, как:
Все эти утверждения основаны на ошибочной предпосылке и указывают на недостаток опыта в более широком спектре языков программирования. Это очень распространенные утверждения, в которые твердо верят многие программисты. Я не буду оспаривать это, но буду оспаривать их точность.
Это доказывается просто: потратьте одну неделю (или даже любое количество времени, превышающее пару дней), пытаясь изучить основы Haskell , Prolog или Agda . Вскоре после того, как вы услышите старую песню « Улица Сезам», вы услышите в своей голове «Одна из этих вещей не похожа на другие ...».
Оказывается, существует целый ряд языков программирования, методов и подходов, которые настолько чужды, чем то, что 95% из нас делают или когда-либо делали. Многие совершенно не знают, что любая из этих других концепций вообще существует, и это прекрасно, и эти концепции не являются необходимыми, чтобы быть занятым и даже эффективным программистом.
Но факт остается фактом: эти методы и подходы существуют, они хороши для многих разных вещей и могут быть очень полезными, но они не просто такие, к которым вы привыкли, и люди не могут просто взять их с полдня возни.
Кроме того, я бы сказал, что в большинстве случаев, когда люди утверждают, что у них есть или они могут выучить такие сложные вещи, как языки программирования, так быстро, как неделя, они страдают от небольшого эффекта Dunning Kruger , Wikipedia (выделено мной):
Я хотел бы отослать людей к этому более опытному взгляду на концепцию обучения программированию Питера Норвига: научиться программировать за десять лет .
Несомненно, существует комплекс общих принципов, которые сделают все языки простыми в изучении!
Возможно, но я бы сказал, что этот набор принципов настолько велик, что почти всегда будут языки за пределами вашей недельной досягаемости. Когда вы добавляете новые концепции в список, с которым вы знакомы и с которым вам удобно, этот список языков, находящихся за пределами вашей досягаемости, может уменьшиться, но мне трудно поверить, что он когда-нибудь исчезнет. Список концептуальных вычислительных подходов к вещам настолько широк, что это сбивает с толку: от конкатенативных языков до векторно-ориентированных языков и языков, специализирующихся на искусственном интеллекте или метапрограммировании ( или языках, которые существуют полностью для поддержки регулярных выражений ).
Через десять лет вы сможете вообще программировать. Это означает, что вы можете написать несколько приличный код на каком-либо языке или стиле языков. Итак, через 10 лет вы готовы начать заниматься этими бесчисленными широкими сквозными концепциями на всю оставшуюся жизнь, и, если не считать Эдсгера В. Дейкстры , Дональда Кнута или Джона Д. Кармака , вы не доберетесь до всех из них.
источник
Ключ к этому вопросу - превзойти язык и думать не на том языке, на котором вы кодируете.
WAT?
Опытные программисты-полиглоты думают в абстрактном синтаксическом дереве (AST) своей ментальной модели языка. Кто-то не думает «мне нужен цикл for здесь», а скорее «мне нужно циклически перезаписать что-то» и переводит его в соответствующий, или while, или итератор, или рекурсию для этого языка.
Это похоже на то, что можно увидеть при изучении разговорного языка. Люди, которые говорят на многих языках, свободно думают значение , и оно выходит на данном языке.
Некоторый ключ к пониманию этого AST можно найти в паре видеороликов, посвященных отслеживанию движений глаз, с помощью Eye Tracking и Eye-Tracking Code Experiment (Новичок), где наблюдаются движения глаза начинающего и опытного программиста. Можно увидеть, как опытный программист «скомпилирует» код в свою ментальную модель и «запустит» его в своей голове, а новичку придется перебирать код по ключевому слову по ключевому слову.
Таким образом, ключ к вопросу о развитии навыков программирования, применимых ко всем языкам, заключается в изучении нескольких языков, чтобы можно было дистанцироваться от наличия ментальной модели одного языка и развить способность самостоятельно генерировать AST для проблемы в язык головы, который затем переводится на данный язык.
Как только у человека появляется возможность использовать AST в голове, изучение другого языка в рамках аналогичной школы мысли (переход на Befunge - это небольшой переход от Java, но не так много от Forth ) становится намного проще - это «просто» перевод AST на новый язык, который будет намного легче в 3-й, 4-й и 5-й (и т. д.) раз, когда это будет сделано.
Существует классическая статья « Настоящие программисты не используют Паскаль» . Часть этого гласит:
Есть также биты, для которых вы не можете просто использовать умственную АСТ - вам также нужно думать на языке. Это занимает немного времени (я все еще обвиняюсь в написании кода на Perl на Python, и мой первый код на Лиспе был рассмотрен с надписью «Это очень хорошая программа на Си»).
На это я должен указать на статью, опубликованную ACM, « Как не писать фортран на любом языке» . Третий абзац статьи (это не ведущие кавычки) непосредственно касается рассматриваемого вопроса:
Это не просто иметь AST - необходимо иметь AST, который можно перевести на другие языки. Иметь Fortran AST в своей голове и писать код на Fortran на Java - не очень хорошая вещь. Нужно также быть достаточно знакомым с языком и его идиомами, чтобы иметь возможность думать на языке (несмотря на то, что я сказал на самом верху).
Я видел код Java, написанный кем-то, кто не прекратил писать код на Си. Был один объект с основным методом. В этом объекте была куча статических методов, вызываемых
main
, и частные внутренние классы, которые имели открытые поля (и, таким образом, выглядели очень похоже на Struts). Это был C-код, написанный на Java. Все, что было сделано, - это перевод синтаксиса одного языка на другой.Чтобы преодолеть этот пункт, нужно продолжать писать код на нескольких языках, не думать на этих языках при разработке кода, а думать на них при переводе дизайна в код для правильной работы с языковыми идиомами.
Единственный способ достичь этого - развить навыки программирования, которые можно применять ко всем языкам, - это продолжать изучать языки и сохранять этот язык ментального программирования гибким, а не связанным с одним языком.
(Приношу свои извинения ChaosPandion за то, что он заимствовал из идеи, которую он представил .)
источник
Выберите язык и начните кодировать. Python - хороший выбор для начинающих, и в Интернете есть учебники , чтобы вы могли научиться делать это правильно.
Все следует из этого. Ваши интересы приведут вас к основам и концепциям дизайна, которые добавят изощренность вашим программам. Вы обнаружите, что есть онлайн-курсы, которые вы можете пройти, которые основывают вас на основах и теории, и что есть различные парадигмы программирования, которые вы можете исследовать, и так далее.
И да, вы откроете для себя языки наподобие Haskell, которые научат вас чему-то новому, когда вы прочно освоите основы.
Некоторые программисты, вероятно, думают, что все языки одинаковы, потому что они не сталкивались с тем, что заставляет их думать по-разному. Все наиболее часто используемые языки являются производными от Algol (по сути, это процедурные языки), и большинство из них являются языками с фигурными скобками, похожими на C. Все они делают в основном те же вещи, хотя некоторые из них более сложны, чем другие.
источник
Программирование - это решение проблем таким образом, что решение может быть выражено в такой ограниченной грамматике, что оно может быть реализовано с помощью языка программирования. Поэтому искусство программирования - это искусство решения проблем.
Некоторые языки предлагают другие парадигмы программирования, такие как объектная ориентация, управляемая событиями, многопоточная и основанная на MVC инфраструктура. Это всего лишь модели и шаблоны, которые не имеют ничего общего с реализацией.
Если вы можете решить проблему на бумаге таким образом, чтобы ее можно было легко перевести в код и связать с подходящей моделью для вашей платформы, то вы программист. Если все, что вы можете сделать, это взять эти решения и реализовать их на выбранном нами языке, тогда это другое дело.
Я программирую 30 лет (OMFG!) И до сих пор использую
php.net
для поиска команд в PHP, потому что это не мой родной язык.Я бы сказал, что знание языков обратно пропорционально тому, как часто вы смотрите руководство или стекопоток. Опыт в программировании - это то, насколько легко вы решаете проблемы способом, совместимым с языками программирования.
В связанных новостях я узнал Ruby на прошлой неделе. Хотя я не «эксперт», я могу решить для вас проблему, которую я мог бы написать, скажем, на Perl, а затем потратить целую вечность, переводя ее на Ruby, пока я изучаю ее еще немного.
источник
Я думаю, что, как и во всем, практика совершенствуется. Только не пытайтесь всегда делать одно и то же или всегда использовать один и тот же язык и продолжать изучать вещи в каждом проекте.
Я думаю, что вы можете легко провести параллель с чем-то вроде обучения игре на гитаре. Любой хороший музыкант может научиться играть новую песню за очень короткий промежуток времени, потому что он уже знает все аккорды и всю теорию, почему аккорды звучат так, как они есть. Как они получают это хорошо? Они просто сыграли так много песен, что все образцы просто слились воедино, и в то же время дополнили свои знания фактической документированной теорией, на которую подписываются и эти образцы.
Так что, может быть, вы можете сыграть несколько песен очень хорошо, но вы не можете быстро отклоняться или подбирать новые песни. Это, вероятно, эквивалент программиста .NET, который продолжает делать одно и то же приложение CRUD снова и снова, в какой-то момент пробовать что-то новое, добавлять вызовы некоторых веб-служб или расширенный пользовательский интерфейс или писать его на совершенно новом языке. Когда вы натолкнетесь на загадку, посмотрите, почему все происходит так, как они это делают, задайте вопросы по Stack Exchange и т. Д. В конце концов, вы увидите все шаблоны, которые постоянно возникают, и узнаете некоторые основные теории, и изучение нового языка не даст кажется почти таким же пугающим.
источник
Я не собираюсь говорить о том, сколько времени занимает изучение языка или что это значит для изучения языка, вместо этого я собираюсь рассмотреть вашу актуальную проблему: как определить, научились ли вы программировать или изучили язык программирования ,
Вы научились программировать, если научились разбивать проблему на отдельные процессы, а затем использовать эти процессы для решения своей проблемы. Вы изучили язык программирования, если вы изучили синтаксис языка и знаете, как настроить процесс, если он реализован на этом языке.
Это не означает, что вы должны программировать на Fortan при использовании Lisp или добавлять значения столбца в таблицу в БД с помощью курсора. Просто этот язык - деталь реализации. Тот, который может изменить то, какие процессы необходимы, но не необходимость идентифицировать и создавать процессы - в конце концов, есть реальная реализация, с вводом / выводом и желаемыми результатами.
источник
Моя стратегия всегда была сосредоточена на чистых навыках, а не на конкретных навыках.
Вместо того, чтобы изучать специальный синтаксис Python (или любого другого языка) для всего, что вы хотите делать, тратьте свои мозговые циклы на решение абстрактных задач, таких как, как лучше всего решить каждую проблему в этой категории.
Таким образом, вы будете знать, что делать, независимо от языка, и будете в основном обладать неподвластными времени навыками, которые можно использовать для программирования на любом языке.
В частности, избегайте инструментов, которые содержат множество ошибок, таких как MySQL, или таких самоуверенных языков, как Java, поскольку все, что вы изучите с помощью этих инструментов, будет иметь значительную долю знаний по конкретным инструментам, которые быстро станут бесполезными.
Вопреки тому, что было сказано во многих ответах, НЕ слушайте других программистов. Вы новичок, и вы никак не можете отличить фальшивку от реальной сделки, поэтому вам лучше взять все с ложкой соли.
Вы хотите постоянно задавать вопросы и принимать их только тогда, когда решение является быстрым, элегантным и надежным.
источник
Там теоретический подход. Узнать о том, как на самом деле работают компьютеры под прикрытием. Как базовые инструкции процессора связаны друг с другом, чтобы сделать более сложные операции и структуры, которые мы принимаем как должное в области программирования высокого уровня.
Тогда есть более практичный подход к программированию. Основной камень преткновения, который люди чумы обычно обозначают как «не очень хорошие программисты», заключается в том, что они действительно знают только один язык. И даже если они знают других, они программируют в них так же, как и на своем родном языке. Это цикл, который нужно разорвать, если они действительно хотят научиться программировать. Ответ по умолчанию - выучить хотя бы один язык из каждой парадигмы программирования. Поэтому изучайте язык ООП, функциональный язык, язык сценариев ... и т. Д. И под изучением я не имею в виду изучение синтаксиса . Вы изучаете язык, фактически используя его для создания чего-либо.
Лично, когда я хочу выучить новый язык, я использую загадки Project Euler . Я перехожу к головоломке, которую я уже решил на языке ООП (в качестве примера), и пытаюсь решить ее, используя функциональную, пытаясь следовать лучшим практикам нового языка. Когда вы решаете одну и ту же проблему, используя два принципиально разных подхода, вы не только видите, в чем настоящие различия, но и показывают общие области. Эти общие области, которые являются общими для всех языков, являются настоящим программированием , различия - это просто разные способы достижения этого.
источник
Ну, большинство вещей, которые я хотел сказать, уже было сказано. Я хотел бы добавить очень простую аналогию.
Если языки программирования считаются простыми инструментами, даже тогда нет никакой логики в том, чтобы быть хорошим в одном - значит быть хорошим в другом - легкой прогулкой.
Языки часто не сложны в изучении, но для того, чтобы хорошо научиться, требуются терпение и упражнения. Кроме того, нет правильного способа научиться программированию.
Вот пара вещей, которые вы можете захотеть сделать при изучении языка.
Знакомьтесь с новыми языками, изучайте новые библиотеки, изучайте новые трюки в свободное время. Прежде чем вы это узнаете, вы удивите себя своим собственным умением.
источник
В моем случае я учусь программировать с помощью следующего:
Кроме того, как уже упоминали ваши комментаторы, не забывайте осваивать и свои инструменты. Изучение всех лучших практик и величайших теорий ни к чему или будет плохо реализовано, если вы недостаточно знаете о своем инструменте, в данном случае - языке программирования.
источник
Я думаю, если вы можете мыслить аналитически, у вас есть хорошее начало.
Изучайте любой язык, который вы хотите, и работайте самостоятельно, используя ряд примеров, например, как представлено в почти любой книге, которая учит программированию.
Далее попробуйте решить свои проблемы. Попробуйте найти разные решения и сравнить их. Скорость и использование памяти являются обычно используемыми факторами, которые имеют значение. Обсудите ваши решения с другими программистами.
Прочитайте код других программистов и постарайтесь понять, почему они так решили проблему.
Вам также следует прочитать некоторые книги об алгоритмах, чтобы получить представление о стандартных подходах. Новые проблемы часто являются модификациями старых проблем.
Много практики и работы с кодом, также в командах, поможет вам постепенно повышать свои навыки.
Надеюсь, мое мнение ответит на ваш вопрос хотя бы частично.
источник