Идеальная последовательность изучения языка программирования? [закрыто]

17

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

NB: Это порт вопроса, который я задал в stackoverflow и был закрыт за субъективность и спор.

Gulshan
источник
Отличный вопрос Какие ответы были бы, если бы этот вопрос был ориентирован на производительность? Мне любопытно: programmers.stackexchange.com/questions/16323/... : D
JoeBilly
4
Я ПОЛНОСТЬЮ удивлен и восхищен тем, что Лисп часто появляется на высокопоставленных вопросах.
Инамати
1
Этот вопрос также был задан здесь (хотя я думаю, что этот вопрос пришел первым): programmers.stackexchange.com/questions/41720/…
oosterwal
Необходимо
Гулшан

Ответы:

26

Python, Lisp, C, Haskell

Предполагая, что вопрос был об идеальной последовательности обучения для новичков в программировании (поскольку у опытных программистов будет своя (вероятно, случайная) последовательность обучения), я бы предложил прочитать эссе Норвиг о том, как изучать программирование за 10 лет , а затем:

  1. Python : Начните с динамического, высокоуровневого, функционального и функционального языка. Потому что для новичков очень важно чувствовать себя продуктивно как можно скорееи не быть отключенным инопланетным синтаксисом, отсутствием библиотек, отсутствием мультиплатформенности, отсутствием учебных ресурсов и отсутствием сообщества. Python отлично читается, имеет множество хороших библиотек (особенно научных библиотек - современный ученый / инженер должен знать, как программировать), легко запускается из большинства операционных систем, имеет множество учебных пособий и целых бесплатных книг и, как правило, удобен для пользователя. - все еще будучи достаточно мощным, чтобы расти вместе с вами, когда вы становитесь продвинутым программистом, работающим над большими проблемами. Также важно закрепить важные и полезные соглашения для начинающих: читаемость кода важна, и вы должны писать код для себя и других, чтобы они могли легко понять.

  2. Лисп: В частности, по крайней мере, пролистайте «Структуру и интерпретацию компьютерных программ» или посмотрите видео SICP и откройте широко открытые глаза, увидев основы и выразительную мощь программирования - можно сделать так много с таким небольшим. Узнайте, как Lisp может выражать не только функциональную парадигму, но и ОО, логическую / декларативную и многое другое - например, создание новых предметно-ориентированных языков. Прочитайте PAIP Норвига, чтобы увидеть, что мастер может сделать с языком. Тогда проверьте Clojure , современный диалект Lisp, который может быть одним из Next Big Things.

  3. C: Только потому, что это язык общения. :) Возможно, необязательно в наши дни, если вы в основном программист в определенной непрограммной области. Я нахожу это уродливым, но стоит знать о том, как оценить базовое оборудование. Пойдите с K & R , конечно.

  4. Haskell : Чистая функциональная сила. Где нынешний Com.Sci. теория и практическая выразительная сила встречаются. Смотрите Реальный Мир Haskell .

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

альтернативный текст

оборота лимит
источник
Я бы (естественно) заменил Smalltalk на Python на # 1, но я говорю, что зная, что Python (a) чрезвычайно популярен, чем Smalltalk, и что (b) заставить Smalltalk общаться с другими языками так же сложно, как и в Java То есть достаточно сложно расстроить новичка. «Сценарий» Python выглядит довольно большим преимуществом.
Фрэнк Шиарар
Я согласен с вашим заявлением о производительности. Я думаю, что изучение C как абсолютного первого языка - это куча глупостей. Но это определенно должно быть где-то в стеке.
Марк Канлас
+1 Я не уверен, должен ли Хаскелл быть на вершине, но, если честно, я еще не знаю этого, и он следующий в моем списке, так что он может оказаться последним языком, который я выучу.
Инамати
2
1-клик для просмотра в полном размере @ i54.tinypic.com/168ity1.jpg
Майк Кларк
Я бы +1 это, если C не было в списке
Balog Pal
28

