?

Log in

No account? Create an account
записи соседство календарь хуэмай журнал ...Ранее ...Ранее Далее... Далее...
есть очевидные плюшки - Why is the rum gone?
That's not good enough
akater
akater
есть очевидные плюшки
Этот псто состоит из комментариев к рекомендациям начинающему программисту. Эти комментарии появились на свет благодаря @tarsius_bonus, а также тому, что иногда я люблю болтать.

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


> Найти крайне простую с технической точки зрения среду программирования.
> Например, под Windows это может быть сочетание блокнота и компилятора lcc
> (где для компиляции потребуется всего пару команд).

Нет, новичку лучше найти дружелюбную среду. В той дружелюбной среде, которую использую я, для компиляции нужна одна команда. Правда, я не особо люблю, когда командуют, поэтому про себя говорю «…нужен один символ».

> Избегайте всех этих навороченных IDE, где от количества различных кнопочек
> и шаблонов проектов голова кругом идёт. Вам надо сосредоточится на чистом программировании.

Да, «шаблоны проектов» — это premature abstraction. Меня давно удручает популярность подхода, при котором первое, что показывают юзеру, — панель с предложением «создать проект».

> Начните с экспериментов на ассемблере

Это противоречит «сосредосточиться на чистом программировании». Я считаю, что программирование — это выражение мыслей на формальном языке[, у которого существует интерпретатор или компилятор[, либо машинном]]. По-моему, если пренебречь квадратными скобками, то совершенно неясно даже, при чём тут, скажем, знание того, что такое байт.

> Напишите на нём пару hello world программ.

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

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

Это предложение изучать железки, а не программирование.

> Простейшие условные конструкции и циклы.

Почему с условными конструкциями хорошо тренироваться именно на ассемблере? Циклов вообще не должно быть, это неестественная конструкция. В этом я был уверен с первых моментов моего взаимодействия с компами, с детства однозначно предпочитая While to For, потому что While более чётко выражает мысль. Когда (весьма запоздало, к сожалению) узнал, что можно и без While, перестал использовать и его. Предложение новичку использовать циклы — это примерно как предложение использовать Windows — популярный способ смолоду понастроить себе барьеров.

> Не давайте пока своим мозгам ООП и прочих абстрактных вещей.
> От ООП […] мозги человека, который вообще не незнает как работает компьютер, превратятся в желеобразную массу.

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

> Более того, попробуйте посмотреть ассемблерный код своих маленьких hello world программ получившийся после компиляции.

Да, абсолютно, это наверняка очень интересно. Но уже почти неважно для решения задач. Это технические детали, связанные с конкретным компьютером и конкретным комплиятором. По-моему, это в первую очередь те же самые лишние уровни абстракции, от которых голова идёт кругом, а уж потом — leverage. Это примерно то же самое, что предлагать начинать изучение программирования с написания своего компилятора.

> Хорошая книжка "Керниган, Ричи. Язык C"

Можно было бы написать «культовая». :-) Книги это очень интересный отдельный топик. Зачем книги, если есть программы? Программы на языке X красноречивее всего другого говорят о языке X. Я читал несколько страниц Кернигана–Ричи по необходимости: надо было экзамен сдать. Складывается такое чувство, что, в то время как читая про Си, я не изучаю ничего, кроме Си, но читая про Lisp, я узнаю многое о мире. Книги про программирование, по-моему, скучны и в целом бесполезны, если они не интерактивны (то есть, если код примеров нельзя тут же запустить и тут же модифицировать, чтобы посмотреть, что изменится). Тот текст про Лисп, о котором я говорил, — исключение из этого правила, потому что Лисп так устроен, что идея, выраженная на нём, не Лисп-специфична, и может быть использована в других местах. (См. абзац с предложением This is probably what Eric Raymond meant about Lisp making you a better programmer. здесь.) Чем больше я узнаю про Лисп или Хаскелль, хоть и фактически не пишу на них, тем больше этих идей я использую в других местах. Это хороший признак. Точно так же, хорошая математика применима не только внутри себя, поэтому алгебраическая геометрия — это хорошая математика, а вейерштрассовский анализ — это просто DSL с сильно ограниченной областью применения.

