зацените статью про программистов-новичков...

inna1

Синтаксис, семантика, микронезийские культы и начинающие программисты
© Эрик Липперт (Eric Lippert 2004
Оригинал доступен по адресу: http://blogs.msdn.com/ericlippert/archive/2004/03/01/82168.aspx
Программисты-новички, читающие это: я буду благодарен за ваши отзывы насчёт того, осмысленна ли эта статья или это просто куча пустых теоретических измышлений.
Опытные программисты, читающие это: расскажите, пожалуйста, что за ключевые понятия, по вашему мнению, вам пришлось усвоить в начале изучения программирования, и на что вы делаете упор сейчас, наставляя новичков.
Один студент, проходящий практику в некоторой компании, недавно написал мне следующее: «В качестве прохождения практики я работаю над проектом, в котором необходимо писать скрипты на vbscript. Честно говоря, я не знаю, что я делаю, и надеялся, что вы могли бы помочь». Далее шёл кусок скрипта и список того, что должна уметь делать программа. Год за годом я получаю множество просьб вроде этой; значительная часть начинающих программистов использует скриптовые языки по одной простой причине – они были спроектированы так, чтобы стать привлекательными для новичков.
Так вот, как я написал в прошлый четверг, бывают моменты, когда хочется научить студента рыбачить, а бывает, когда хочется дать рыбку. Я бы мог написать для вас строку кода, выполняющую необходимое вам действие. И затем мог бы превратиться в сервер запросов о расширении функциональности программ для каждого студента, кто не знает, что он делает… Не-а. Этого не произойдёт. Простите. Этот путь ведет к программированию в стиле культа карго, а вы не хотите идти этим путём, уж поверьте мне.
Что такое программирование в стиле культа карго? Позвольте сделать небольшое отступление. Идея берёт начало в правдивой истории, которую я вкратце изложу здесь.
На протяжении Второй мировой войны американская армия возводила взлётно-посадочные полосы на разных крохотных островах в Тихом океане. Когда война закончилась, американцы вернулись домой, а аборигены поступили весьма разумно и понятно: оделись как сигнальщики наземного движения и стали размахивать палочками. Они перепутали причину со следствием: островитяне решили, что самолёты, полные провианта, возникали, благодаря людям, машущим палочками, – стоит только сделать всё, как надо, и им удастся провернуть тот же фокус. Мы, конечно, знаем, что дела обстоят с точностью до наоборот: ребята с палками находятся там из-за того, что они нужны самолётам для посадки. Нет самолётов – нет парней.
У самолётотопоклонников было всё в порядке с несущественными поверхностными составляющими, но чтобы достичь успеха им не хватало целостного видения всей картины. Они понимали форму, но не содержание. Есть множество программистов-самолётопоклонников, – программистов, которые понимают, что код делает, но не как он работает. Поэтому они не способны вносить принципиальные изменения в программу. Им свойственно работать, делая беспорядочные поправки, тестируя, и исправляя снова, пока не удастся наткнуться на что-то, что будет работать.
(К слову, Ричард Фейнман написал отличный очерк о науке в стиле культа карго. Поищите в Сети, и да обрящете.)
Начинающие программисты, не идите этим путём! Курсы программирования для новичков часто в значительной степени сосредоточены на правильном усвоении синтаксиса. Под «синтаксисом» я имею в виду буквы и цифры, которые непосредственно составляют программу, в противоположность «семантике», – смыслу и содержанию программы. Сравните вот с чем: «синтаксис» – это набор грамматических и орфографических правил английского языка, «семантика» – это что означают предложения. Да, само собой, учить синтаксис языка необходимо; программы, где синтаксис не соблюдён, просто не запустятся. Однако на чём не делают упор авторы этих курсов, так это на том, что синтаксис – это только цветочки. Самолётопоклонники усвоили синтаксис (то есть формальный внешний вид) взлётной полосы «на все сто», а вот с семантикой, несомненно, были проблемы.
Продолжая серию аналогий, это как играть в шахматы. Любой может выучить, как по правилам передвигаются фигуры. Играть в игру, где необходима стратегия, – это уже ягодки (но они-то и вкусны). Вам необходимо предельно ясно представлять себе семантику задачи, которую вы пытаетесь решить, а затем аккуратно притворять в жизнь эту семантику.
Каждый оператор в VBScript осмыслен. Поймите, в чём этот смысл заключается. Умение передавать верные аргументы в верном порядке придёт с практикой, но умение верно схватывать смысл требует размышления. Со временем придёт понимание, что в некоторых языках программирования синтаксис элегантен, а в некоторых он раздражает, но по большому счёту это к делу не относится. Не имеет значения, пишу ли я программу на VBScript, C, Modula3 или Algol68, – во всех этих языках синтаксисы различны, но семантики весьма сходны. Семантика является программой.
Вам также необходимо понимать и использовать абстракцию. Языки высокого уровня такие, как VBScript, уже предоставляют огромный объём средств абстракции от «железа», на котором всё непосредственно и работает, и позволяют легко осуществлять ещё более абстрактные вещи.
Начинающие программисты часто не понимают, что представляет собой абстракция. Вот простенький примерчик. Предположим, вам для чего-то понадобилось вычислить 1 + 2 + 3 + … + n для некоторого целого n. Вы могли бы написать программу вроде этой:
n = InputBox("Enter an integer")

Sum = 0
For i = 1 To n
Sum = Sum + i
Next

MsgBox Sum
Теперь, допустим, вы захотели посчитать это несколько раз. Можно дублировать четыре средние строки много раз, но есть способ лучше – «абстрагировать», выделить эти строки в именованную подпрограмму:
Function Sum(n)
Sum = 0
For i = 1 To n
Sum = Sum + i
Next
End Function

n = InputBox("Enter an integer")
MsgBox Sum(n)

Это удобно: вы можете писать подпрограммы, благодаря которым ваш код станет выглядеть прозрачней, поскольку у вас будет меньше повторений. Но не в удобстве заключается настоящее значение абстракции. Смысл абстракции в том, что реализация теперь несущественна для вызывающей стороны. Если однажды окажется, что ваша функция суммирования неэффективна, тогда вы сможете использовать вместо неё формулу Гаусса. Вы выбрасываете старую реализацию и заменяете её на гораздо более быструю:
Function Sum(n)
Sum = n * (n + 1) / 2
End Function

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

slonishka

заценили

Ober

+1

Ober

в общем, настроение статья подняла, завтра же надо заставить студентов ботать anti pattern'ы

vall

сейчас делаю прак по офигенно рациональной розе примерно по этой методике — вникать в эту чудовищьно абстрактную хрень как-то не тянет =)

inna1

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

vall

я нихрена не делал.
у нас что-то рассказывают.
у нас дурацкий курс.
у нас ничего не требуют.
такой ответ сойдёт? =)

slonishka

как всегда, короче

Timi

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

akkylla

Ну и че. Статья как статья. Вроде все правильно написано. Не пойму что автор хочет.

qsk78

Автор хочет дать совет программистам-новичкам.

inna1

bingo!
Оставить комментарий
Имя или ник:
Комментарий: