elizarov


Блог Романа Елизарова


Previous Entry Share Next Entry
Что должен знать программист: Языки программирования
elizarov

Программисты придумали и реализовали множество языков программирования для решения различных задач. Языки программирования общего назначения могут быть использованы для решения любой задачи, но совсем не обязательно являются наиболее удобными для решения конкретной задачи. Например, обработать текстовый файл с данными на каждой строке намного удобней на AWK чем на Java, C++ и, тем более, удобней чем на C. Но именно языки общего назначения занимают первые строчки в рейтингах популярности TIOBE в силу своей универсальности.

Работа инженера-программиста, как я уже писал, как и работа любого инженера, заключается в умении правильно использовать накопленный опыт и знания для решения поставленной задачи. Язык программирования это главный и основной инструмент программиста, с помощью которого он решает поставленные перед ним задачи. Программист должен профессионально владеть как минимум одним языком программирования и досконально знать его. А доскональное знание чего-либо подразумевает не только знание о том, как его использовать, но и знание о том, как оно устроено. Поэтому принципы построения компиляторов и языков программирования являются обязательной дисциплиной в профессиональном образовании программиста. В отличие от другой обязательной дисциплины, дизайна и анализа алгоритмов, я не могу здесь порекомендовать какой-то одной всеобъемлющей книги, однако нельзя не упомянуть классическую книгу "Компиляторы: принципы, технологии и инструменты" под авторством Альфреда Ахо (буквы A в языке AWK) и других. В принципе, там содержится более чем достаточный объем материала для любого программиста, профессией которого не является создание языков программирования и компиляторов к ним. Вот такой вот, на первый взгляд, парадокс: книга о создании компиляторов дает достаточно знаний всем программистам, кроме тех, которым нужно создавать компиляторы. Все-таки для профессионального создания компиляторов и языков программирования нужно знать намного больше, в том числе нужно знать намного больше различных языков программирования, а книга Ахо не дает не только полноценного обзора языков, но даже не знакомит с различными парадигмами программирования.

Однако, в современном мире получается так, что каждый программист должен знать несколько языков программирования. Даже если основным инструментом программиста является язык общего назначения, в работе неизбежно возникают ситуации, где использование какого-либо специализированного или предметно-ориентированного языка более оправдано. Если основная работа происходит на языке высокого уровня абстракции, то порой бывает необходимость воспользоваться более низкоуровневым языком ради производительности. Например, большое число расширений к статистическую языку R пишутся на C/C++. А если основная работа программиста происходит на более низком уровне, то для экономии времени при решении специфических задач приходится использовать специализированные языки более высокого уровня абстракции. Например, для работы с базами данных обычно используется язык SQL, независимо от того, на чем пишется остальная логика приложения. Порой "лучше день потерять, потом за пять минут долететь", ведь изучение нового языка программирования не только может упростить решения стоящей перед программистом в данный момент задачи, но и расширит кругозор на будущее.

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

UPDATE: Для развития мысли заметка про язык Си здесь в продолжение.


  • 1
"Должен" ли? Я не увидел в тексте объяснения должности. И про библиотеки/каркасы у меня тоже мнение чуть чуть отличается, но, возможно, я просто недопонял мысль.

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

А про командную работу (и про специфику использования библиотек/каркасов в этом контексте) я как-нибудь отдельно раскрою более подробно.



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

С выводом я согласен, но что должен знать программист — не понятно. Должен знать несколько языков? Нет, это лучше, но необязательно. Должен знать один? Это, вроде подразумевается.

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

Я не случайно сделал заголовок во множественном числе и попытался обосновать, (цитата) "что каждый программист должен знать несколько языков программирования". А на какой именно вопрос вам хотелось бы найти ответ?

(ко мне можно на "ты", я из выпуска 2004 года, и мы не раз встречались в институте, но очень мельком)

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

Я пробую найти ответ на этот вопрос давно. И, отсобеседовав сотню людей (а впереди еще много раз по столько), попробовав научить нескольких (начиная с себя), запутался еще больше. Слишком много вопросов и разных мнений. А главное, что эти мнения у каждого свои. Что ответить человеку, который говорит "я великолепно знаю Java и на все остальное мне наплевать"? Сказать "давай сделаем эту задачу на Python, это будет быстрее"? Выгнать и найти "нормального" разработчика? Как-то обосновать? Заставить, чтобы понял, что будет лучше? Забить?

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