Вот как я бы это сделал:

  1. Python (или Ruby или Lua): интерпретируемый язык, без типов, вы можете выполнить работу в несколько строк. Огромная библиотека (я думаю, Python лучше для этого). Вы можете углубиться в алгоритмы, потому что нет отвлекающих факторов. Компиляция не требуется, просто запустите. Кроме того, с Python вы неявно учите хорошему стилю, поскольку отступы в Python являются обязательными. Вы также можете научить объектной ориентации (в Lua это большая проблема). Цель здесь - весело провести время и показать студенту, что можно сделать.

  2. C ++ (или, может быть, Java): типизированный, быстрый язык. Если вам нужна объектная ориентация, то вы уже знаете некоторые понятия. Основная идея состоит в том, чтобы «перевести» то, что вы сделали в Python, и сделать это с новыми ограничениями (в основном, типами). Теперь, если у вас есть правильные концепции, добавление типов не является такой проблемой. Следующим шагом является более низкий уровень мышления (Java здесь не помогает) и хорошее обучение указателям . Под этим я подразумеваю объяснение адресного пространства, ЦП, ОС, чтобы вы могли начать видеть под своей программой. Скомпилированный язык вводит различие между интерпретацией и компиляцией, очень полезно объяснить, что такое машинный язык и т. Д.

  3. Сборка : Наконец, никакой магии, просто поговорите с машиной. Есть дебаты по поводу синтаксиса Intel и GAS, это не важно. Если у вас есть MIPS, я считаю, что он лучше подходит для обучения, но я полагаю, что x86 удобнее, поскольку он более распространен (x86_64 лучше, поскольку имеет больше регистров и тонкостей). Вы просто должны устранить некоторые сложности и позволить студентам продолжить расследование, если они захотят.

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

  1. Схема (или Common Lisp или Clojure): Как сказал @dukeofgaming, языки Lisp позволяют хорошо учить рекурсии (для этой Схемы лучше, поскольку не имеет явных циклов). Но я бы пошел и научил двум другим вещам: замыкания и макросы. Макросы - это то, что отличает языки Lisp от других. Лично мне не нравятся макросы Scheme, но это не так уж важно. Например, я думаю, что макросы Clojure хороши (но рекурсия в Clojure не так чиста, поскольку у JVM нет хвостовой рекурсии). Замыкания являются очень важной концепцией, когда вы их получаете, вы мгновенно «видите» Javascript. Изучив C ++, Python и Lisp, Javascript становится «тривиальным».

  2. Haskell : Для функционального языка я не думаю, что вы можете победить Haskell. Lisp и Scheme считаются функциональными, но чтобы подчеркнуть функциональное программирование, вы должны заставить учеников мыслить без состояния. У Haskell есть и другие очень приятные вещи, такие как каррирование и сопоставление с образцом для «деструктурирования». Я немного знаю Haskell, но лаконичность кода, который вы можете написать, просто великолепна. Хорошее знание Хаскеля делает путь к пониманию Эрланга намного проще.

  3. Далее : язык стеков. Это снова полностью нарушает вашу логику (если Лиспу и Хаскеллу было недостаточно). Я бы пошел так далеко, чтобы преподавать Джонс Форт, так как они знают сборку, и тогда вы сможете полностью понять, что происходит. (Knowing Forth открывает PostScript, например.)

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

При желании вы можете изучить эти:

  1. SmallTalk : чисто объектно-ориентированный язык. Чтобы увидеть, что происходит, когда вы серьезно относитесь к объектной ориентации, языку не нужны слова «если», «для». Все является сообщением: снова большая реализация. (Теперь это станет проще для Objective-C.)

  2. Go : (красивый) язык с акцентом на параллелизм. Я считаю, что Go очень приятный и удобный для программирования.

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