Тут же в тему про интерактивность: если человек пишет статью про мотивы с конечными коэффициентами [ну, к примеру ;-], то её может использовать только тот, который очень хорошо понимает, что это такое, — по той с'ршэнно банальной причине, что статья написана не на формальном языке. Статью на формальном языке (фактически, программу) может моментально использовать кто угодно. Конечно, это не уничтожает сложность, но перспектив моментально становится гораздо больше. Потерь при этом никто не несёт — автору не надо делать больше, чем он уже сделал, — просто хорошего языка для этого ещё нет.

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

Нет. Python на то и Python, что его можно свободно выбрать не имея опыта, и быть довольным, и получить таким образом мощный инструмент. Рэймондс справедливо указывает на это в тексте, на который автор коммента на dxdy ссылается в конце.

> Возьмите какую нибудь готовую програмку на языке который вы изучаете (можно что-то веселое типа тетриса). Попробуйте её изменить.

Да, абсолютно. Программы вообще должны расти во многом потому, что как юзеры (желательно, все) их модифицируют. Разделение на юзеров и девелоперов — это ужасная историческая ошибка, недоразумение, искусственная классификация, приносящая много вреда. По-хорошему, юзеры и должны быть главными девелоперами, потому что никто не знает, как развить программу, лучше, чем её активный юзер. Неискуственной была бы классификация на юзеров software и на тех, кто обслуживает hardware (архитектуру).

> Найдите максимально простую среду программирования.

Да, но это не notepad + compiler. Notepad + compiler — это скорее максимально примитивная среда программирования.

> Фокусируйтесь на основах, на чистом программировании

Да.

> и на том как работает машинка.

Нет, это детали имплементации. Близость к машине — это выигрыш только в скорости и в объёме одновременно обрабатываемых данных. Люди много лет жертвуют скоростью, чтобы писать свободнее, и объёмами, чтобы видеть более красивые картинки. Это очень хорошо.

> И только когда вы уже будете на ты с парой языков программирования (на "ты" уровня новичка).
> Только тогда можете осторожно приступать к изучению более сложных вещей типа ООП

Fuck OOP. Есть более или менее приличные DSL'ы, а ООП — это чёрт знает что. Оно не стоит изучения как самостоятельный предмет. Полезно знать, что это такое, только чтобы иметь общий язык с абсолютным большинством программистов. (Это догадка: я лично этим общим языком не владею.) Никто не любит Visual Studio, которое слишком много делает за юзера; почему же все любят императивные языки, если они делают за юзера ещё большее, или ООП, если оно за юзера аж ваще думает?

> и различных более продвинутых сред программирования.

Нет: Mathematica FrontEnd — это продвинутая среда, но для неискушённого человека она очень хорошо подходит, если человек в курсе, что делает кнопка F1. Думаю, IPython Notebooks (которые имитируют Mathematica FrontEnd) тоже очень хороши.

> Девять лет назад меня вдохновляла вот эта знаменитая статья.

В эссе Beating the Averages, на которое я тут ссылаюсь и на которое ссылался до этого в твиттере, есть по поводу неё комментарии; оно и начинается с отсылки к этой статье. Я не очень много у Рэймондса читал, и впечатления странные: он очень известен и любим, но 0.9 того, что он пишет, либо очевидно, либо является фактической информацией, а остальное 0.1 неправильно и вводит в заблуждение. Грэм, в сравнении, почти неизвестен — в России, во всяком случае — но у него масса таких эссе, из которых слова не выкинешь. Кстати, именно благодаря ему я узнал про формулировку «Языки — в первую очередь для чтения людьми, и только во вторую — машинами». Рэймнодс, насколько я знаю, один из идеологов Open Source. За GPL стоит более продуманная концепция, чем за Open Source, этическая в том числе, но она и более сомнительная, к сожалению: RMS, в отличие от ESR, не либертарианец.
Комментариев: 12 >< выразиться
Comments
nivanych From: nivanych Date: le 24 novembre 2013 07:07 (UTC) (Ссылка)
> ООП — это просто несколько идей
> без какого-либо математического фундамента

