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

103

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

Теперь я знаю, что опыт является одним из основных факторов, но как насчет изучения внутренних элементов языка, какова основная структура и т. Д.

Есть статьи, в которых говорится, что читайте эту книгу, читайте эту книгу, создавайте эту игру и эту игру. Но для меня это не значит овладеть языком. Я хочу иметь возможность читать код других людей и понимать его, независимо от того, насколько это сложно. Чтобы понять, когда использовать функцию, а когда другую, и т. Д. И т. Д.

Список можно продолжать и продолжать, но я верю, что сделал это правильно. :)

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

cprogcr
источник
11
Опыт - все, к чему это действительно сводится. Вся теория, в которой вы эксперт, бесполезна, если вы не сможете применить ее на практике.
Саймон Уайтхед
2
Реализуйте компилятор для этого языка. На самом деле, это мой любимый способ попробовать любой новый язык. Если это звучит слишком просто и скучно, попробуйте вместо этого определить формальную семантику языка, используя K-среду или что-то подобное.
SK-logic
6
«Человек, картошка - это динозавр, автомобильная вселенная». не имеет значения, насколько хорошо вы владеете языком, если код плохой и не имеет смысла, его все равно трудно понять.
Ренато Динхани
2
Я чувствую, что немного упускаю суть. Языковые языки развиваются, поэтому язык не овладевает, вы растете вместе с ним, чем больше вы его используете, тем больше вам нужно учиться.
nycynik
2
Код и читать код. Возьмите случайную часть ядра Linux (программирование на C) и выясните, что делает функция.
Алекс Харт

Ответы:

166

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

  • Используйте язык весь день, каждый день. Обычно это означает, что вы работаете на языке полный рабочий день.

  • Прочитайте все, что вы можете о языке. Особенно "лучшие практики" и идиомы.

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

  • Работайте с чужим кодом! Нет более быстрого способа научиться тому, чего не следует делать на языке, чем убирать за тем, кто сделал что-то ужасное.

  • Поддержите код, который вы пишете - каждая ошибка становится путеводителем по вашим худшим решениям!

  • Изучать информатику и языки в целом

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

  • Научитесь использовать рамки и API, доступные для этого языка.

  • Потратьте время, чтобы сделать свои собственные эксперименты с языком. SICP не применим к C, но отношение к изучению языка путем проверки его пределов является очень продуктивным.

  • Прочитайте историю языка, чтобы узнать, почему он был таким, какой он есть.

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

  • Занять урок по языку.

  • Учите язык другим (спасибо Брайану Оукли )

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

ГленПетерсон
источник
76
+5 за поддержку кода, который вы пишете - каждая ошибка становится проверкой ваших худших решений!
Дженнифер С.
8
+1 исключительно за последнее предложение:Every technique you use to learn brings and additional perspective to your understanding.
Изката
1
@Izkata: OMG, я написал это? Я на самом деле носитель английского языка! Я исправил это. Спасибо!
ГленПетерсон
2
@GlenPeterson ... На самом деле, я просто скопировал вставленный, не обращая особого внимания на то, что предложение "выкл". +1 был действительно для намерения за этим. = P
Изката
13
+1 за «Изучение совсем другого языка. Отличным дополнением к Си мог бы стать такой функциональный язык, как Лисп. Это изменит ваш взгляд на процедурный язык наизнанку». - это, наверное, самое главное. Это поможет вам узнать, как узнать о программировании (то есть что искать в какой ситуации).
naught101
53

10000 часов практики - вот что нужно.

Прочитайте "Научите программировать за десять лет"

Ключевые моменты сверху:

  • Получить заинтересованы в программировании, и сделать некоторые , потому что это весело. Удостоверьтесь, что это будет достаточно забавно, так что вы будете готовы потратить свои десять лет / 10000 часов.
  • Программа. Лучший вид обучения - это обучение на практике.
  • Общайтесь с другими программистами; читать другие программы.
