Показаны сообщения с ярлыком образование. Показать все сообщения
Показаны сообщения с ярлыком образование. Показать все сообщения

пятница, января 18, 2008

А вы читали "Искусство программирования"?

Прошлый пост был посвящён Дональду Кнуту и, в частности, в нём упоминалась самая известная его книга "Искусство программирования". К посту был сделан следующий комментарий:



И мне тоже стало интересно. Посему я создал голосование на известном программистском ресурсе RSDN.

Для тех кто с RSDN не знаком, два небольших замечания:

  1. RSDN - очень "профильное" и довольно высокопрофессиональное место
  2. В голосование можно было добавлять свои варианты ответа, так что первые пять вариантов ответа - это то, что я предложил, а остальное добавлено самими участниками
Вот результаты этого голосования:



Если честно, голосование ещё не закончено и результаты могут немного измениться, но мне кажется что тенденция ясна уже сейчас.

Вот такой вот ответ на вопрос.

P.S. По ссылке с сайта "Информатика в России" нашёл видео-подборку лекций Кнута. Это лекции, которые он время от времени читает в Стэнфорде.

P.P.S. Удивительно, как все-таки формируется наше "мнение" о той или иной работе, книге, статье. Порой репутация автора или людей, его рекомендовавших существенно больше влияет чем собственное мнение о конкретной работе. Да наверное даже в большинстве случаев это так - мнение то у нас есть много о чем, а основано оно на чем? На вере в авторитеты. Репутация авторов - часто единственное на что можно ориентироваться, если ты не специалист в предмете.

четверг, января 10, 2008

Дональду Кнуту исполняется 70 лет

Сегодня - 10 января - день рождения Дональда Кнута - всемирно известного автора "Искусства программирования".

Кнут - удивительный человек, написавший удивительные книги, в первую очередь конечно "Искусство ..." - книга, которая заняла огромную часть его жизни и которая все ещё не закончена. По замыслу, она должна содержать в себе все знания, необходимые для программирования машин традиционной архитектуры. Сейчас, как известно, существуют первые три тома, несколько кусков четвёртого и дополнения к ним (вещи, которые должны были попасть в первые тома, но ещё не существовали тогда, когда Кнут их писал). Пятый том планируется закончить к 2015 году.

Цитата из предисловия к "Исскусству":

"Полный набор книг, озаглавленный как Искусство программирования, имеет следующую основную структуру.

Том 1. Основные алгоритмы

    Глава 1. Основные понятия
    Глава 2. Информационные структуры

Том 2. Получисленные алгоритмы

    Глава 3. Случайные числа
    Глава 4. Арифметика

Том 3. Сортировка и поиск

    Глава 5. Сортировка
    Глава 6. Поиск

Том 4. Комбинаторные алгоритмы

    Глава 7. Комбинаторный поиск
    Глава 8. Рекурсия

Том 5. Синтаксические алгоритмы

    Глава 9. Лексикографический поиск
    Глава 10. Синтаксический анализ"
После этого планируются ещё 6 и 7 тома. Подробное описание можно найти на собственной страничке Кнута, посвящённой "Искусству".

Кнут также известен созданием системы Tex. А ещё есть масса занимательных фактов из жизни этого неординарного человека:
  • Кнуту принадлежит высказывание: "Beware of bugs in the above code; I have only proved it correct, not tried it.''

  • Кнут выплачивает 2 доллара 56 центов любому, кто найдёт ошибку в любой из его книг (потому что 2.56 - это один шестнадцатеричный доллар)

  • Кнут пользовался электронной почтой с 1975 по 1990 год, после чего решил что для него этого вполне достаточно - с тех пор он не пользуется электронной почтой
P.S. Ну и популярность конечно тоже не обошла Кнута стороной :-)

пятница, ноября 09, 2007

Ещё вопросы

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

