Знания, которые принесут больше всего денег! КАРТЕР ПЕЙДЖ — технический руководитель Google «КОРОТКИЙ ОТВЕТ: УЧИТЕ C ИЛИ C++. Возможно, вам никогда не придётся пользоваться им на работе, но вы многому научитесь, освоив его. Самые сложные задачи, с которыми сталкиваются лучшие программисты, так или иначе требуют знания C. Вот некоторые вещи, основанные на C: ВСЁ, ЧТО ЛЕЖИТ В ОСНОВЕ КОМПЬЮТЕРНЫХ ТЕХНОЛОГИЙ, сложно устроено и сильно влияет на производительность, когда-то создали на C — с небольшим вкраплением ассемблера. C УЛУЧШИТ ВАШИ НАВЫКИ В JAVA. Вы разберётесь, когда виртуальная машина использует стек, а когда — кучу, и что это значит. Вы будете интуитивно понимать, как происходит сборка мусора. Вы будете лучше понимать, как использовать примитивные типы данных и объекты. C УЛУЧШИТ ВАШИ НАВЫКИ В PYTHON. Его система классов во многом основывается на C++. Вы научитесь писать грамотный, хорошо организованный код, что позволит вам легче работать с ним в будущем. Вы научитесь осторожнее обращаться с глобальными переменными. C УЛУЧШИТ ВАШИ НАВЫКИ В OBJECTIVE-C. Вы научитесь управлять подсчётом ссылок и поймёте, какая часть кода должна «владеть» объектом. Вы сможете избегать утечек памяти. ТАК ЧТО ЛУЧШЕ — C ИЛИ C++? Я отдаю предпочтение C++, потому что, хотя они очень близки, C++ поддерживает объектно-ориентированное программирование. Даже если вы будете работать только с функциональными языками, объектно-ориентированное программирование научит вас организовывать код таким образом, чтобы вы могли создавать и поддерживать крупные проекты. Возможно, вы не будете зарабатывать так же много, как специалисты по COBOL (Один из старейших языков программирования. — Прим. ред.), которые могут внезапно потребоваться. Но после C вы сможете выучить любой другой язык. Если в индустрии компьютерных технологий и есть постоянство, то оно заключается в следующем: сегодняшняя новинка может через несколько лет оказаться старомодной. Научитесь навыкам, которые позволяют обретать новые навыки, и всё у вас будет хорошо». ШТЕФАН ЦУКЕРМАН —программист «Если вы умеете правильно организовывать данные, совершенно не важно, каким языком вы владеете. Есть три тесно связанные вещи, которые вам нужно знать: ОСНОВНЫЕ СТРУКТУРЫ ДАННЫХ И АЛГОРИТМЫ (связные списки, хеш-таблицы, сбалансированные и другие деревья поиска, очереди и кучи); МОДЕЛИРОВАНИЕ ДАННЫХ, ПОЛУЧЕННЫХ ИЗ РЕАЛЬНОГО МИРА (понимание логики уже выстроенных моделей, умение работать со стандартными и сторонними библиотеками); ЛЮБОЙ ЯЗЫК ПРОГРАММИРОВАНИЯ, КОТОРЫЙ ВАМ УДОБЕН. Если вы хорошо знаете язык и можете показать это на деле, то сможете на этом много заработать. Напишите что-нибудь полезное или просто классное, и если вы не боитесь критики (порой — жёсткой), выложите код на тот же GitHub. Если вы хорошо освоите какой-нибудь язык, то сможете выучить любой другой. Вообще же я бы предложил выучить несколько языков с разными особенностями и уровнями абстракции, так как знание лишь одного языка сильно ограничивает вас в подходах к решению любой задачи. ЕСЛИ БРАТЬ САМЫЙ ВЫСОКИЙ УРОВЕНЬ, ТО Я БЫ ПОСОВЕТОВАЛ ОДИН ИЗ ТРЁХ СЛЕДУЮЩИХ ЯЗЫКОВ: Perl, Python, Ruby (и как вариант Lua). В них встроено много полезных структур данных: хеш-таблицы, динамические массивы и другие. Также они упрощают работу с устройствами ввода-вывода и предлагают модули и библиотеки, которые позволяют сразу перейти к решению проблемы, а не писать промежуточный код, который и так должен быть включён в любой современный язык программирования; ИМПЕРАТИВНЫЙ/ПРОЦЕДУРНЫЙ ЯЗЫК НЕ СЛИШКОМ НИЗКОГО УРОВНЯ: C, Go, Fortran (мой выбор — C); ИМПЕРАТИВНЫЙ/ОБЪЕКТНО-ОРИЕНТИРОВАННЫЙ ЯЗЫК: C++, C#, Java, Ada (я бы предпочёл C#, потому что его создавали, учитывая ошибки Java); ФУНКЦИОНАЛЬНЫЙ/ МУЛЬТИПАРАДИГМАЛЬНЫЙ ЯЗЫК: Objective Caml, Clojure, Common LISP, Erlang, F#, Haskell, Scala, Scheme. Я склоняюсь к OCaml и Scala, потому что их синтаксис проще, чем у остальных, хотя это, конечно, субъективно. Какой бы язык вы ни выбрали, выучите его по-настоящему хорошо и наберитесь опыта работы с ним. Уметь создавать реализацию класса в Java — это здорово, но если вы узнаете, как в Java работает сборка мусора (или в чём её недостатки), то станете более классным программистом. Хорошо знать, что в Perl можно использовать модули, но совсем другое дело, если вы понимаете, когда они просто интерфейсы для кода на C: это означает, что интерпретатор не управляет памятью автоматически. И так далее». Мнение людей, отвечающих на вопрос, может не совпадать с Вашим мнением.
Я люблю информатику
Какой язык программирования лучше учить?
Знания, которые принесут больше всего денег!
КАРТЕР ПЕЙДЖ — технический руководитель Google
«КОРОТКИЙ ОТВЕТ: УЧИТЕ C ИЛИ C++.
Возможно, вам никогда не придётся пользоваться им на работе, но вы многому научитесь, освоив его. Самые сложные задачи, с которыми сталкиваются лучшие программисты, так или иначе требуют знания C.
Вот некоторые вещи, основанные на C:
ВСЁ, ЧТО ЛЕЖИТ В ОСНОВЕ КОМПЬЮТЕРНЫХ ТЕХНОЛОГИЙ, сложно устроено и сильно влияет на производительность, когда-то создали на C — с небольшим вкраплением ассемблера.
C УЛУЧШИТ ВАШИ НАВЫКИ В JAVA. Вы разберётесь, когда виртуальная машина использует стек, а когда — кучу, и что это значит. Вы будете интуитивно понимать, как происходит сборка мусора. Вы будете лучше понимать, как использовать примитивные типы данных и объекты.
C УЛУЧШИТ ВАШИ НАВЫКИ В PYTHON. Его система классов во многом основывается на C++. Вы научитесь писать грамотный, хорошо организованный код, что позволит вам легче работать с ним в будущем. Вы научитесь осторожнее обращаться с глобальными переменными.
C УЛУЧШИТ ВАШИ НАВЫКИ В OBJECTIVE-C. Вы научитесь управлять подсчётом ссылок и поймёте, какая часть кода должна «владеть» объектом. Вы сможете избегать утечек памяти.
ТАК ЧТО ЛУЧШЕ — C ИЛИ C++? Я отдаю предпочтение C++, потому что, хотя они очень близки, C++ поддерживает объектно-ориентированное программирование. Даже если вы будете работать только с функциональными языками, объектно-ориентированное программирование научит вас организовывать код таким образом, чтобы вы могли создавать и поддерживать крупные проекты.
Возможно, вы не будете зарабатывать так же много,
как специалисты по COBOL (Один из старейших языков программирования. — Прим. ред.), которые могут внезапно потребоваться. Но после C вы сможете выучить любой другой язык. Если в индустрии компьютерных технологий
и есть постоянство, то оно заключается в следующем: сегодняшняя новинка может через несколько лет оказаться старомодной. Научитесь навыкам, которые позволяют обретать новые навыки, и всё у вас будет хорошо».
ШТЕФАН ЦУКЕРМАН —программист
«Если вы умеете правильно организовывать данные, совершенно не важно, каким языком вы владеете. Есть три тесно связанные вещи, которые вам нужно знать:
ОСНОВНЫЕ СТРУКТУРЫ ДАННЫХ И АЛГОРИТМЫ (связные списки, хеш-таблицы, сбалансированные и другие деревья поиска, очереди и кучи);
МОДЕЛИРОВАНИЕ ДАННЫХ, ПОЛУЧЕННЫХ ИЗ РЕАЛЬНОГО МИРА (понимание логики уже выстроенных моделей, умение работать со стандартными и сторонними библиотеками);
ЛЮБОЙ ЯЗЫК ПРОГРАММИРОВАНИЯ, КОТОРЫЙ ВАМ УДОБЕН. Если вы хорошо знаете язык и можете показать это на деле, то сможете на этом много заработать. Напишите что-нибудь полезное или просто классное, и если вы не боитесь критики (порой — жёсткой), выложите код на тот же GitHub. Если
вы хорошо освоите какой-нибудь язык, то сможете выучить любой другой.
Вообще же я бы предложил выучить несколько языков
с разными особенностями и уровнями абстракции,
так как знание лишь одного языка сильно ограничивает вас
в подходах к решению любой задачи.
ЕСЛИ БРАТЬ САМЫЙ ВЫСОКИЙ УРОВЕНЬ, ТО Я БЫ ПОСОВЕТОВАЛ ОДИН ИЗ ТРЁХ СЛЕДУЮЩИХ ЯЗЫКОВ: Perl, Python, Ruby (и как вариант Lua). В них встроено много полезных структур данных: хеш-таблицы, динамические массивы и другие. Также они упрощают работу
с устройствами ввода-вывода и предлагают модули
и библиотеки, которые позволяют сразу перейти к решению проблемы, а не писать промежуточный код, который
и так должен быть включён в любой современный язык программирования;
ИМПЕРАТИВНЫЙ/ПРОЦЕДУРНЫЙ ЯЗЫК НЕ СЛИШКОМ НИЗКОГО УРОВНЯ: C, Go, Fortran (мой выбор — C);
ИМПЕРАТИВНЫЙ/ОБЪЕКТНО-ОРИЕНТИРОВАННЫЙ ЯЗЫК: C++, C#, Java, Ada (я бы предпочёл C#, потому что его создавали, учитывая ошибки Java);
ФУНКЦИОНАЛЬНЫЙ/ МУЛЬТИПАРАДИГМАЛЬНЫЙ ЯЗЫК: Objective Caml, Clojure, Common LISP, Erlang, F#, Haskell, Scala, Scheme. Я склоняюсь к OCaml и Scala, потому что
их синтаксис проще, чем у остальных, хотя это, конечно, субъективно.
Какой бы язык вы ни выбрали, выучите его по-настоящему хорошо и наберитесь опыта работы с ним. Уметь создавать реализацию класса в Java — это здорово, но если вы узнаете, как в Java работает сборка мусора (или в чём её недостатки), то станете более классным программистом. Хорошо знать, что в Perl можно использовать модули,
но совсем другое дело, если вы понимаете, когда они просто интерфейсы для кода на C: это означает, что интерпретатор не управляет памятью автоматически. И так далее».
Мнение людей, отвечающих на вопрос, может не совпадать с Вашим мнением.