> Что ответить человеку, который говорит "я великолепно знаю Java и на все остальное мне наплевать"?

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

А что касается обучения, то дать всеобъемлющий ответ на вопрос "что должен знать программист" нельзя в одной заметке. Собственно, двоеточие в названии заметки является намеком на целую серию, которую я планирую написать на эту тему.

Что же касается системного анализа на тему обучения, то могу порекомендовать почитать ACM/IEEE Computing Curricula, где проделана большая работа и дается исчерпывающий ответ на вопрос "чему нужно учить будущих программистов". UPDATE: Собственно, даже в процессе обучения уже закладывается знание различных языков и парадигм программирования.


Edited at 2012-02-19 03:11 pm (UTC)

Да, да, и еще раз да. С этими вещами согласен.

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

Там несколько документов

Я в этих высоких материях ничего не понимаю, можете, пожалуйста, пояснить на примере? А то мне казалось, что при командной разработке(а сольное программирование, вроде как, скорее исключение, чем правило) выгода от знания многих языков стремится к нулю(причем стремится к нулю слева =) ).

Вот есть, предположим, команда из Антона, Бориса, Виктора, Василисы и Васисуалия. Пишут они все проект на Java.
Антон, кроме Java, владеет AWK, Perl, Erlang и Haskell.
Борис, соответственно, sed и Python.
Виктор, Василиса и Васисуалий знают только Java(пусть для равновесия знают лучше, чем Антон с Борисом) и счастливы, ибо проект их на Java. Ну не читали они этот пост и не в курсе, что должны знать несколько языков. =)

Понадобилось этой команде текстовые файлы обрабатывать(нужно два десятка "простых для языка не-общего назначения" скриптов). Причем один раз написать и забыть - не вариант: из постановки задачи понятно, что написанное придется изменять постоянно, чтобы успеть за изменениями реального мира.
Антон и Борис на пару пришли бы к какому-то консенсусу(например, Python).
Но что делать с Виктором, Василисой и Васисуалием?
Даже если научить их Python-у в рабочее время, что будет через год, когда Виктора уволят за пьянство, Василиса уйдет в декрет, а Васисуалия сманят работать в Гугл? Учить пришедших Глеба, Галину и Герасима Python-у или сразу искать двуязычных программистов?

Разве в реальном мире в данном случае не выберут Java(пусть Антону и Борису будет не так удобно, как хотелось бы, зато все смогут читать и модифицировать код)?
Тогда получается, что знание дополнительных языков Антону и Борису в настоящем ничего, кроме чувства внутреннего дискомфорта, не дает. Польза от расширения кругозора довольно эфемерна. Да и расширять его можно множеством других способов.

Нет, это не значит, что я автоматом не возьму его на должность программиста, но это сильно сужает область задач, которые ему можно поручить именно в силу того, что при таком подходе он не сможет найти оптимальное решение многим задачам.
Значит ли это, что у Антона и Бориса будут какие-то свои "особые" задачи, к которым "всякие Васисуалии" допущены не будут? А как много таких "особых" задач? А то терзают смутные сомнения, что их хватит только Антону и бедный Борис будет продолжать чувствовать внутренний дискомфорт, сочиняя очередные "2 строчки для AWK" на Java, хотя с этими "особыми" задачами справился бы на ура.
Да и потом, если эти задачи "особые", то значит есть задачи "неособые"(для тех, кто знает один язык). Что как-то слабо вяжется с Однако, в современном мире получается так, что каждый программист должен знать несколько языков программирования.

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

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

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


Edited at 2012-02-28 12:36 pm (UTC)

>я не могу здесь порекомендовать какой-то одной всеобъемлющей книги,

посмотрите на эту книгу -- http://www.amazon.com/Programming-Language-Pragmatics-Third-Edition/dp/0123745144/ref=sr_1_1?ie=UTF8&qid=1330680827&sr=8-1

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

Спасибо. Посмотрю.

Кстати, внезапно, если попробовать перенести какой-нибудь performance-critical код из C# в C++, то старый добрый C там тоже участвует -- коммуникация ведь через dll-ку, а там публичный интерфейс из обычных C-функций. Никаких там классов и прочего излишества. Чистое процедурное программирование.

  • 1
?

Log in

No account? Create an account