С тех пор уже прошло довольно много времени и у меня появились ещё вопросы, которые вполне можно добавить в тот список.

  1. Что такое тип (предложено Iv) ?
  2. Что такое тестирование? (взято из http://www.techinterviews.com/?p=64)
  3. Почему нельзя запустить под Windows программу для Macintosh? (имеется ввиду без применения специальных ухищрений; впрочем ухищрения тоже можно обсудить)
  4. В чем разница между "оперативной памятью" и "жестким диском"?
  5. Что такое язык программирования? Зачем нужна подобная сущность? (в обсуждении можно коснуться и ассемблера и машинных кодов)
Также некоторое время назад в Сети появилась статья "Интервью глазами пострадавшего" с вопросами которые задаются при приёме на работу в некоторую компанию, разрабатывающую игры. Так вот, в этой статье был вопрос, являющийся, как я понимаю некоторой проверкой "вменяемости" программиста, что ли.

Вопрос такой: 2^8 - это сколько?

Нужен ли такой вопрос и что именно он проверяет - это отдельная беседа. Но у меня на эту тему возник другой вопрос:

6. А почему собственно степени двойки так важны? Почему проверкой вменяемости программиста является "отскакивающий от зубов" ответ на вопрос сколько будет 2^8? А не скажем 3^7 :-)

И как и раньше хочу сказать: цель вопросов - спровоцировать разговор на "базовые" темы, а не получить "правильный" ответ.

среда, сентября 12, 2007

Носители информации: краткая история в картинках

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

Носитель информации - это любое устройство предназначенное для записи и хранения информации.

Примерами носителей могут быть и бумага, или USB-Flash память, также как и глиняная табличка или человеческая ДНК.

Информация тоже бывает разная - это и текст и звук и видео. История носителей информации начинается довольно давно ...

Камни и стены пещер - палеолит (до 40 до 10 тыс. лет до нашей эры)

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



Глиняные таблички - 7-й век до нашей эры

На глиняных табличках писали пока глина была сырой, а затем обжигали в печи.

Именно глиняные таблички составили основы первых в истории библиотек, наиболее известной из которых является библиотека Ашшурбанипала в Ниневии (7 век), которая насчитывала около 30 тысяч клинописных табличек.

Восковые таблички

Восковые таблички - это деревянные таблички, внутренняя сторона которых покрывалась цветным воском для нанесения надписей острым предметом (стилосом). Использовались в древнем Риме.




Папирус - 3000 лет до нашей эры

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



Писали на нем при помощи специального пера.

Пергамент - 2 век до нашей веры

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



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

Бумага - 1-й или начало 2 века нашей эры

Предполагается что бумага была изобретена в Китае в конце первого или начале второго века нашей эры.

Широкое распространение получила благодаря арабам только в 8-9 веках.



Береста - широкое распространение с 12 века

Берестяные грамоты использовались в Новогороде и были открыты учеными в 1951 году.


Тексты берестяных писем выдавливались с помощью специального инструмента — стилоса, изготовленного из железа, бронзы или кости.

Перфокарты - появились в 1804 году, запатентованы в 1884 году




Появление перфокарт в основном связывается с именем Германа Холлерита, который применил их для проведения переписи населения в США в 1890 году. Тем не менее первые перфокарты были созданы и использованы существенно раньше. Жозеф Мари Жаккард использовал их для того чтобы задавать рисунок ткани для своего ткацкого станка ещё в 1804 году.




Перфоленты - 1846 год

Перфолента впервые появилась в 1846 году и использовалась для того, чтобы посылать телеграммы




Магнитная лента - 50-е годы

В 1952 году магнитная лента была использована для хранения, записи и считывания информации в компьютере IBM System 701.



Далее магнитная лента получила огромное признание и распространённость в форме компакт-кассет.


Магнитные диски - 50-е годы


Магнитный диск был изобретен в компании IBM в начале 50-х годов.


Гибкий диск - 1969 год

Первый, так называемый, гибкий диск был впервые представлен в 1969 году.




Жесткий диск - настоящее время

Вот мы и добрались до современности.
Жесткий диск изобретен в 1956 году, но продолжает использоваться и постоянно совершенствоваться.

Compact Disk, DVD - настоящее время



На самом деле CD И DVD это очень близкие технологии, отличающиеся не столько типом носителя, сколько технологией записи

Flash - настоящее время