Фундамент построить несложно.
Только нахер это кому надо?
Ну, верификация программ на Java, например. Но и там, особенно-то и не нужно этого фундаменту.

Ну и когда добираешься до того, что хоть приблизительно понимаешь, как можно этот "фундамент" сделать — уже становится скучно, ибо к тому моменту, уже изучил "более другие" вещи.
kouzdra From: kouzdra Date: le 24 novembre 2013 07:21 (UTC) (Ссылка)
Сложно на сам деле очень - лет 15 трахались и оно очень простимулировало развитие систем типов
akater From: akater Date: le 24 novembre 2013 07:40 (UTC) (Ссылка)
Не может там быть никакого фундамента, потому что «объект» — бестолковое понятие. «Назовём функцию хорошей, если она равномерный предел кусочно постоянных» — объект это что-то в таком духе, бесполезное вне контекста, в котором оно придумано.
nivanych From: nivanych Date: le 24 novembre 2013 08:02 (UTC) (Ссылка)
В этом смысле, конечно, быть не может.
Но есть вполне так формальные штуки, про которые можно сказать, что они "похожи" на ООП.
Вот как например, наследование — это такая подтипизация.
Хотя и в конкретном случае, запросто будет немало нюансов с аккуратным проведением такого соответствия.
akater From: akater Date: le 24 novembre 2013 08:08 (UTC) (Ссылка)
Вот-вот: есть приличные вещи, которые похожи на ООП, но при этом именно что приличные. Поэтому-то и непонятно, откуда такая невообразимая мода на ООП, если есть они. Скорее всего, это просто заслуга отделов маркетинга.

По другую сторону баррикад своя дурь, и там люди меньше озабочены маркетингом, а жаль.
kouzdra From: kouzdra Date: le 24 novembre 2013 08:52 (UTC) (Ссылка)
На сам деле "объект" - понятие ровно того же рода что и понятие "функции"
nivanych From: nivanych Date: le 24 novembre 2013 07:12 (UTC) (Ссылка)
> почему же все любят итеративные языки

Классически, их называют "императивными".
http://ru.wikipedia.org/wiki/Императивное_программирование
akater From: akater Date: le 24 novembre 2013 07:30 (UTC) (Ссылка)
Случай дислексии, я это и имел в виду.

Edited at 2013-11-24 07:30 (UTC)
kouzdra From: kouzdra Date: le 24 novembre 2013 07:27 (UTC) (Ссылка)
C ООП несколько сложнее - я его тоже недолюбливвю, но с некоторым удивлением даже обнаружил, что в OCaml например ООП самый удобный способ организации проекта - несмотря на мощнейшие типовую и модуьную системы.

А вообще если вспомнить откуда ООП пошло (из языков имитацинного моделирования - конкретно из Симулы-67) то желе рассасывается: ООП удобно для построения моделей реального мира "с вещами" - и когда задача этого требует - оно очень уместно. Монадология это такая - с примерно теми же проблемами что и у Лейбница (тот пытался построить логику на одноместных предикатах, без отношений)

Ну и матоснова там есть - но очень странная - но в некотором роде поучительная:)
nivanych From: nivanych Date: le 24 novembre 2013 07:34 (UTC) (Ссылка)
> в OCaml например ООП

Тов. Олег предложил поступить наоборот — окамелёвым ООП имитировать коданные ;-)
kouzdra From: kouzdra Date: le 24 novembre 2013 08:50 (UTC) (Ссылка)
Ну вот основная проблема с ООП в том и заключается что довольно узкого применения конструкцию все время используют не по назначению. Хотя понятно - расширяемые записи, экзистенциальные типы и странноватая, но удобная параметризация в одном флаконе соблазняет малых сих ;)
nivanych From: nivanych Date: le 24 novembre 2013 09:01 (UTC) (Ссылка)
Не могу найти с ходу тот его пост, но он мне тогда показался троллингом ;-)
Комментариев: 12 >< выразиться