По Фернандес
источник
6
Python и Ruby (я не знаю о Lua) - строго типизированные языки. Я думаю, вы имеете в виду, что они динамически, а не статически типизированы.
Даниэль Роузман
13
Пожалуйста, рассматривайте C и C ++ как два разных языка.
Дэвид Торнли
1
Бьярне говорит : «Нет языка под названием« C / C ++ ». Фраза обычно используется людьми, не имеющими представления о программировании (например, персонал и плохие менеджеры). В качестве альтернативы, она используется людьми, которые просто не знаю C ++ (и часто не C). "
fredoverflow
1
Я хотел бы, чтобы кто-то поспорил, должна ли сборка предшествовать C ++. На этом этапе подход к сборке будет довольно простым из-за простых концепций и небольшого набора предоставленных инструментов, однако работа с необработанными ссылками на память и необработанные ссылки должна быть очень полезной при приближении к C ++, где использование именных ссылок для решения обеих произвольных задач Места памяти и значения сбивают с толку большинство людей.
Филипп Дупанович
1
Я дал моим двум студентам CS недельный курс по искусственному ассемблеру. В основном я изобрел минимальный набор инструкций компьютера и интерпретатора. Затем они могли бы написать (и посмотреть запустить) несколько очень простых процедур, в комплекте с синхронизацией. Затем я добавил такие вещи, как кеширование данных и предварительная выборка, чтобы они могли видеть, как архитектурные функции взаимодействуют с производительностью. Я подозреваю, что искусственный ассемблер и компьютер могут обеспечить большую гибкость и эффективность обучения, если цель является дидактической, а не приобретение чего-то, что они могли бы использовать.
Омега Центавра
12
  • Тот, который вам нужен сейчас
  • Тот, который вам нужен следующий
  • Тот, который вам нужен после этого

Серьезно, я мог выучить BASIC, COBOL, Fortran, Forth, Pascal и Prolog в свое время, но мне никогда особо не нужно было их использовать, и я не могу понять, каким образом они повлияли на мое использование других языки, за исключением, возможно, неправильного применения парадигм из одного в другой. Мне потребовались годы, чтобы отучиться от BASIC достаточно, чтобы на самом деле написать структурированный Pascal, пару лет, чтобы прекратить писать код на Pascal на C, и еще пару лет, чтобы фактически впустить OOP, когда я начал использовать Objective-C и Java. С другой стороны, поскольку я работал (почти) исключительно на ОО-языках, я смог сконцентрироваться на улучшении своего использования ОО-языков, не пытаясь сделать их похожими на Scheme или PostScript.

user4051
источник
4
Знаете, я думаю, что есть какая-то ценность в изучении нового языка, даже если он вам не нужен ... однако я согласен с общим мнением о том, что часто лучше изучать язык, потому что вы думаете, что он окажется скорее полезным потому что это то, что, как вы думаете, вы «должны» выучить.
Тим Гудман
8

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

  1. С

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

  2. Perl

    В качестве противоядия от строгости, требуемой C, попробуйте невероятно прощающий Perl. Что заняло неделю, чтобы написать на С, вы можете написать за час на Perl. Это вводит другой вид удовольствия, которое можно найти в программировании, и показывает, как исключение определенных проблем и деталей освобождает программиста от сосредоточенности на разных вещах.

  3. C ++ или, может быть, Java

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

  4. Обыкновенный Лисп

    Это награда за предыдущий удар. Вы найдете отголоски того, что вы узнали на всех предыдущих языках, и увидите, как глупо выглядит так много предыдущих уступок при программировании на Лиспе. Препроцессор C и шаблоны C ++ подготавливают один из них, чтобы оценить макросистему Lisp. Вы вернете простоту выражения в Perl, возможности низкоуровневой оптимизации в C, возможности построения абстракций в C ++ или Java, и хорошо пройдете их все. Ни один из предыдущих трех - возможно, кроме отладчика Perl - не подготовил вас к опыту интерактивного программирования с поддержкой REPL («чтение, оценка, цикл печати»). Работа с изображениемсреда, которая изменяет отношения между вашим исходным кодом и идеей «исполняемой программы», изменит ваше представление о том, что означает создание программы.

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

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

SEH
источник
4
+1 для C и Common Lisp, но Perl как второй язык ?? :) Python превосходно служил бы в качестве динамического языка, в то же время поощряя хорошие привычки программирования - например, код был очень удобочитаемым для вас и других в течение недель, месяцев или лет после первоначального написания программы.
Limist
1
Что касается рекомендации Perl: я показываю свой возраст. Конечно, сегодня Python или Ruby были бы близкими заменителями, но оба они более догматичны, чем Perl, и более склонны к ориентации объектов в стиле «класс как мешок методов», что новый программист, выходящий из C, не делает. пока не нужно Я вспоминаю, что когда я изучал Perl, я сразу был пугающе продуктивным, и вскоре я начал использовать его объектно-ориентированные средства. Слишком часто все, что фокусируется на ОО, это просто отвлекающая и ненужная церемония.
SEH
Я не согласен с вашим взглядом на «сделки, которые вы делаете с эффективностью при движении вверх в абстракции». Одним из столпов C ++ является то, что программа, использующая возможности C ++, никогда не работает медленнее, чем эквивалентная C-программа. Например, использование виртуальных функций в C ++ никогда не медленнее, чем моделирование виртуальных функций в C.
fredoverflow
Верно, Фред, и это то, что я имел в виду: использование возможностей без размышления о том, как они работают, может привести к затратам - затратам, которых вы, возможно, и раньше избегали, избегая возможности функций, потому что это было бы чрезмерно сложно или просто недостаточно идиоматично реализовать вручную. Например, жалоба на то, что RTTI «слишком медленный», сразу же поднимает вопрос о том, как еще вы собираетесь решить эту проблему.
SEH
6

1. Smalltalk

Первоначально разработан, по крайней мере частично, как способ использования компьютеров для обучения детей. Синтаксис достаточно прост для описания в абзаце. Как и LOGO, он иллюстрирует принцип «низкий барьер для входа, высокий потолок».

Smalltalk - это чистый ОО-язык в том смысле, что «все является объектом».

Он также учит многим функциональным методам, в частности, в своем API-интерфейсе Collection: связывание сообщений, функции более высокого порядка, отображение, уменьшение и т. Д.

Писк сообщество живое и приветливо. Вы также увидите множество обсуждений передовых методов: так же, как и сообщества lisp, в списке рассылки есть много очень опытных пользователей Smalltalker, желающих поделиться своими знаниями. (Не повредит, что в сообществе Squeak есть большое количество профессиональных педагогов.) Есть также другой список для начинающих.

2. ПРОЛОГ

Логическое программирование язык , который даст вам совершенно другой вид вычисления только о любом другом языке. Пролог также очень декларативен (но не совсем так: !оператор or cut может оказать существенное семантическое влияние на предикат).

3. Общий Лисп

Замените Схему здесь, если хотите. Common Lisp поддерживает несколько парадигм, особенно ОО и функциональных. Он также имеет долгую историю (Лисп - второй самый старый, все еще широко используемый язык: только более старый Фортран).

4. Хаскель

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

5. С или Delphi

Вам нужно знать, как работают компьютеры. Вы должны знать, как на самом деле работают память и процессор. Оба они традиционно "близки к металлу" и имеют сообщества, которые поощряют думать о том, как их язык компилируется в ассемблер.

Почему этот заказ?

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

Если у вас есть четкое представление о том, как работает ОО (и - при условии, что существует ОЧЕНЬ разное понимание того, что означает «ОО», - будет справедливо сказать, что ОО доминирует на рынке), переход на Пролог гарантирует, что вы не начнете думая, что ОО единственный путь. Пролог сильно отличается от большинства языков и растягивает ваши умственные мышцы, поэтому вы не начинаете думать, что знаете все.

Common Lisp, в свою очередь, является языком взрослого. У него зрелый стандарт, он десятилетиями был ведущим языковым дизайнером (вместе с Smalltalk) - все эти модные новые функции, которые только что приобрел ваш любимый язык? Скорее всего, это идеи, воплощенные в Lisp или Smalltalk. Обычный Лисп также немного бородавчат, и везде вы найдете его.