Естественно здесь перечислены далеко не все придуманные и использованные человечеством носители информации. Часть видов носителей опущена специально (CD-R, Blue Ray, магнитные барабаны, лампы), а часть конечно просто забыта. Во всех ошибках или неправильных описаниях, виноват конечно же я,был бы благодарен за любые дополнения и уточнения.

Благодарности

При подготовке текста были использованы источники:

  1. Википедия (как русская, так и английская)
  2. Советский Энциклопедический Словарь
  3. Берестяные грамоты и письма средневековой Руси
  4. History of Data Storage
  5. University of Michigan Papyrus Collection
  6. IBM Storage Photo Album
  7. Колесников Евгений Алексеевич. Технико-исторические заметки.

пятница, августа 31, 2007

Архивы в сети

В Сети помимо порнографии есть и ещё кое-что :-) В частности, выложены в сеть архивы многих выдающихся учёных.

Программистское


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

Во-первых о том, что к сожалению не вполне ясно насколько эти архивы точны. Уж слишком легко изменить информацию в Сети. Ну конечно подменой занимались всегда - совершенно неважно в какой "информационной среде" это происходит. А с другой стороны согласитесь - осуществить подмену цифровой информации существенно проще, чем приходилось служащим в министерстве правды.

А во-вторых о том, не случится ли что-то с этими сайтами в будущем, не исчезнут ли они? Каждый раз хочется все к себе скачать :-)

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

воскресенье, августа 19, 2007

Про типы

В Блоге Тру Программиста появилась подборка статей, посвящённых типам данных. Всем интересующимся рекомендуется к прочтению.

Все описанное в статьях (как тех на которые я ссылался, так и первоисточниках имени Chris Smith и Luca Cardelli), написано на довольно высоком уровне. Мне же кажется, что очень важным моментом здесь является "качественное" понимание, объяснение, так сказать "на пальцах". Потому что без подобного понимания знание фактов и определений скорее является следованием "культу карго", чем настоящим знанием.

Итак, что же такое типы и зачем они нужны?

Типы данных пришли в программирование из математики. В математике же, как и многие другие понятия они появились по необходимости.

Как известно математики часто проводят в своих рассуждениях чёткое различие между элементами, множествами элементов, функциями и так далее. Для новой переменной, используемой в первый раз, математик определяет "тип", например: "Пусть f - это функция действительного переменного". Часто в книгах (обычно во введении и предисловии) также даются подобные определения: "В дальнейшем для множеств будут использоваться прописные буквы". Эти определения являются не более чем "помощниками" для читателя, позволяют ему быстрее ориентироваться в дальнейшем тексте.

Представители логики и теории множеств предпочитали не иметь дело с переменными различных "типов". Однако, такая необходимость появилась весной 1901 года, когда, во время работы над фундаментальным трудом "Principia Mathematica" известный английский математик и философ Бертран Рассел сформулировал так называемый парадокс Рассела:

"Пусть S - это множество всех множеств, которые не содержат себя в качестве элемента. Содержит ли S само себя?"

Любой ответ, данный на этот вопрос практически мгновенно приводит к противоречию. Данный парадокс можно также переформулировать несколькими более "жизненными" способами:

  • Деревенскому брадобрею приказали «брить всякого, кто сам не бреется, и не брить того, кто сам бреется», как он должен поступить с собой?

  • В одной стране вышел указ: «Мэры всех городов должны жить не в своем городе, а в специальном Городе мэров», где должен жить мэр Города мэров?

  • Некая библиотека решила составить библиографический каталог, в который входили бы все те и только те библиографические каталоги, которые не содержат ссылок на самих себя. Должен ли такой каталог включать ссылку на себя?
Решение этого парадокса, предложенное Расселом носит название "теории типов" и заключается в том, что каждой логической или алгебраической переменной приписывается "тип", который определяет, обозначает ли она [переменная] элемент, множество, множество множеств и так далее. Далее, Рассел постулировал, что любое утверждение вида" x является элементом из y" грамматически осмысленно лишьтогда, когда x - переменная типа элемент, а y - переменная типа множество или x - переменная типа множество, а y - переменная типа множество множеств и так далее. Любое утверждение, не удовлетворяющее этому правилу считается бессмысленным - вопрос о его истинности или ложности просто не существует, оно представляет собой просто набор букв.

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

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

