На одном сайте я раскритиковал книгу
Основы программирования для "чайников".
Критика была таковой:
Изучение программирования начинать надо с дискретной математики, а не с циклов и подобной муры. И уж тем более не с плюсов и бейсика.Один из посетителей сайта обратился ко мне с просьбой:
... на данный момент у меня есть большое желание научиться писать программы для компьютеров. Прикупил даже несколько книг типа Ассемблер для Windows Пирогова, Освой С++ за 24 часа Хорвата и Либерти и еще ряд книг, ... Но ты меня резко "обломал" и чуть ли не задушил мой порыв в корне своей репликой о необходимости изучения дискретной математики! Как это понимать? Вообще, каков кратчайший путь для освоения азов программирования? К примеру, я не собираюсь писать ОС и какие-то архисложные программные комплексы, а всего лишь хочу научиться писать простенькие программы. И мне не нужно какое-нибудь базовое университетское образование, а достаточно минимальных практических знаний. Короче говоря, я хочу сразу брать быка за рога, и не терять напрасно времени. Как и в какой последовательности действовать? Можешь подсказать?В коротком диалоге были сказаны и такие слова:
Что касается, форсированности процессов обучения программированию и сжатости сроков, то я думаю, что в этом деле, как и в любом другом, можно и тянуть резину, а можно и всё делать ударными темпами. Иными словами, я не могу посвятить этому процессу, скажем, 5-10 лет жизни (потому как давно уже к сожалению вышел из студенческого возраста!). Образно говоря, можно учится 10 лет в художественных академиях, а потом уже писать картины и лепить скульптуры. Я же хочу писать и лепить здесь и сейчас! Пусть это будут сначала и плохие картины, НО Я БУДУ ХУДОЖНИКОМ СЕГОДНЯ, а не через 10 лет! :-)
Итак, назвался груздем... придется отвечать. Тем более у меня и личная заинтересованность в подобном посте. Можно было бы лишь назвать короткий перечень литературы и отпустить человека с миром, но тут всплыл ряд ошибочных и даже вредных, на мой взгляд, концепций, основная из которых сводится к хочу "достичь просветления" здесь и сейчас. Артур сравнивает себя со скульптором:
Образно говоря, можно учится 10 лет в художественных академиях, а потом уже писать картины и лепить скульптуры. Я же хочу писать и лепить здесь и сейчас! Пусть это будут сначала и плохие картины, НО Я БУДУ ХУДОЖНИКОМ СЕГОДНЯ, а не через 10 лет! :-)
Для начала, я считаю, что пока у человека будут плохие картины художником он считаться не может - в лучшем случае маляром. А я бы спрятал свои плохие картины с глаз долой. Чтобы стать художником придется пройти долгий и сложный путь. Причем, надо не только иметь талант к работе скульптора, но и знать досконально анатомию человека, свойства различных материалов и т.д. Только тогда получится что-то достойное, а на одном таланте и страстном желании далеко не выедешь. Как ни крути, а нужен крепкий фундамент знания фундаментальных дисциплин. А дальше - тяжелый труд, который будет оттачивать мастерство. Артур, очень рекомендую почитать "Лезвие Бритвы" и "Таис Афинскую" Ивана Ефремова. Или, хотябы главу "Две ступени к прекрасному" из "Лезвие Бритвы" - она не большая и читается с интересом.
Теперь о форсированных темпах. Безусловно, тянуть кота за хвост вредно для дела - его просто не сделаешь. Однако не менее вредны и форсированные темпы - в лучшем случае будет плохой, если не отрицательный результат. Этот вывод получен на собственной практике - и в программировании, которое вас интересует, в том числе. Погнавшись за "крутостью", "передовыми возможностями языка" и "все так делают" я на деле получил ничтожно мало в результате незнания базовых вещей и долгое время не подозревал о колоссальных пластах программистского знания и приемов использования. Вот что сделало для меня желание ускорить события. И это только в программировании. А были ведь промахи и посерьезней по тем же причинам. Я думаю, что стремление за быстрыми и легкими результатами там где их быть не может - одна из самых вредных черт характера, свойственная азартным игрокам, чем человеку психически здоровому и умному. Потому и считаю эту книжку и ей подобные вредными. Лохотроном, если точнее. Кнутт в 3 тома не уложился, а этот в 3-4 сотни страниц. Гербалайф да и только.
Тем не менее, я не отрицаю, что возможны, до определенной меры, и положительные результаты форсированного подхода:
1) когда за дело берется команда опытных людей.
2) когда проект возглавляет мудрый руководитель, способный сгладить неизбежные ошибки.
Самый сложный вопрос - из серии "мне много не надо". Пожалуй самым адекватным будет ответ "аппетит приходит во время еды". И ошибки, допущенные в самом начале пути, приведут к противоречию с самой целью этого пути.
В итоге приходим к "Лезвию Бритвы" уже как концепции.
Теперь конкретно по вопросу. Зачем нужна дискретка. А затем, что все в программировании вертится вокруг ее базовых принципов. Точнее покоится на них. Некоторые особо мощные языки, известные как языки функционального программирования - не что иное, как реализация математических понятий в чистом виде.
Аргумент "где мои 17 лет" - к сожалению, я тоже не могу отнести себя к этой хорошей категории, что не мешает мне пересматривать, время от времени, картину мира. В результате - что-то отвергать, что-то пересматривать, дополнять, углублять. И изучать новое. А в программировании, как известно, чтобы стоять на месте нужно бежать из всех сил. Процесс постоянного освоения нового неизбежен. Учиться новому - такая же работа, как и создание кода.
И наконец мои советы. Используйте то, что в своих программах используют лучшие университеты мира, занимающиеся computer science - MIT, Беркли, Кембридж:
1) По дискретке. Мне очень понравились такие книги:
Род. Хаггарти. Дискретная математика для программистов. Очень хорошая книга. К сожалению перевод имеет тот недостаток, что в нем много опечаток, иногда очень существенных - редактора надо выгнать как бракодела. Но достоинства - основная часть материала очень хорошо изложена и показано реальное применение описанных разделов дискретки на практике.
Биркгоф Г., Барти Т. Современная прикладная алгебра. Книга хоть и старая, но мне очень понравилась.
2) Настоятельно рекомендую
SICP - это программистская суперкнига.
Вот, что пишет о ней Джоэл Спольски. А
вот В. Шабанов. В сети в свободном доступе есть русский перевод. А на сайте MIT есть и виделекции этого курса и сама книга.
3)
Книга Э. Реймонда "Искусство программирования для Unix". Скажу лишь, что это моя самая удачная покупка в 2006 году. Спольски тоже
отзывался о ней. Автор распространяет текст книги бесплатно.
4) Курса лекций
Introduction to functional programming Джона Харрисона.
Предварительный перевод доступен
здесь. А
здесь сам сайт по переводу.
5) Знакомство с культурой Unix - дало мне огромную пользу. И не только мне - не зря это один из основных инструментов для обучения в вышеперчисленных ВУЗ-ах. Самый простой способ с ней познакомится - поставить какой-то из свободных клонов Unix - Linux, например.
6) Почему Basic, Delphi, C++ - не самые лучшие языки для обучения. О болезных, которые слишком рано прикоснулись к бейсику достаточно сказал Дийкстра, мне не имеет смысла повторяться. Скажу лишь, что к продуктам от Борланд это относится в полной мере. Как по мне, С++ - урод. Даже его автор признал, что он слишком запутан, чтобы нормальные люди в полной мере могли его нормально использовать. Тем не менее я признаю, что в некоторых ситуациях его применение может быть оправданным. Но начинать с него обучение я бы не рекомендовал.
7) Советую обратить внимание на такие полезные вещи, как vi и emacs. Хотя их применение не всегда оправдано, с ними определенно стоит познакомится. Мой основной инструмент - емакс, хотя при необходимости я использую и IDE - eclipse, например.
Кажется пока все. Критика приветствуется.