it-roy-ru.com

Как я могу убедиться, что я на самом деле учусь программировать, а не просто изучаю детали языка?

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

Как я могу убедиться, что я на самом деле учусь как программировать, а не просто изучаю детали языка? И как я могу развить навыки программирования, которые можно применять ко всем языкам вместо одного?

83
Ryan

Не беспокойтесь о том, чтобы встретить какую-то нелепую концепцию "навыка", которая так часто встречается в таких высказываниях, как:

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

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

Это доказывается просто: потратьте одну неделю (или действительно любое количество времени, превышающее пару дней), пытаясь изучить основы Haskell , Prolog или Agda . Вскоре вы начнете слышать старую Улица Сезам песню, звучащую в вашей голове "Одна из этих вещей не похожа на другие ...".

Оказывается, существует целый ряд языков программирования, методов и подходов, которые настолько чужды, чем то, что 95% из нас делают или когда-либо делали. Многие совершенно не знают, что любая из этих других концепций вообще существует, и это прекрасно, и эти концепции не являются необходимыми, чтобы быть занятым и даже эффективным программистом.

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

Кроме того, я бы сказал, что в большинстве случаев, когда люди утверждают, что они изучают такие сложные вещи, как языки программирования, или могут изучать их так быстро, как неделя, они страдают от некоторого Dunning Kruger Effect , Wikipedia (выделение моя):

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

Я хотел бы отослать людей к этому более опытному взгляду на концепцию обучения программированию Питера Норвига: Учиться программировать за десять лет.

Исследователи (Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon & Chase (1973)) показали, что требуется около десяти лет для развития опыта в любой из самых разнообразных областей, включая игру в шахматы, музыку сочинение, телеграф, рисование, игра на фортепиано, плавание, теннис и исследования в области нейропсихологии и топологии. Ключевым моментом является совещательная практика: не просто делать это снова и снова, но ставить перед собой задачу, которая выходит за рамки ваших текущих возможностей, пробовать ее, анализировать свою эффективность во время и после выполнения и исправлять любые ошибки. Тогда повторите. И повторите еще раз.


Несомненно, существует набор всеобъемлющих принципов, которые сделают все языки простыми в изучении!

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

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

96
Jimmy Hoffa

... как я могу развить навыки программирования, которые можно применять ко всем языкам, а не только к одному?

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

WAT?

Опытные программисты полиглотов думают в абстрактном синтаксическом дереве (AST) своей собственной ментальной модели языка. Кто-то не думает "мне нужен цикл for здесь", а скорее "мне нужно циклически перезаписать что-то" и переводит его в соответствующий, или while, или итератор, или рекурсию для этого языка.

Это похоже на то, что можно увидеть при изучении разговорного языка. Люди, которые говорят на многих языках свободно, думают значение , и это выходит на данном языке.

Можно увидеть некоторую подсказку об этом AST в паре видео с отслеживанием глаз Понимание кода с отслеживанием глаз и Эксперимент по отслеживанию глаз (новичок), где движения глаза начинающего и опытного программиста Можно наблюдать, как опытный программист "компилирует" код в свою ментальную модель и "запускает" его в своей голове, в то время как новичку приходится перебирать код по ключевому слову за ключевым словом.

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

Если у вас есть такая возможность использовать AST в голове, изучение другого языка в рамках аналогичной школы мысли (переход к Befunge - это небольшой прыжок с Java) , но не так сильно, поскольку Forth ) становится намного проще - это просто "перевод" AST на новый язык, который намного легче 3-го, 4-го и 5-го ( и т.д ...) раз это сделано.


Есть классическая статья, Настоящие программисты не используют Pascal. Часть этого гласит:

... Настоящий Программист может писать программы на Фортране на любом языке

Есть также биты, для которых вы не можете просто использовать ментальный AST - вам нужно думать и на языке тоже. Это занимает немного времени, чтобы выполнить (я все еще обвиняюсь в написании Perl код в Python и мой первый LISP код был рассмотрен со словами "Это очень хорошая программа на Си. ").

На это я должен указать на статью, опубликованную ACM, Как не писать фортран на любом языке. Третий абзац статьи (это не ведущие кавычки) напрямую касается рассматриваемого вопроса:

Характеристики хорошего кодирования превосходят все языки программирования общего назначения. Вы можете реализовать хороший дизайн и прозрачный стиль практически в любом коде, если примените себя к нему. То, что язык программирования позволяет вам писать плохой код, не означает, что вы должны это делать. И язык программирования, который был разработан для продвижения хорошего стиля и дизайна, все еще может использоваться для написания ужасного кода, если кодер достаточно креативен. Вы можете утонуть в ванне с небольшим количеством воды, и вы можете легко написать совершенно нечитаемую и не поддерживаемую программу на языке без переходов или номеров строк, с обработкой исключений и универсальными типами и сборкой мусора. Пишете ли вы на Fortran или Java, C++ или Smalltalk, вы можете (и должны) выбрать хороший код вместо плохого.