Особенностями понятия типа являются:
  1. Тип определяет класс значений, которые могут принимать переменная или выражение
  2. Каждое значение принадлежит одному и только одному типу
  3. Тип значения константы, переменной или выражения можно вывести либо из контекста, либо из вида самого операнда, не обращаясь к значениям, вычисляемым во время работы программы
  4. Какой операции соответствует некоторый фиксированный тип операндов и некоторый фиксированный (обычно тот же самый) тип результата. (операции, обозначаемые одним и тем же символом, но производимые над различными типами операндом считаем разными)
  5. Для каждого типа свойства значений и элементарных операций над значениями задаются при помощи аксиом.
Таким образом знание типа, позволяет обнаруживать в программе бессмысленные конструкции и предотвращает множество ошибок.

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

Использованные материалы:
  1. Russel's Paradox
  2. Парадокс Рассела - Википедия
  3. Luca Cardelli. Type systems.
  4. К. Хоор "О структурной организации данных" из книги У. Дал, Э. Дейкстра, К. Хоор "Структурное программирование", Москва, Мир, 1975

четверг, мая 10, 2007

Научиться программировать ...

Умеете ли вы программировать? Сам факт того, что вы сейчас читаете данный текст, скорее всего означает что вы имеете какое-то отношение к программированию. И уж точно у вас есть к нему интерес, иначе вы бы просто не знали про существование этого блога. Ну или в крайнем случае у вас есть друзья или знакомые программисты. Так или иначе многие сейчас задаются вопросом "как научиться программировать?".

Это сложный вопрос и я конечно не смогу на него ответить, так что я разочарую тех, кто надеялся получить какой-то готовый рецепт. Когда-то давно я прочитал замечательное эссе Питера Норвига на эту тему. Эссе называется "Научитесь программировать за 10 лет". Его можно прочитать в первоисточнике, а также в русском переводе. Эссе посвящено тому, как по мнению Норвига нужно подходить к (само)обучению программированию, а название это естественно пародия на многочисленные книги типа "Научитесь XXX за 21 день".

Сегодня я ещё раз перечитал это эссе, и заметил там для себя что-то, чего не замечал раньше. Ну, точнее замечал, но как-то не придавал должного внимания. А именно, отношение Норвига к поверхностному обучению. В самом начале эссе, он в шутку разбирает что бы могло на самом деле обозначать название книги "Изучите Паскаль за 3 дня". В частности, Норвиг пишет: "... за три дня вы можете получить только поверхностное представление о языке, а не глубокое понимание. Как говорил Александр Поуп - "Недостаточное обучение - это очень опасная вещь".

Это очень верное замечание, на которое стоит обратить внимание. Именно поэтому в одном из своих предыдущих постов, посвящённом вопросам на собеседовании, я и писал что необходимо проверять базовые знания. Задавать "простейшие" вопросы(в кавычках, поскольку это вопросы на самом деле не простые, просто мы настолько привыкли давать на них ответы-"отписки", что не очень задумываемся о сути). Проверять именно глубину знаний. Проверять что человек умеет программировать, и не впадёт в ступор, когда закон
"закон дырявых абстракций" (The law of leaky abstractions") покажет себя.

Перечитайте ещё раз статью Норвига (ну или прочитайте её, если не читали раньше). На самом деле она ведь не только про программирование ;-)

понедельник, февраля 26, 2007

Какие знания необходимы программисту - часть 2

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

Физические основы

Здесь "физические", от слова "физика" :-) Имеется ввиду наука физика. Наука великая
и странная, нужно нам из неё немного, а именно кое-что, связанное с электрическими цепями, а также электронными компонентами.

  • Электрические цепи (параллельное, последовательные соединения, связь между булевой логикой и электрическими цепями)
  • Устройство основных электронных компонентов (реле, эл. лампа, транзистор, сумматоры, триггеры, защёлки, счётчики, память, декодеры, осциллятор)
Архитектура компьютерных систем