Haskell четвертый в списке, потому что (как мне сказали: я только начал изучать его) его чистота означает, что некоторые очень распространенные вещи (например, ввод / вывод) сделать труднее, чем в менее чисто функциональных языках. Ребята из Haskell также используют некоторые довольно экзотические термины (скажем, такие слова, как «катаморфизм»), и вам, вероятно, будет лучше иметь некоторый опыт программирования за поясом, прежде чем заняться этим. (Но я должен повторить, я только начал изучать это! Примите это мнение с щепоткой соли!)

И почему C / Delphi последний? Потому что если вы не работаете во встроенных системах, вам действительно не нужно учиться программированию, думая, что ручное управление памятью - это все, что есть. Сборка мусора работала достаточно хорошо для машины уровня 1980-х годов. Ваш телефон такой мощный!

Наконец, я не поместил Эрланга в приведенный выше список, хотя я действительно должен.

оборота Фрэнк Шеарар
источник
2
Это последовательность обучения ?
Wizard79
Это явно последовательность (длиной 1).
Фрэнк Шиарар
Менее остроумно: я предоставлю один шаг в последовательности, а вы предоставите другой, и сообщество проголосует за упорядочение указанной последовательности, хорошо?
Фрэнк Шиарар
3
@ Черт, я не это имел в виду. Я ожидал полных последовательностей. И я думаю, что заказ не может быть сделан путем голосования.
Гюльшан
Пожалуйста, ребята: если вы собираетесь понизить голос, объясните, почему .
Фрэнк Шиарар
5
  1. Python. Отличное введение в программирование. Это также будет связано с любым предыдущим воздействием на программирование.

  2. Схема. Также отличное введение в программирование. Если вы имеете дело с программистами новичками, вы, возможно, захотите научить этому первое и второе - Python. Одной из альтернатив будет сначала Python, а затем Common Lisp вместо Scheme: больше работы, но больше вознаграждения.

  3. C. Язык низкого уровня, близкий к кремнию. Хорошо для изучения того, что может сделать компьютер. Вы можете заменить некоторую форму языка ассемблера, но C довольно близок к основам и с ним гораздо проще работать.

  4. Пролог. В качестве альтернативы, замените любой язык общего назначения декларативного стиля, если вы можете найти тот, который вам больше нравится.

  5. Haskell. Для системы типов и чистой функциональности, если ничего больше.

  6. Здесь есть несколько кандидатов, так как невозможно охватить все концепции шестью языками. Common Lisp стоит изучить, хотя бы для макросистем и объектных систем (что отличается от большинства других, которые я видел). В-четвертых, Tcl и APL - все странные языки, которые достигли определенного успеха, и один из них был бы полезен, чтобы помешать студенту почувствовать, что он или она выучил все это. Эрланг был бы хорош для параллелизма.

Дэвид Торнли
источник
«Если вы имеете дело с программистами новичками, вы, возможно, захотите научить этому первому, а вторую - Python». Очень согласен. Это подход, который сейчас использует мой бывший университет, и, похоже, он работает очень хорошо.
Пиви
Это довольно хороший список, я бы, вероятно, изменил порядок на Haskell и Prolog. Если бы у студента был особенно плохой опыт, я бы выбил шесть, поднял список и начал с чего-то более простого.
Orbling
4

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

Вы также можете рассмотреть некоторые «языки» сценариев уровня ОС, такие как Batch, grep, awk и т. Д. «Make» также может попадать в эту категорию.

Еще один язык, который вы можете рассмотреть (если он еще не полностью умер) - это COBOL. Он достаточно отличается от других процедурных языков тем, что заслуживает некоторого упоминания. Вариации C, Fortran, Basic и т. Д. Стали настолько похожими, что когда вы знакомы с одним, переход к другому не является большой проблемой, но в COBOL отсутствует множество конструкций, которые считаются само собой разумеющимися в других. (Прошло не менее 20 лет с тех пор, как я что-то сделал с COBOL, поэтому мои наблюдения могут быть недействительными в отношении этого языка.)

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