Vartec
источник
1
Вот что я собирался опубликовать! Я не провел достаточно часов на P.SE, очевидно.
Мартин Питерс
@MartijnPieters: :-D
Vartec
8
Отличное название для книги! Я не могу дождаться продолжения "Научите себя хорошо программировать за 20 лет!"
ГленПетерсон
16
Тем не менее, вы должны убедиться, что вы не повторяете те же 10 часов 1000 раз ...
Izkata
Никакие технические знания не помогут кому-то узнать, для чего нужно автоматизировать или создать программу. Это все равно что сказать - иди в спортзал и делай все основные упражнения в баскетболе по десять лет, по 1 часу в день. Пуф! Вы суперзвезда баскетбола (мастер) ... нет, это больше, чем просто техническое мастерство. Поэтому я не считаю это ответом на вопрос, т. Е. Как стать мастером? Это может быть частью решения, но это не волшебное зелье для мастерства. Я знаю - я не мастер!
oemb1905
36

НИКОГДА не считайте себя мастером всего языка, пока вы не освоите лучший язык, чем этот. Это означает, что для изучения того, как конкретный язык работает снизу, возьмите книгу, которая научит вас концепциям компилятора / интерпретатора языка. Например:

  • C: LCC Compiler book

  • C ++: проектирование и развитие C ++ (а затем продолжайте сборку собственного компилятора C ++ или, по крайней мере, поймите реализацию его с использованием кода компилятора GNU C ++)

  • Java: получите "Inside JVM" и получите исходный код javac. .C код "Java" также полезен

  • Python: реализация CPython.

  • ObjectiveC: Практически любой материал от Apple о внутреннем окружении среды выполнения ObjC и исходных кодов компилятора поможет вам.

  • Lisp: SICP Book (обучает вас Scheme и базовому интерпретатору-компилятору для языка, похожего на lisp): Lisp in Small Pieces (еще одна хорошая книга).

Аникет Инге
источник
1
Теперь это то, что я называю ответом. Я уже принял один, но это заслуживает «лучшего ответа», если бы это было немного раньше
cprogcr
2
Вы понятия не имеете, насколько ваш ответ помог. Я читаю о книгах, которые вы упомянули, и они мне нужны.
cprogcr
хе-хе, я учился у них. Рад помочь :-)
Аникет Инге
так как вы упомянули C в качестве примера, позвольте мне дать вам в качестве подарка названия еще двух книг, которые я использовал для изучения C, как тыльной стороны моей руки): 1. OOC.PDF (свободно доступный онлайн) и 2. Книга Minix (хотя книга разработчиков ОС, это то, что Линус Торвальдс прочитал перед внедрением Linux)
Aniket Inge
1
да, Эндрю Тененбаум, это книга. Любое издание хорошо читать. Он не говорит вам, как работает «C», но когда вы видите, как реализована библиотека C для работы с операционной системой, которую вы создали, вы начинаете понимать C еще лучше! Может быть, достаточно, чтобы позволить вам изменить его. (И вот тут приходит OOC)
Aniket Inge
12

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

TMN
источник
1
Когда я учился в колледже, я решил, что «освоил» язык, как только напишу на нем понг. Это работало довольно хорошо, пока я не выучил MIPS. У меня все еще есть кошмары.
Родди из замороженного гороха
Сайт на С можно сделать?
BigSack
10

Я сделаю это легко для вас. Вы никогда не овладеете языком. Период. Если вы думаете, что у вас есть, то вы, очевидно, нет. Нет вершины горы, к которой вы внезапно добрались и сказали: «Ну, теперь я полностью освоил этот язык. Что теперь?» Даже опытные программисты, которые десятилетиями работают с одним и тем же языком, скажут вам, что иногда они сталкиваются с новыми идеями, процессами, практиками и т. Д. Истинная цель - овладеть вашим концептуальным пониманием языка или языков. Способность изучать новые концепции и скорость, с которой вы можете применять новые или измененные функции в языке, гораздо важнее, чем постоянное знание каждого ключевого слова и синтаксиса. Перестаньте беспокоиться о «овладении» языком и просто беспокойтесь о постоянном улучшении и улучшении качества и эффективности вашего кода.