"А теперь со всей этой ерундой мы попробуем взлететь", как говорилось в известном анекдоте. Несмотря на все знания, перечисленные в предыдущих пунктах, мы ещё собственно до компьютеров даже не добрались ... не говоря уже о программировании. Ну вот сейчас мы делаем первый шаг :-)

  • "фон Неймановская" архитектура построения компьютера (использование двоичных чисел, код и данные хранятся вместе, концепция "хранимой программы")
  • Не-фон Неймановские архитектуры (гарвардская)
  • Микропроцессор (оп-коды, регистры, устройство с "электронной" или "физической" точки зрения)
  • Шина данных (с "электронной" точки зрения)
Операционные системы

Операционные системы - это можно сказать "сердце" современных компьютеров. Многие
из них даже достаточно успешно скрывают от нас истинную архитектуру и устройство компьютера, процессора, памяти и так далее.
  • Предназначение ОС
  • Процессы и потоки
  • Управление памятью
  • Ввод/вывод
  • Файловые системы
  • Безопасность
  • Структура операционных систем (монолитные ОС, ОС с микроядром, виртуализация)
Сети

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

  • Физические основы (каналы, пропускная способность каналов, виды каналов, виды волн)
  • Семиуровневая модель OSI
  • Безопасность в сетях
Базы данных
  • Типы баз данных
  • Реляционная алгебра
  • Реляционное исчисление
  • Проектирование баз данных (функциональные зависимости, нормализация)
  • Защита данных
  • Объектно-ориентированные базы данных
  • Структуры хранения и методы доступа к данным
Криптография

  • Симметричные и асимметричные методы
  • Хэш-функции
  • Стойкость
  • Криптографические протоколы

Основы программирования

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

  • Язык ассемблера - основы (смысл не в том, чтобы знать какой-то конкретный ассемблер, а в том чтобы знать что это такое, и как именно согласуется ассемблер с "физическими" основами компьютеров)
  • Парадигмы программирования (процедурное, объектно-ориентированное, функциональное, логическое, аспектно-ориентированное, DSL, метапрограммирование)
  • Основные концепции, достоинства и недостатки каждой из парадигм
  • Основы проектирования (объектно-ориентированный анализ, и тому подобное)
  • Компиляторы и интерпретаторы (разница, преимущества и недостатки)

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

Обсуждение

В завершение хочу высказать несколько мыслей по изложенному списку.

  • Как относиться к этому списку?
    • Если кто-то знает все темы изложенные в списке, то это ещё не значит что он хороший программист.
    • Если же кто-то НЕ знает всех тем, изложенных в списке, то он вполне даже может быть хорошим программистом.
    • Как же так? Выходит этот список бессмысленный? Если не важно знаешь ты темы из него или нет?

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

  • На какую именно составляющую влияют такие списки? Зачем в список включено "Х"? Ведь никогда в жизни этим не придётся воспользоваться в реальном программировании!
    • Я согласен, что очень многими вещами из списка в реальной жизни большинству людей заниматься не придётся. Немногие пишут компиляторы, операционные системы или проектируют новые компьютеры.
    • Тем не менее, как мне кажется, существует так называемый "закон дырявых абстракций" (The law of leaky abstractions"). Идея тут такая. "Абстрагированием" мы называем процесс удаления деталей из представления некоторого процесса. Мы, особенно программисты, постоянно строим один уровень абстракции над другим. Например, операционная система предоставляет нам API, который является абстракцией над всем, что реально делает ОС. Так вот "закон дырявых абстракций" говорит нам о том что "Все нетривиальные абстракции, являются, в некоторой степени, дырявыми". То есть рано или поздно мы, программисты, столкнёмся с тем что находимся там, внизу. Вот именно в этот момент нам и понадобится "X" - для того чтобы понять что же именно происходит. Тут может возникнуть ещё один вопрос - а до какого же уровня все нужно учить? Ведь можно попытаться копнуть ещё глубже, а потом ещё? Это на самом деле сложный вопрос, я не буду отвечать на него здесь. Он заслуживает отдельного размышления.
  • Ты сам-то знаешь все о чем в списке понаписал?
    • Нет, к моему большому огорчению знаю не все. А кое-что знал раньше, но успешно забыл.
  • В список не включено 'Y', а без 'Y' невозможно представить себе программиста!
    • Вполне вероятно. Я запросто мог что-то пропустить, а чему-то не придать достаточного значения. С удовольствием узнаю Ваше мнение по этому поводу. Добро пожаловать в комментарии!

понедельник, февраля 19, 2007

Какие знания необходимы программисту - часть 1

Очень часто на различных программистских форумах, да и просто в разговорах возникает вопрос: а что должен знать и уметь программист для того чтобы быть достойным высокого звания программиста ;-) Ну естественно тут у каждого свое мнение. Один скажет мол главное иметь голову на плечах, а остальное само приложится. Другой же скажет что без знания MFC и шагу ступить нельзя, третий скажет что знать надо то, чем пользуешься, четвертый расскажет, что если не понимаешь что несколько if-else - это на самом деле система линейных уравнений, но тебе и к компьютеру подходить не стоит, ну и так далее.