oosterwal
источник
1
Причина, по которой я не предложил SQL, состоит в том, что это не язык общего назначения. Я бы предпочел поразить студентов чем-нибудь декларативным и более общим, например, Прологом. Языки сценариев на уровне ОС не предлагают ничего, чего не могли бы сделать более общие языки, такие как Python или Perl. Последний раз, когда я касался языка COBOL, он не предлагал концепций, которые нельзя улучшить на других языках. Мне нравится предложение APL, не столько по исторической ценности, сколько по-другому.
Дэвид Торнли
@ Дэвид Торнли: Я согласен, что SQL не является языком общего назначения. В SQL есть некоторые интересные логические понятия и теории множеств, как базовые операции, которые не встречаются во многих других языках, например. объединение, объединение, группировка и т. д., которые стоит отметить всем, кто может иметь дело с базами данных.
oosterwal
Все вещи, которые я хотел бы видеть, учат ученику, хотя некоторые из них имеют историческое чувство. Изучение языков сценариев довольно важно, но может быть выполнено вместе с другими, то же самое для SQL, это язык обслуживания для праймериз. Если студент был очень силен в математике, то начинать с APL было бы неплохо (или, возможно, R, поскольку его намного легче читать, но можно использовать аналогично).
Orbling
2

Я бы предложил сначала прочитать Эрика Рэймондса «Как стать хакером», поскольку у него есть несколько очень интересных моментов о том, как начать работу, включая Лисп, который имеет понятие «код - это данные, а данные - это код».

Для программирования я бы также предложил Haskell, Prolog, SQL и ассемблер (только некоторые).

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

user1249
источник
2

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

Второе> Как только вы начнете учиться, хотите ли вы начать высоко и идти вниз? Или начните с низкого и продолжайте свой путь. Изучение C # (высокий уровень) сильно отличается от изучения ассемблера (низкий уровень).

Огромный выбор будет зависеть от того, что вы хотите сделать. Программирование драйвера, скорее всего, будет включать в себя C или Assembly ... Программирование веб-сайта будет на PHP, C #, asp и т. Д. ... Вы не будете касаться ассемблера для веб-программирования ... и т. Д ...

Что касается основ ... как только вы решите, ЧТО вы хотите сделать, легче выбрать язык. Я, например, стал аналитиком данных в больнице. Таким образом, мой «выбор» языков - это SQL / TSQL / DB2 для доступа к данным, C # WPF для клиентов Windows, Silverlight для веб-клиентов, некоторые RPG / CL для серверной логики IBM ...

Лично я придерживаюсь хорошей книги + создаю собственную программу для изучения языка. Мне нравится APress, и я любил читать C # 2008. Иллюстрируется при изучении C #. У них есть другие книги, которые охватывают основы как для необразованных, так и для экспертов.

WernerCD
источник
2

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

  • Smalltalk - это лучшее, что получает ОО, и простая экспозиция откроет вам глаза на то, как все должно быть сделано. Лучше всего изучать ОО концепции.
  • Java или C # - обеспечивает более архитектурный и плановый подход к ОО, в то же время вводя статически проверенные типы.
  • Ruby или Python - вы не сможете оценить это, пока не почувствуете Java или C #
  • Erlang - параллелизм, выполненный таким образом, что это кажется простым. Это намного лучше, чем ваши ОО языки или Си могут сделать.
  • Lisp, Haskell или другой функциональный язык - это другой подход к решению проблем.
  • C - Будь то создание собственных расширений для Java или реализация алгоритмов более низкого уровня, это настолько близко к сборке, сколько кому-то нужно, пока они не напишут компиляторы