Крис Пратт
источник
2
The true goal is to master your conceptual understanding of a language or languages.Именно так. Это то, что я действительно имел в виду.
cprogcr
Любой язык программирования конечно. Он построен из конечного числа понятий, требует конечного числа идиоматических трюков. Поэтому легко освоить любой язык. Конечно, невозможно овладеть программированием в целом, всегда есть потенциал для дальнейшего улучшения, но вопрос конкретно о конкретном языке .
SK-logic
SK-логика: меняются языки программирования, а также их библиотеки и среды. В результате меняется и способ работы с языком. Например, jQuery изменил способ работы с Javascript.
2012 года
Вероятно, это правда, что никто не может действительно овладеть языком, таким как C ++, но для таких минималистичных, как Scheme, это должно быть вполне возможно - как говорит @ SK-logic, на самом деле программирование на любом языке не может быть освоено, потому что область применения бесконечна.
оставил около
1
@ nightcracker, языки не "развиваются". С99 всегда будет С99 и никогда не изменится. C ++ 11 всегда будет оставаться C ++ 11, даже после того, как его заменит язык следующего поколения. Среды действительно "развиваются", да, но jQuery не представил никаких новых методов, неизвестных ранее сообществам других языков. Они были плохо знакомы только с узким сообществом Javascript.
SK-logic
5

Вы уже знаете ответ на этот вопрос

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

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

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

Там нет волшебной пули ...

Murph
источник
2

Начните с чтения и понимания, что такое SDLC (иначе говоря , жизненный цикл разработки программного обеспечения). Это итеративный процесс, который включает в себя самосовершенствование, обучение,**practicing, practicing...**

введите описание изображения здесь

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

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

Е.Л. Юсубов
источник
1
Благодарю. Я уже выбрал ответ, когда прочитал это, но обязательно приму ваш совет.
cprogcr
Не знаю, почему проголосовали, пожалуйста, дайте мне знать, что нужно улучшить.
Е.Л. Юсубов
2

Там нет замены для опыта. Для того, чтобы овладеть чем-то, вы должны делать это / использовать, для многих разных вещей.

Поэтому используйте этот язык для упражнений (например, Project Euler ) и личных проектов, вещей, которые вам действительно нужны, или вещей, которые вы просто считаете интересными. Написать игру, написать веб-приложение, написать парсер, все что угодно. И на каждом этапе старайтесь понять, что вы делаете, а не просто вставлять код или следовать инструкциям.

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

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

Майкл Боргвардт
источник
2

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

На среднем уровне выучите разные техники и парадигмы. Чем больше в вашем репертуаре инструментов, тем больше возможностей для вас. Если вы изучали только Java, Python и Ruby, вы попали в очень небольшую часть пространства программирования. Изучите императивное и функциональное программирование, изучите пролог и J. Идея состоит не в том, чтобы «освоить» сто языков, а в том, чтобы узнать о различных способах решения одних и тех же задач.

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

Хосе Динунцио
источник
1

Могу ли я сделать пару предложений?

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

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

Николас Сибсон
источник
0

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

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

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

Надеюсь, это поможет!

hsnm
источник
0

Я бы добавил два пункта в список Глена

  • Постарайтесь решить сложную проблему, которая есть у других, например, дать ответы на SO
  • Читайте языковые дизайнеры в блогах / книгах. Это лучший источник глубоких знаний. Вы бы знали, что за дизайнерское решение стоит за причиной X.
Лукаш Мадон
источник
0

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

Например, написание программы, которая читает файл CSV, анализирует текст, а затем записывает его обратно во второй файл CSV со столбцами в обратном порядке.

Нравится,

Column1, Столбец2, Column3

в

Column3, Столбец2, Column1

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

Кроме того, я думаю, что @GlenPeterson сказал о,

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

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

Отличный язык для игры.

Дэн
источник
0

Вы не можете выучить язык из книги. Все, что вам нужно, это практика и практика. Не думайте, что Вы можете изучать язык из этой конкретной книги или из этого конкретного источника. Просто думайте, что язык программирования такой же, как человеческий язык. Вы не можете просто выучить английский или французский, читая определенную книгу. Все, что вам нужно, это использовать его в день, чтобы повседневная жизнь. Код с нуля, расширите его функциональность, постарайтесь создать что-то, что сделает вас немного довольным. И если вы думаете, что овладение языком - это знание всего языка и использование каждого элемента языка программирования в практическом кодировании ... ВЫ НЕ МОЖЕТЕ. Или даже если это возможно, это может занять 10-15 лет.

Sumit
источник