У меня тоже свое мнение есть :-) Хочу только сразу сказать, я не буду рассуждать про голову на плечах. Голова, она для любой профессии нужна. Тем не менее некоторый набор базовых знаний, как мне кажется, программистам необходим. Вот этот набор, вернее то, каким он мне видится я и хочу описать. Замечу, что я пытаюсь описать знания, которые совершенно необходимо каждому программисту, независимо от того, какие именно программы и в какой предметной области он или она пишет. (Да тут есть некоторая размытость - ведь не дано точного определения программиста. Нужно ли обладать знаниями о которых я буду говорить в дальнейшем бухгалтеру, который пишет макрос в Excel? А является ли программистом художник, рисующий Flash-анимацию? Как это часто уже бывало в этом блоге, оставляю ответ на "программистскую интуицию" и здравый смысл. Возможно этот вопрос - кого считать программистом- это тема отдельного поста? )


Математические основы

Начать хочу с самого для многих неприятного - математики. Есть много мнений - нужна ли математика программистам? А что если я рисую формы - нужна ли мне математика? Вот мой глубоко личный взгляд. В скобках к названию темы я буду давать некоторые ключевые слова, которые на мой взгляд позволяют быстро понять о чем идет речь, даже если название само по себе не помогло. Заметим - в скобках вовсе не делается попытка "раскрыть" тему - просто приводятся некоторые ключевые слова.

  • системы счисления (общие принципы, двоичные, восьмеричные и т.п. числа)
  • способы представления чисел (всевозможные "дополнения до", представление вещественных чисел, числа со знаком и без)
  • математическая логика (исчисление высказываний, логические операции, правила де-Моргана, булева алгебра)
  • анализ алгоритмов (O(n), анализ сложности, NP-полнота)
  • комбинаторика (перестановки, сочетания, размещения)
  • теория вероятностей (мера, нормальное распределение, дисперсия)
  • линейная алгебра (векторы, матрицы, системы линейных уравнений)
  • теория множеств (множества, пересечения множеств , объединения множеств, мощность)
  • основы алгебры (бинарные отношения, изоморфизмы, группы, кольца, поля)
  • теория чисел (факториал, простые числа, делимость)
  • основы теории графов
Алгоритмы и структуры данных

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

  • Структуры данных
    • стек
    • очередь
    • списки
    • хэш-таблицы
    • деревья

  • Алгоритмы
    • сортировка :-) (быстрая, вставками, пирамидальная, "пузырьком" :-) )
    • поиск подстроки, сопоставление с образцом (алгоритм Кнута-Морриса-Пратта)
    • алгоритмы на графах (поиск кратчайшего пути, алгоритм Дейкстры)
Теория автоматов и формальных языков

Вообще-то это конечно можно было отнести и к математике и к программированию,
но мне кажется более правильным выделить теорию автоматов и формальных грамматик в отдельный раздел. И раздел большой и область очень уж специфическая.
  • конечные автоматы
  • автоматы с магазинной памятью
  • грамматики (КС-грамматики, LL и LR грамматики)
  • регулярные языки
  • формы представления языков (форма Хомского, формы Бэкуса-Наура)
  • машины Тьюринга
  • рекурсивные функции
Устал. А до конца ещё далеко. Посему обзываю все что успел написать первой частью :-) и выкладываю.