Не достаточно просто иметь AST - необходимо иметь AST), который можно перевести на другие языки. Наличие Фортрана AST в вашей голове и написание кода на Фортране в Java не очень хорошая вещь. Нужно также быть достаточно знакомым с языком и его идиомами, чтобы иметь возможность думать на языке (несмотря на то, что я сказал на самом верху).

Я видел Java код, написанный кем-то, кто не прекратил писать код на C. Был один объект с основным методом. В этом объекте было несколько статических методов, вызываемых main и ​​частные внутренние классы, которые имеют открытые поля (и, таким образом, очень похожи на Struts). Это был код C, написанный на Java. Все, что было сделано, - это перевод синтаксиса с одного языка на другой.

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

Единственный способ добиться этого - развить навыки программирования, которые можно применять ко всем языкам, - это продолжать изучать языки и сохранять этот язык ментального программирования гибким, а не связанным с одним языком.

(Мои извинения ChaosPandion за большие заимствования у идея, которую он представил .)

51
user40980

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

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

И да, вы откроете для себя языки наподобие Haskell, которые научат вас чему-то новому, когда вы прочно освоите основы.

Некоторые программисты, вероятно, думают, что все языки одинаковы, потому что они не сталкивались с тем, что заставляет их думать иначе. Все наиболее часто используемые языки являются производными от ALGOL (они, по сути, являются процедурными языками), и большинство из них являются языками с фигурными скобками, похожими на C. Все они делают в основном те же вещи, хотя некоторые из них более сложны, чем другие.

12
Robert Harvey

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

Некоторые языки предлагают другие парадигмы программирования, такие как объектная ориентация, управляемая событиями, многопоточная и основанная на MVC-инфраструктуре. Это всего лишь модели и шаблоны, которые не имеют ничего общего с реализацией.

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

Я программирую уже 30 лет (OMFG!) И до сих пор использую php.net искать команды в PHP, потому что это не мой родной язык.

Я бы сказал, что знание языков обратно пропорционально тому, как часто вы смотрите руководство или стекопоток. Опыт в программировании заключается в том, насколько легко вы решаете проблемы способом, совместимым с языками программирования.

В связанных новостях я узнал Ruby на прошлой неделе. Хотя я не "эксперт", я могу решить проблему, которую я мог бы написать, скажем, на Perl, а затем потратить целую вечность, переводя ее to Ruby, пока я изучаю это немного больше.

5
stevemarvell

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

Я думаю, что вы можете легко провести параллель с чем-то вроде обучения игре на гитаре. Любой хороший музыкант может научиться играть новую песню за очень короткий промежуток времени, потому что он уже знает все аккорды и всю теорию, почему аккорды звучат так, как они есть. Как они получают это хорошо? Они просто сыграли так много песен, что все образцы просто слились воедино, и в то же время дополнили свои знания фактической документированной теорией, что эти образцы тоже подписаны.

Так что, может быть, вы можете сыграть несколько песен очень хорошо, но вы не можете быстро отклоняться или подбирать новые песни. Это, вероятно, эквивалент программиста .NET , который продолжает делать одно и то же приложение CRUD снова и снова, в какой-то момент попробуйте что-то новое, добавьте в некоторые вызовы веб-службы или расширенный пользовательский интерфейс или напишите на совершенно новом языке. Когда вы натолкнетесь на загадку, посмотрите, почему все происходит так, как они это делают, задайте вопросы о Stack Exchange и т.д. В конце концов, вы увидите все шаблоны, которые постоянно возникают, и узнаете некоторые основные теории, и изучение нового языка не даст кажется почти таким же пугающим.

3
KDiTraglia

Я не собираюсь говорить о том, сколько времени занимает изучение языка или что это значит для изучения языка, вместо этого я собираюсь рассмотреть вашу актуальную проблему: как определить, научились ли вы программировать или изучили язык программирования? ,.

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

Это не означает, что вы должны программировать на Фортане, когда используете LISP, или суммировать значения столбца в таблице в БД, используя курсор. Просто этот язык - деталь реализации. Тот, который может изменить то, какие процессы необходимы, но не необходимость идентифицировать и создавать процессы - в конце концов, есть реальная реализация, с вводом/выводом и желаемыми результатами.

1
jmoreno

Моя стратегия всегда была сосредоточена на чистых навыках, а не на конкретных навыках.

Вместо изучения специального синтаксиса Python (или любого другого языка)) для всего, что вы хотите делать, тратьте свои мозговые циклы на решение абстрактных задач, например, на то, как наилучшим образом решить каждую проблему в этой категории.

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

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

Вопреки тому, что было сказано во многих ответах, НЕ слушайте других программистов, вы новичок, и вы никак не можете отличить фальшивку от реальной сделки, поэтому вам лучше взять все с ложкой соли.

Вы хотите постоянно задавать вопросы и принимать их только тогда, когда решение является быстрым, элегантным и надежным.

1
Morg.