Вы можете спросить "где C ++?" а как насчет X? Честно говоря, изучение нескольких языков делает пару вещей: это обогащает ваш опыт и дает возможность изучать больше языков. Список языков, которые я хорошо знаю (Java, C #, Ruby, C ++, Javascript), является объектно-ориентированным, но это в первую очередь потому, что это то, что я должен делать на работе каждый день. Список языков, с которыми я познакомился (Smalltalk, Python, Erlang, JESS, C, Assembly [Motorola 6502/6510], Go), преподал мне ценные уроки. Я могу, по крайней мере, понять, что происходит с этими языками. Я многое еще не исследовал, но вполне возможно в будущем. Также есть несколько языков разметки: HTML, XSL: FO, XSLT, CSS, XML, SGML, которым люди должны быть знакомы, если они будут каким-либо образом работать с Интернетом.

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

Берин Лорич
источник
2

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

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

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

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

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

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

  1. Tcl
  2. С
  3. Python - для концепций ОО, а также поведение определения блоков по отступам для сравнения с другими языками.
  4. Ruby - для другого взгляда на OO, плюс рельсы для изучения фреймворков
  5. Java - это используется везде, вы должны знать это, и нужно узнать о JVM
  6. groovy - возвращайтесь к динамическим языкам
Брайан Оукли
источник
1

Язык ассемблера, C, SQL, C #

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

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

  2. после того, как вы написали несколько программ на ассемблере с несколькими сотнями строк, указатели и управление памятью перестали быть загадочными, и вы должны были начать замечать шаблоны в коде (if, switch, array, loop и т. д. ). С выводит эти узоры на солнечный свет и позволяет им сиять. Стандартная библиотека полезна, не будучи огромной, но не беспокойтесь о макросах / шаблонах / и т.д. на этом этапе.

  3. Теперь перейдем к базам данных с SQL. Не переусердствуйте с хранимыми процедурами, просто изучите основы таблиц и запросов.

  4. после того, как вы написали несколько программ на C, состоящих из нескольких сотен строк, указатели, структуры и управление памятью стали второй натурой, а процедурные конструкции стали старыми друзьями. Вы начнете замечать шаблоны высшего порядка: эти функции всегда идут с этой структурой данных, эта часть кода похожа на ту часть кода, за исключением методов X, Y и Z и так далее. Добавьте к этому ваше понимание реляционных данных, и теперь вы готовы к объектно-ориентированному языку. С массивной структурой и вообще тупой документацией. Добро пожаловать в реальный мир! Исследуйте GUI, пишите приложения для настольных компьютеров, пишите веб-сайты, пишите веб-сервисы, пишите все, что вам нравится. Иди найди работу, если ты так склонен.

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

Стивен А. Лоу
источник
1

Вам нужны основы:

  1. Машинный код
  2. язык ассемблера
  3. С
  4. шепелявость

После этого это, вероятно, не имеет значения.

Скотт Уитлок
источник
0

ОК, это последний день за щедрость. И я добавляю свой ответ. Моя предложенная последовательность

C, C ++, JAVA / C #, Python / Ruby, любой другой язык (Assembly / Lisp / Prolog и т. Д.)

  • Я не думаю, что первый язык должен быть самым простым. Скорее я думаю, что это должно дать общее представление о том, как компьютер работает, сохраняя некоторую абстракцию.
  • Переход с C на C ++ будет проще. Будет ООП, самая используемая парадигма в наши дни.
  • Переход с C ++ на C # / Java будет проще. Я предпочитаю C #, потому что он включает в себя много парадигм, таких как функциональное программирование.
  • Когда кто-то сейчас придет к динамическим языкам, таким как Python или Ruby, будет « WoW ». Будет легче почувствовать красоту динамического набора текста. Но изучение динамических языков в первую очередь и статических позже приведет к « О! Зачем мне все это добавлять? »
  • Теперь большинство используемых парадигм и языков почти готово. Итак, исследуйте все, что хотите. Из сборки в Лисп, Пролог или Хаскель. И откройте для себя новые контексты и особенности различных языков программирования.
Гульшан
источник
Здесь C только для начала.
Гульшан
предпочтение C # над java зависит от многих факторов, я бы сказал, что оба почти равны.
Прасонскала
0

Схема, C, C ++

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

  1. Схема
    Мы с вами сначала учимся программированию, чем меньше волшебства, тем лучше. Язык обучения Scheme представляет четкое и разумное определение языка, действительно небольшой набор аксиом («волшебство»), которые вы можете строить и расширять. Любой, кто может понять функции в математике, может отслеживать и рассуждать программы Scheme. Начиная со Scheme, вы получаете чистый, но мощный способ думать о вычислениях, не беспокоясь о деталях языка.

  2. C
    Переход от Схемы к C является радикальным, но позволяет вам узнать об очень важном сопоставлении языков высокого уровня с языками низкого уровня. Изучение модели памяти (указатели, куча, стек и т. Д.) И того, как программы компилируются и запускаются, как указатели, стек и работа с кучей являются важными навыками. Благодаря этому низкому уровню понимания вы можете начать анализировать программы на более высоком уровне (Big O). Вы можете начать скручивать свои собственные абстрактные типы данных, играя с различными реализациями (скажем, с простой хэш-таблицей и бинарным деревом для набора).

  3. C ++.
    Изучая C и Scheme, мы начинаем видеть разные парадигмы языков программирования и то, как они могут применяться к различным задачам. Теперь вы можете подойти к самым страшным аспектам программирования: выбор и компромиссы. Выбор языка программирования может повлиять на производительность, удобочитаемость, ремонтопригодность, надежность и т. Д. Для решения проблем, превышающих то, что вы можете себе представить, этот выбор велик, но и опасен. C ++ пытается сделать для программиста как можно меньше вариантов. Изучая C ++, вы узнаете, как сделать эти компромиссы и сделать выбор самостоятельно для решения своих проблем.

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

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

Кирк Фернандес
источник
0

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

  • C - Указатели и управление памятью
  • C ++ - основы OO и все еще очень популярный
  • Java / C # - Самые популярные языки
  • Некоторая базовая сборка
  • Функциональный язык - например, Haskell
  • Язык сценариев - например, Python
Карра
источник
0
  1. Python. Чтобы закончить, сделайте обычное программирование. Процедурный, ОО и (в определенной степени) функционал.

  2. Регулярные выражения. Они находятся в библиотеке Python, но это отдельный DSL.

  3. Shell (BASH или что-то еще). "&", "|", ";" операторы для объединения процессов являются критическими и неприятными в Python.

  4. SQL. На данный момент это лингва франка для доступа к данным.

  5. XHTML. На данный момент это лингва франка для представления данных.

  6. CSS.

Может быть C, если это стало необходимым.

С. Лотт
источник
Похоже, вы упустили стадию « глубокого просветления ». Это номер 7?
Марк С
@Mark C: просто пытаюсь охватить «большинство интенсивно используемых языков и парадигм сегодня». По моему опыту, эти «другие» или DSL, возможно, более интенсивно используются, чем языки программирования. Я не уверен, что это приводит к глубокому просвещению - просто знакомство со многими языками, которые фактически используются.
С.Лотт
Вы правы, я вижу, он это сказал, потом я заметил, что он также сказал "или парадигмы". Это было просто в хорошем настроении.
Марк С
@Mark C: Но SQL и CSS являются «другими парадигмами», которые являются наиболее интересными. Действительно, Регулярные выражения - это парадигма, которая вызывает много вопросов о переполнении стека.
С.Лотт
0

Начните близко к металлу:

  1. ассемблер
  2. С
  3. C ++
  4. C #
  5. шепелявость
  6. Python или Ruby

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

  1. Ассемблер: 3 месяца
  2. C: 6 месяцев
  3. C ++: 2 года
  4. C #: 6 месяцев
  5. Лисп: 3 месяца
  6. Python / Ruby: 3 месяца

Если только вы не намерены обучать их «Привет, мир», что должно занять около месяца для всех 6.

SnoopDougieDoug
источник
-1

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

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