Я думаю, если вы можете мыслить аналитически, у вас есть хорошее начало.

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

Далее попробуйте решить свои проблемы. Попробуйте найти разные решения и сравнить их. Скорость и использование памяти являются обычно используемыми факторами, которые имеют значение. Обсудите ваши решения с другими программистами.

Прочитайте код других программистов и постарайтесь понять, почему они так решили проблему.

Вам также следует прочитать некоторые книги об алгоритмах, чтобы получить представление о стандартных подходах. Новые проблемы часто являются модификациями старых проблем.

Много практики и работы с кодом, также в командах, поможет вам постепенно повышать свои навыки.

Надеюсь, мое мнение ответит на ваш вопрос хотя бы частично.

0
MrSmith42

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

Тогда есть более практичный подход к программированию. Основной камень преткновения, который люди чумы обычно обозначают как "не очень хорошие программисты", заключается в том, что они действительно знают только один язык. И даже если они знают других, они программируют в них так же, как и на своем родном языке. Это цикл, который нужно разорвать, если они действительно хотят научиться программировать. Ответ по умолчанию - выучить хотя бы один язык из каждой парадигмы программирования. Так что изучайте OOP язык, функциональный язык, язык сценариев ... и т.д.) И под обучением я не имею в виду изучение синтаксиса . Вы изучаете язык, фактически используя его для создания чего-либо.

Лично, когда я хочу выучить новый язык, я использую Project Euler puzzlers. Я перехожу к головоломке, которую я уже решил на языке OOP (в качестве примера)), и пытаюсь решить ее, используя функциональную, пытаясь следовать лучшим практикам нового языка. вы решаете одну и ту же проблему, используя два принципиально разных подхода, вы не только видите, в чем настоящие различия, но и показывают, где находятся общие области. Эти общие области, которые являются общими для всех языков, являются реальными программирование , отличия просто разные способы его достижения.

0
System Down

В моем случае я учусь программировать с помощью следующего:

  1. Учитесь у мастеров. Слушайте подкасты по программированию, читайте профессиональные блоги по выбранной вами теме программирования, читайте/смотрите замечательные учебники, сделанные гуру, разбросанные по всему Интернету, и, наконец, читайте эпические книги, такие как Прагматичный программист . В этой книге много жемчужин программирования, которые были накоплены на протяжении всей карьеры авторов. Один верный способ узнать, как на самом деле кодировать, это узнать, как это делают другие успешные программисты.
  2. Опыт делаю. Чтение об этом и знание - это одно, а практическое применение и заставить его работать - это другое. Нет лучшего учителя, чем опыт, поэтому наденьте шапку кодирования и начните.
  3. Спросите кого-нибудь, кто знает. Так же, как вы делаете сейчас, не бойтесь спрашивать о лучших методах или лучших способах сделать что-то от старших в вашей команде, или если вы достаточно неудачливы, чтобы не иметь доступа к упомянутым старшим, наставникам или гуру, тогда есть еще остальная часть stackexchange и интернет, чтобы спросить.

Кроме того, как уже упоминали ваши комментаторы, не забудьте освоить и свои инструменты. Изучение всех лучших практик и величайших теорий ни к чему, или они будут плохо реализованы, если вы недостаточно знаете свой инструмент, в данном случае язык программирования.

0
Maru

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

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

Просто рассмотрите группу известных мастеров-мечников, внезапно отложили свои мечи и отправились в бой с копьями после 7-дневной тренировки. Что случилось бы? Они будут убиты.

Языки часто не сложны в изучении, но для того, чтобы хорошо научиться, требуются терпение и упражнения. Кроме того, нет никакого правильного способа изучения программирования.

Обучение программированию похоже на ролевую игру. Иногда вы используете мечи, иногда копья, иногда щит. За каждого убитого врага вы получаете очки опыта. Как только у вас будет достаточно очков опыта, вы повышаете свой уровень. Теперь овладение мечом не сделает вас отличными с луками и стрелами. Но часть полученного ранее опыта увеличит вашу выносливость и скорость.

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

  • Читайте о языке. если это звучит интересно, попробуйте приложение (-и) hello world самостоятельно.
  • Прочитайте некоторые учебники, трюки, блоги.
  • Сделать простые приложения в нем просто для удовольствия.
  • Проверьте различные функции.
  • Если вам действительно это нравится, купите несколько книг и/или видеоуроков.
  • Ищите хорошие библиотеки.
  • Ищите ответы, спрашивайте, только если вы не можете найти ответы.
  • Помогайте другим просить ответы (где лучше, чем здесь?)
  • Сделайте что-нибудь полезное. Создание приложения для калькулятора может быть хорошим упражнением, но если вы создаете приложение TO-DO со списком и фактически используете его на своем ПК/телефоне, ощущение в 100 раз удовлетворительное.

Знакомьтесь с новыми языками, изучайте новые библиотеки, изучайте новые трюки в свободное время. Прежде чем вы это узнаете, вы удивите себя своим собственным умением.

0
Sayem Shafayet