Сделай сам: MSc Computer Science на уровне топ американских университетов из дома

    Вступление


    Давно хотел написать статью про образование в Computer Science, но руки не доходили. Решил все-таки это наконец сделать. Итак, о чем пойдет речь? Речь о том, что из себя представляет диплом MSc Computer Science топовых университетов США (во всех подробностях, включая основные курсы, книги и проекты) и как ему соответствовать.

    Почему именно MSc? Это — некая развилка: с одной стороны после MSc — вы уже готовый к жизни инженер (да, речь идет о инженерной подготовке, как мне кажется это самое больное место в нашей системе образования), с другой — можно спокойно идти по пути PhD. Как известно, в PhD программу можно попасть и не особо умея программировать — особенно это касается теоретического Computer Science. С другой стороны найти работу программиста тоже дело не очень сложное, и часто не требует мощного образования. Но достигнув уровня MSc — вы получаете возможность разбираться как во всех новый идеях в Computer Science, так и возможность их воплотить в практику. То есть с одной стороны круто разобраться в каком-нибудь deep learning и сделать в нем что-то новое, а также взять и написать свою операционную систему (кто так сделал?). Причем вы не зажаты в рамки узкой специализации (если конечно продолжаете учиться). То есть вы теперь — универсальный солдат, готовый на все.

    Надеюсь что эта статья будет полезна:
    1. Студентам, которые хотят соответствовать высоким стандартам топ вузов США, или собирающиеся туда в аспирантуру по Computer Science
    2. Профессионалам, которые хотят закрыть «дыры» и пробелы
    3. Может кто-то из преподавателей возьмет на заметку для своих курсов.
    4. Студентам, аспирантам американских вузов — хотелось бы тоже получить фидбэк, особенно касается последних трендов в образовании

    Что же здесь будет написано? Минимум философии и общих мыслей: конкретная программа undergraduate и graduate курсов, конечно из дисциплин наиболее мне близких. Все курсы были лично прочувствованы на собственной шкуре, по этому и пишу. (Я пытался записаться на все интересные курсы, которые были, но мой основной упор — системное программирование, базы данных и искусственный интеллект. Отсюда конечно некий bias, но пытаюсь предложить более-менее универсальную программу).

    Содержание


    1. Базовая подготовка
    2. Undergraduate программа
    3. Graduate программа
    4. Готовы себя проверить? Computer Science Comps.

    Базовая подготовка


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

    В двух словах суть такая — хоть математики много не бывает, перегибать палку не стоит. Нам надо получить гибридное образование — смесь ученого и инженера, и сделать это в конечное время. Поэтому математику надо минимизировать. Ибо очень много всего интересного есть в Computer Science.

    — Анализ — вполне сойдет уверенное владение основами, то есть многомерный анализ надо понимать, но глубоко вникать со всеми доказательствами не обязательно
    — Линейная алгебра — надо хорошо разбираться, очень нужная штука всюду. Причем желательно на довольно продвинутом уровне (собственные вектора, сингулярное разложение, сопряженные градиенты)
    — Дифуры — можно спокойно пренебречь, очень редко где они вам понадобятся
    — Оптимизация — очень полезно, особенно в машинном обучении это — просто железное требование
    — Алгебры, топологии, прочее — с одной стороны это жутко все полезно, но с другой — изучать это по-математически, абстрактно, без прямого применения мне кажется не стоит — можно освоить, когда понадобятся (например реляционная алгебра или теория категорий для систем типов) и нужные свойства и принципы уже изучить в стыке с практикой
    — Логика, теория множеств — я считаю что обязательно надо разбираться в основах. ZFC надо брать.
    — Теория вероятности, статистика — по минимуму из классической математики, лучше учить то, что нужно для Computer Science в контексте машинного обучения, а то рискуете закопаться в том, что не особо полезно
    — Теория игр — полезная штука, но поверхностных знаний хватит надолго
    — Функциональный анализ, вариационные методы — очень классно, но изучать только если припрет, например в машинном обучении
    — Численные методы — только если хотите ими потом заниматься

    Все остальное или не математика, а Computer Science, или не нужно (пока не понадобится для конкретного случая)

    Языки программирования


    Полемичная тема, выбора много, я предлагаю такой минимальный джентльменский набор:

    — ассемблер — чуть-чуть надо владеть каким-нибудь ассемблером, ибо нам придется сделать свой компилятор. Тут несколько вариантов:
    • RISC штука хорошая, но где его взять, только эмулировать, не очень удобно. Но если наладите среду — то RISC
    • LLVM полезная штука, но много чего упрощает, не 100% железо.
    • x86 — ужасен, но gcc -S очень приятно пользоваться прямо на своем ноутбуке.
    • JVM bytecode — не пробовал генерить, наверное есть удобный способ. Но, если потом много использовать JVM — может быть очень полезно.


    — C++/Java — к сожалению в системном программировании от этих далеко не уйдешь. Но по-максимуму надо обходиться без них.
    — Python — быстро что-то сваять, проверить гипотезу, классные библиотеки, особенно в машинном обучении и математике + основные фишки из функционального программирования
    — Scala — практический функциональный язык, при желании можно спуститься и достаточно близко к железу. Много всего системного уже пишут на Scala. Следует сделать основной рабочей лошадкой.

    (SQL, Prolog — естественно тоже, но это маленькие язычки)

    Приступим?

    Undergraduate


    Курс будем считать как одну четверть — 3 месяца. Пропустим все вводные курсы про программирование.

    1. Дискретная математика (не забываем, что это — уже не математика)
    Комбинаторика, теория графов, дискретный тер. вер., recurrence relations, функции-генераторы.

    На самом деле — это обычно начальный курс, можно посмотреть онлайн, например в MIT:
    ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-042j-mathematics-for-computer-science-fall-2010

    Все это можно пропустить и освоить в других курсах (так как время не жмет). А то может стать скучно, а это — плохо.

    2. Алгоритмы и структуры данных
    Начиная от всяких сортировок, хэш-таблиц, разных деревьев, потом алгоритмы на графах (Djikstra, min cut/max flow).
    По концептуальным знаниям: оценка сложности в нотации O, жадные алгоритмы, динамическое программирование.
    Дополнительные темы: линейное программирование, алгоритмы для строк, рандомные алгоритмы.
    Самые первые начала теории сложности.

    Книжка: www.amazon.com/Introduction-Algorithms-Edition-Thomas-Cormen/dp/0262033844

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

    P.S. Алгоритмы дальше свои в каждой предметной области, и вернемся к общему курсу только в graduate программе.
    Но сразу можно порекомендовать книгу по рандомным алгоритмам (недавно коллега посоветовал, пока только пролистал, но вроде очень грамотная), она graduate уровня, но погружаться надо начинать пораньше: www.designofapproxalgs.com/index.php

    3. Теория вычислений
    Здесь я пропагандирую Сипсера, вообще великолепная книжка — must read, причем годится и для graduate программы.
    www.amazon.com/Introduction-Theory-Computation-Michael-Sipser/dp/113318779X

    Это супер-важный курс, он заложит основы для всего остального. У Сипсера очень все очень интуитивно, логично и связано. (Недавно полистал Колмогорова — там сразу дается понять, что без мехматовского уровня лучше не заходить. У Сипстера — наоборот, минимум требований, минимум формализации, только самое необходимое — и все становится очень доступным).

    Начинаем с определения «задачи» — у Сипсера это — язык. То есть множество строк. Алгоритм — что-то, что на любую строку говорит — да/нет. В этой концепции идет вся работа. Дальше, иерархия языков: регулярные, контекстно-независимые, вычислимые, перечислимые, невычислимые. Также очень неплохо преподносится complexity — P,NP,NP-complete,NP-hard,co-NP + рандомные классы.

    Помимо хорошей теоретической подготовки получаем отличные скилы:
    Работаем с конечными автоматами и регулярками
    Работаем с грамматиками и с автоматом со стэком
    По-программируем на Тюринговой машине — это реально надо поделать, это прикольно, расширяет сознание.
    Программировать на машине можно здесь, даже есть брейкпоинты! morphett.info/turing/turing.html
    Учимся доказывать, какие задачи нерешаемые, причем самыми удобными и быстрыми способами
    Играемся с reductions — перевод одной задачи в другую — также очень расширяет сознание

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

    4. Математическая логика и теория множеств
    Обычно не входит в программу Computer Science, но я считаю надо освоить. Я по этой книжке учился, очень простая книжка, очень приятная:
    www.amazon.com/Elements-Set-Theory-Herbert-Enderton/dp/0122384407

    Все, на этом чисто теоретическая подготовка в undergraduate Computer Science закончена, теперь — прикладные курсы

    5. Компиляторы (2 четверти)


    Книга: en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools

    Уже многое освоено из теории вычислений, здесь весь акцент на практику. Наша задача — сделать реальный компилятор из серьезного языка в ассемблер. Например нам дали en.wikipedia.org/wiki/Object-Oriented_Turing, но можно что-то более интересное.

    — Синтаксический разбор: тут надо брать что-то разумное, вроде JavaCC или ANTLR.
    — Перевод в AST
    — Семантический анализ: лайтово, хотя можно заморочиться с системами типов
    — Генерация кода

    Если есть силы и время — добавить сюда Intermediate Language и чуть-чуть оптимизации, самой простой.

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

    Примечание: нам приходилось все писать на C++, но в современном мире это совершенно не надо для образовательных целей. С другой стороны, если компилятор писать на Питоне или Скале (с питоном умеет работать ANTLR, со Скалой не знаю что есть — если кто-то знает хороший инструмент, просьба подсказать. Пытался понять что Spark SQL использует, но не выкопал) — можно сделать гораздо больше всего интересного с наименьшими потерями.

    6. Архитектура
    Книжка: www.amazon.com/Computer-Architecture-Fifth-Edition-Quantitative/dp/012383872X

    Ну тут так — почитать, поделать задачки. Но если есть возможность — неплохо бы спроектировать мини-CPU.
    На чем-нибудь вроде: www.logiccircuit.org

    7. Продвинутые структуры данных
    Не уверен какие тут хорошие книжки, но неплохо бы сделать свои индексы на диске:
    — B-дерево
    — Линейный хэш
    — R-дерево

    Здесь уже все жестко, C++. Но можно и не заморачиваться, если только не хотите строить базы данных/поисковики.

    8. Операционные системы (2 четверти)
    Тут у меня такой подход — прочитать книжку: www.amazon.com/Operating-System-Concepts-Abraham-Silberschatz/dp/0470128720, но только ради общих концепций. А реально освоить OS таким образом:

    Берем Начос: en.wikipedia.org/wiki/Not_Another_Completely_Heuristic_Operating_System (или Nachos 5.0j) и пишем свои модули:
    — Примитивы синхронизации
    — Библиотечка потоков
    — Мульти-процессинг
    — Мини-шелл
    — Виртуальную память
    — Файловую систему

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

    После такого упражнения, никакой мистики насчет операционных систем не останется.

    9. Базы данных (2 четверти)
    Читаем книжку: www.amazon.com/Database-Systems-Complete-Book-Edition/dp/0131873253
    Делаем следущий проект: пишем движок SQL сверху простенького хранилища, если времени мало — делаем, как MySQL — запускаем AST. Если времени больше — переводим в реляционную алгебру и добавляем пару оптимизация (каких-нибудь rule-based).

    Примечание: опять же, в свое время пришлось все делать на C++/lex/yacc. Время ушло вперед, если делать на Питоне или Скале, можно с меньшими потерями сделать гораздо больше. Или взять сразу более интересный язык запросов, например OQL или SQL++.

    10. Искуственный Интеллект
    AI — в моих глазах всегда была и будет самой интересной областью в Computer Science, так как там всегда решают очень сложные задачи. При этом, как только что-то хорошо начинает получаться, это прекращает быть AI и выделяется в отдельную дисциплину. В общем читаем замечательную книжку, и делаем 2-3 проекта.
    www.amazon.com/Artificial-Intelligence-Modern-Approach-Edition/dp/0136042597

    Рекомендуемые проекты:
    — A* поиск для задачи 8-королев или еще какой-нибудь, повозиться с эвристиками
    — доказатель теорем (resolution theorem proving)
    — сделать эффективный вывод для баесовской сети
    — реализовать временную логику Алена
    — само-обучиться играть в шашки или играть в шахматы mini-max-ом (считая дерево)

    Хард кор: можно сделать все задания в курсеровском курсе Probabilistic Graphical Models, но это больше для уровня аспирантуры.

    11. Машинное обучение
    Без этой темы сейчас никак. Не в курсе, какой учебник лучше для undergrad, но в идеале освоить Бишопа:
    www.amazon.com/Pattern-Recognition-Learning-Information-Statistics/dp/0387310738

    Вот класс Andew Ng в Стэнфорде для undergrad, не путаем к классом на Курсере, совсем разные уровни:
    cs229.stanford.edu

    И еще я нашел просто чудесные лекции на YouTube (mathematicalmonk): www.youtube.com/playlist?list=PLD0F06AA0D2E8FFBA

    12. Компьютерная графика
    Не особо обязательно, но каждый программист когда-то хотел написать свою игру, так что надо брать для фана и для разговоров за пивом.
    Не уверен, какие хорошие книги сейчас.
    Мы писали кусок OpenGL на C, очень полезно — дает представление как работают все 3D движки.
    Можно еще свой Ray-Tracer написать — тоже прикольная штука.

     13. Копьютерные сети
    Пропустил этот курс, но есть очень хороший курс на Курсере
    www.coursera.org/course/comnetworks

    14. Распределенные системы
    Сильно пересекаются с операционными системами, но много своих важных фишек.
    Я бы просто прочитал книжку, особенно ключевые концепции, а не конкретные системы:
    www.amazon.com/Distributed-Systems-Concepts-Design-Edition/dp/0132143011

    Синхронизация, глобальное состояние системы, консенсус, транзакции, т.д. Сейчас всякие MPP системы стали очень популярными, здесь — основы, на которых они держатся (или не держатся, готовлю популярную статью про всякие модные базы данных).

    15. Языки программирования
    Часто попадается такой курс, но обычно — трата времени имо. К этому моменту написан компилятор для Turing и SQL, все ясно. Можно заморочиться чем-нибудь вроде Haskell или ML. Как вариант изучить XQuery для небольшого расширения сознания.

    Тут я бы закончил undergrad программу, у вас есть диплом B.Sc., поздравляю.

    Или можно пойти вширь: Security/Cryptography, Scientific Programming, забуриться в AI: Computational Lingustics например. Что мы имеем после такой программы? Можно спокойно идти работать, но есть еще пробелы в теоретической базе. Можно все заполнить самостоятельно, а можно продолжать учиться на M.Sc.

    Graduate

    Аспирантура в Computer Science — это не наша аспирантура. Здесь вы продолжаете учиться пару лет и сдаете comprehensive exam, в случае PhD по 5-ти дисциплинам, то есть надо в голове держать очень серьезную базу на этот момент. Очень полезное упражнение (я сдавал на MSc по 3-м, это намного проще).

    И очень быстро начинается специализация. Но давайте основы:

    1. Алгоритмы
    То же, что и в undergrad, только уже по-настоящему, глубже, плюс рандомизация.
    Тут как бы и нет всеми признанной книжки, советую полазить по сайтам университетов. То есть многие обходятся статьями, слайдами и т.п.
    Ну и рандомные алгоритмы — это наше все. Так что открываем книгу: www.designofapproxalgs.com/index.php

    2. Теория вычислений, по сути чистая Complexity Theory
    Можно покрыть Сипсера, и попробовать прочитать еще что-нибудь. У нас был Пападимитроу, но это конечно не для слабонервных. Здесь в основном одни редукции, раньше были NP-complete, сейчас много в рандомных классах.

    Еще, если нравится логика, имеет смысл почитать Descriptive Complexity: people.cs.umass.edu/~immerman/book/descriptiveComplexity.html

    3. Архитектура
    Та же книжка, но уже по-взрослому. Можно построить какой-нибудь продвинутый CPU.

    Дальше уже специализация по большому счету. Я бы посоветовал такие области, но это уже мой bias:

    4. Машинное обучение
    На уровне аспирантуры можно брать Бишопа (сам еще не всего его прошел), и теория машинного обучения
    Мне нравится старая добрая: www.amazon.com/An-Introduction-Computational-Learning-Theory/dp/0262111934
    Но наверное уже намного актуальнее есть книги.

    И можно на курсере зависнуть:
    — Probabilistic Graphical Models
    — Еще очень хороший курс Natural Language Processing от Columbia University
    — Современные нейросети: class.coursera.org/neuralnets-2012-001

    5. Теория баз данных
    www.e-booksdirectory.com/details.php?ebook=7942
    Это очень увлекательное поле, здесь намешано все, что можно: Логика, Теория моделей, Complexity, Descriptive Complexity, даже теорию игр поэксплуатировали. Книга довольно тяжелая и формальная, но стоит того, хотя бы выборочно прочесть и поделать упражнения.

    Чего пропущено?
    Совсем ничего про формальные методы нету, ну тут сложная штука. По идее между теорией множеств, искуственным интеллектом и теорией баз данных + descriptive complexity — есть весь инструментарий для верификации и доказательств, поэтому такой курс уже должен быть чисто прикладным. Если есть опыт такого курса — очень интересно было бы узнать.

    Интернет математика — ну это тоже немного отдельная тема, но вся база заложена.

    Все, если дойдете до сюда, делая проекты и решая задачи, можно считать, что вы достигли уровня M.Sc. в Computer Science на уровне топовых университетов мира.

    Пройдем тест?

    Можете поискать в сети «Computer Science Comprehensive Exam» или что-то вроде этого, и можно найти реальные экзамены уровня M.Sc. и Ph.D.

    Я ссылки решил не выкладывать, чтобы не палить лишний раз, так как обычно их не очень распространяют.

    P.S. На этом все. Наверное кое-что устарело, но основы всегда остаются актуальными.

    P.P.S. Конечно, сидя дома на диване, сложно такую программу осилить. Делать упражнения и большие проекты особенно сложно. Без университетской среды тоже очень сложно (но и в университете бывает непросто — ночи в лаборатории — частное явление). Но! — все возможно. Все приведенные книжки (ну почти все) написаны максимально просто, требуют минимум предварительных знаний, сразу показывают, как полученные знания применять, в общем очень годятся для самостоятельного изучения. Курсы на курсере или записи лекций из университетов — тоже очень полезная штука, посмотреть лекцию требует гораздо меньше усилий, чем читать книжку, решать задачи, и т.п.

    P.P.P.S. Советы для профессионалов, которые «все забыли», зажались в своей нише, но хотят опять выйти на bleeding edge: сам через это проходил, бывает замутнение мозгов и кажется что все упущено и нет надежды. Но по сути это как начать заниматься спортом после нескольких лет нездоровой пищи — начинаем с малого, ставим короткие цели, радуемся малейшему прогрессу, и довольнобыстро все формулы станут опять понятными, выстроится опять общая картина мира, и можно вновь ощутить себя студентом/аспирантом.

    Сайты университетов:

    Stanford: cs.stanford.edu
    MIT: www.eecs.mit.edu
    UC Berkeley: www.cs.berkeley.edu
    UC San Diego: cs.ucsd.edu (моя альма-матерь, ну еще не #4, но ползет вверх каждый год!)
    Share post

    Similar posts

    Comments 64

      +3
      Спасибо.
        +1
        Надо же! И ни разу не упомянут Кнут!
          0
          Кнута очень уважаю, как и Колмогорова :) Почитайте Колмогорова :)
            +9
            Реально, книги Кнута как учебники никто не использует.
            +5
            Все его упоминают, но на самом деле мало кто читал. Он хорош скорее как справочник. А для изучения лучше, скажем, взять Кормена и др. «Алгоритмы: построение и анализ».
              +1
              А ещё лучше взять Седжвика. Это один из учеников Кнута, считающий, что изложение должно быть максимально доступным. Без десятеричных ассемблеров MIX и конкретной математики в качестве разгрузочных упражнений.
                0
                Я когда-то учился по Кормену, так что у меня импринтинг возник. :) Седжвика тоже читал, но он больше практикам подходит, примеры кода этому только способствуют.
              +4
              Коллеги из СПБАУ рекомендовали эту книжку, как более простую альтернативу Кнуту и Кормену: habrahabr.ru/company/spbau/blog/222427/
                0
                Да, слышал хорошая книга — правда по оглавлению почти такая же, как в ссылке.
                  0
                  Хорошая книжка и легко читается, но, к сожалению, короткая. :)
                +3
                Численные методы — только если хотите ими потом заниматься
                Как же Вы собираетесь машинным обучением без вычей заниматься? Уж про вычислительную алгебру точно почитать нужно.
                функции-генераторы
                generating functions на русском зовутся производящими функциями, а не генераторами.
                Graduate

                Аспирантура в Computer Science — это не наша аспирантура. Здесь вы продолжаете учиться пару лет и сдаете comprehensive exam, в случае PhD по 5-ти дисциплинам, то есть надо в голове держать очень серьезную базу на этот момент. Очень полезное упражнение (я сдавал на MSc по 3-м, это намного проще).
                Мне казалось, что в аспирантуре студенты уже не столько учатся, сколько помогают учить других (TA) и занимаются исследованиями. Другое дело – обучение на магистра, но не стоит путать MSc и PhD. Зачастую встречаются всевозможные комбинации вроде магистратуры, плавно перетекающей в аспирантуру, но в общем случае, согласно моему представлению, это разные программы.

                Соответственно, аспиранту в машинном обучении нужно знать примерно всё. M. Jordan составил список того, что нужно прочитать аспиранту, собирающемуся заниматься исследованиями в области машинного обучения.
                  0
                  Линейную алгебру я включил. Оптимизацию тоже. А все остальное — отдельными курсами не стоит мне кажется — чего-то понадобится конкретное — можно изучить.

                  Да, не всю терминологию на русском еще освоил :)

                  По поводу MSc/PhD — нет, программа, курсы одна и та же, требования по PhD чуть выше.

                  Насчет Jordana — я не про PhD писал — это отдельная тема, я пропагандирую универсальность, и смесь инженера/ученого. У нас в России почти негде заниматься исследованиями в области машинного обучения (и получать при этом разумные деньги на жизнь)
                    +3
                    Линейную алгебру я включил. Оптимизацию тоже
                    Линейная алгебра в отрыве от её вычислительного аспекта не очень полезна прикладнику. Как вы, например, собственные числа искать будете? Как корни характеристического многочлена? А вот для многочлена 5-й степени и выше не существует алгоритма, позволяющего найти решение в аналитическом виде. Тут уж без вычей никак.
                    Можно, конечно, просто взять библиотеку, но понимания того, что она делает, нет. А потом ещё и удивляться, почему же это с матрицами с большим числом обусловленности всё плохо.

                    У нас в России почти негде заниматься исследованиями в области машинного обучения (и получать при этом разумные деньги на жизнь)
                    Яндекс в последние лет 10 развёл хорошую «движуху» в Москве на эту тему: в самом Яндексе есть исследовательские группы, есть ШАД, есть совместные магистратуры с Физтехом и Вышкой. Помимо этого, в МГУ есть кафедра Математических Методов Прогнозирования, некоторые её сотрудники предподают и в ШАДе. Наконец, в СколТехе есть группа компьютерного зрения, кажется, занимающаяся Deep Learning'ом (разумеется, в задачах зрения). Вроде, есть ещё Samsung R&D, но про него я ничего не слышал.

                    Про другие регионы, к сожалению, сказать толком нечего. До недавнего времени в Питере существовала HP [Research] Labs, где занимались всевозможными исследованиями на тему анализа данных (аудио, видео, картинки и текст), но в прошлом году лаборатория вместе с сотрудниками была перенесена в Штаты.

                    Получают ли все эти люди разумные деньги, я, разумеется, не знаю, но считать чужие деньги – не самое хорошее занятие.
                      0
                      Есть разные подходы к преподаванию линейной алгебры, в штатах очень часто делаю курс для инженеров с вычислительной составляющей. Но тоже, не перегибая палку. Когда вляпались — тогда уже можно изучать. Вот например курс MIT, правда я бы его упростил существенно: убрал дифуры, комплексные пространства, и т.п.

                      Да, вот вы и перечислили почти все места. Еще неплохо обстоят дела в Институте Проблем Передачи Информации и в Институте Системного Программирования. Это, увы, очень и очень немного…

                      Деньги — уж извините, штука важная, и без них всегда один исход — все уезжают в штаты.

                        0
                        P.S. Вот например курс MIT по линейной алгебре (но такой, перебор). Более простные курсы — часто недобор.
                        ocw.mit.edu/courses/mathematics/18-06-linear-algebra-spring-2010/
                          +1
                          Ну окей, если курс по линейной алгебре уже содержит в себе вычислительную составляющую, то хорошо.

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

                          Деньги — уж извините, штука важная, и без них всегда один исход — все уезжают в штаты.
                          Ну, судя по тому, что что-то ещё в России осталось, недостатка оных не наблюдается. Ну и не в деньгах же счастье.
                            0
                            Ну DSP в штатах обычно не в Computer Science, а в Electrical Engineering или Computer Engineering. Тут можно очень большой перегруз устроить — если нужен DSP — можно тогда в нем и учить комплексное пространство.
                    +3
                    Автор дает очень полезные рекомендации. Только все как-то ориентированно на машинное обучение. Про одну только компьютерную графику можно такую статью сделать, если вдруг кто-то мечтает стать игроделом. А про написание веб-сайтов с блекджеком и отдельной статьи может не хватить. Но в целом, необходимое упомянуто.

                    Меня смутило только пренебрежительное отношение к языкам программирования. Можно конечно «Scala… сделать основной рабочей лошадкой», а потом выяснить, что индустрия использует C++/Java, при этом желательно наличие опыта программирования на С-подобном языке. Ведь может быть так, что человек просто хочет работать программистом безо всяких machine learning. Мне не ясна логика автора в этом вопросе.
                      +3
                      Нет, как на машинное обучение? Чисто для машинного обучение не надо ни компилятор писать, ни СУБД, ни операционку. Как раз я за универсальность.

                      К языкам программирования отношение не пренебрежительное — это мой накопленный опыт, можно отдельную статью про это написать. Вкраце — почему Скала? В обучении хочется с минимальными трудностями решать сложные задачи. Если вы доказатель теорем будете писать на C, у вас это займет в 10x больше времени, чем на Питоне. И зачем терять время? Но на Питоне вы не напишете высоко-производительный код и у вас никаких статических проверок. Скала — совмещает оба — можно заниматься ситемным программированием на ней, и можно писать AI код.

                      Перейти со Скала на C++/Java не так сложно (но очень неприятно!)
                        +2
                        Популярность Scala сейчас растет. Мне удалось найти работу не имея попыта в Java — Scala оказалось достаточно.
                        +11
                        Почитал статью. Потом учебную программу нашего универа. Потом снова статью. Понял что родился не в той стране.
                          +4
                          Университет должен давать базу, но если этого не происходит — всё в ваших руках. У меня в университете было не много интересного и я это интересное сам осваивал (например по новому языку за семестр). Почитайте что-нибудь из списочка (https://github.com/vhf/free-programming-books)
                            0
                            У нас осталась очень сильная математическая школа все равно, если есть тяга к знаниям — всего можно добиться
                            –2
                            Корочку надо получать на уровне топ-университетов в первую очередь. Знаний у вас может быть сколько угодно, только никому вы с этими знаниями не нужны, если не проходите формальный отбор на какую-нибудь визу по наличию диплома.
                              +2
                              Для получения визы как раз-таки топ-университеты и не обязательны.
                              Сам уехал в штаты по H1B визе имея диплом БГУ (далеко не топ в мировом рейтинге).
                                +2
                                Ну ок, «корочку надо получать в первую очередь», можно так сказать. Без диплома, думаю, не уехали бы.
                                  0
                                  Без диплома точно бы не уехал.
                              –3
                              Все это хорошо и важно, но немножко 20-й век сплошной.

                              Есть вещи более современные. После всех этих графов и синхронизаций и ассемблеров, бац — а монады человек в упор не понимает. CPS в упор не понимает. Почему wait/notify не нужно, не понимает.

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

                              Но вернемся к элементарным вещам. Лямбда-калкулюс тут где у вас?

                              (Я, видимо, немножко туповат — не вижу, а кто автор-то?)
                                +4
                                Вы думаете монады в 21-ом веке изобрели? Теории множества и теории баз данных (где теория моделей присутствует) вполне хватит, чтобы быстро понять все что нужно из теории категорий.

                                CPS (Continuation Passing Style) изобрели в 1975 году

                                Лямда-калькулус давно не проходят в университетах, зачем он нужен? Хватит других калькулусов, более полезных, тот же реляционный калькулус.

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

                                  Остальные же части вашего комментария я комментировать не буду, т.к. полагаю, что это все — наивное мнение не то чтоб очень образованного технаря. Реляционный калькулюс наукой не является, а является системой обозначений, как, к примеру, Z-notation.

                                  И речь не о том, чем типа я или кто-то хочет заниматься; речь о понимании сути того, чем человек занимается. Если вы лично остановились в своем развитии на «реляционном калькулюсе», то мои соболезнования.
                                    –1
                                    Хорошо, что вы спросили, зачем нужно лямбда-исчисление. Это одна из самых удобных формализаций вычислительного контекста с точки зрения размера и формальности доказательств с её использованием. Правила редукции на основе какой-нибудь машины Тьюринга выглядят крайне синтетическими, и содержат больше бесполезных подробностей нежели смысла. Во многих ВУЗах и теорию множеств не рассказывают, но от этого никак не изменится тот факт, что она крайне удобна в качестве оснований математического анализа и других разделов математики.

                                    Реляционная алгебра или реляционное исчисление? Реляционное исчисление кортежей или исчисление доменов? В каких именно приложениях вы их использовали, и когда они оказались вам полезны? Как вы можете утверждать, что «реляционный калькулус» полезнее лямбда-исчисления, если вы его не знаете?

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

                                      Может дело в вежливости, а не в разности мнений?
                                      Я вот ничего против функциональщины не имею, но больше всего меня отталкивает от нее это наше community — напыщенные, самоуверенные «олимпиадники», которые хамят на каждом шагу.
                                        0
                                        Исчесление. По сути relational calculus = set comprehension в функциольных языках
                                      +2
                                      Вообще всегда знал, что хаскелисты — люди агресивные, такой вам вопрос на встречу — с чего вы взяли, что функциональное программирование — это круто? По-моему логическое программирование ничем не хуже. Можно турнир устроит — Haskell vs. Prolog.
                                        +1
                                        Prolog плохо позволяет писать обобщенные алгоритмы. Это приводит к тому, что к нему нет стандартизованных библиотек и в реальных задачах он не очень практичен.
                                        Но изучать его надо, хотя бы что бы подойти к программированию в ограничениях. Да и после него проще изучать SPARQL и Erlang :-)

                                        Haskell — прекрасное сочетание элегантности и практичности. К тому же на нем можно разобрать ленивые вычисления. В других языках получается слишком сложно.
                                          0
                                          Если вы не поняли — это была провокация. Давайте оставим место конструктивным дискуссиям.
                                            0
                                            Вы всё же определитесь, была ли это провокация или начало конструктивной дискуссии.

                                            Программисты же обычно люди рациональные, и не выбирают языки программирования, пользуясь метриками вроде «круто». Если у вас есть более конкретный вопрос, я мог бы вам на него ответить.
                                        +2
                                        И еще в догонку — дайте пожалуйста формальное определение монады в формализме ZFC а не в теории категорий.
                                          0
                                          Монады это функуторы, область опередения и значения которых часто не являются множествами. ZFC с подобными объектами не очень хорошо работает.
                                          К тому же сомневаюсь, что ZFC полезнее теории категорий для программиста. Да и не проще.
                                            0
                                            Ну все, Глеб срезал.

                                            ZFC ваше тут ни пришей не пристегни, товарищ оппонент. Монады от теории множеств не зависят.

                                            Впрочем, спасибо, открыли мне немножко глаза на образ мышления людей, «обучившихся компьютерным наукам». Я со своими студентами тоже все удивляюсь. Линейная алгебра от зубов отскакивает, а что такое композиция двух функций, первый раз слышат.
                                              0
                                              О да, срезал, как у Бунина… ZFC со всеми объектами нормально работает, видимо вы не в курсе.
                                                0
                                                Пока вы не развеяли мои сомнения в том, что вы знаете, что такое монады.
                                                  0
                                                  Ну что вы, в мои планы вовсе не входит развеивать какие-либо из ваших сомнений. Сомневайтесь на здоровье, не буду вам мешать.
                                                  +4
                                                  Шукшин всё-таки.
                                                    –1
                                                    Замечание: класс объектов обычно не является множеством в смысле аксиоматической теории множеств. Категория, в которой объекты составляют множество, называется малой. Кроме того, возможно (с небольшим исправлением определения) рассмотрение категорий, в которых морфизмы между любыми двумя объектами также образуют класс, или даже большую структуру. В этом варианте определения категория, в которой морфизмы между двумя зафиксированными объектами образуют множество, называется локально малой.

                                                    Неужели так сложно хотя бы прочесть определение?
                                              0
                                              Не надо от аглебры и теоретикомножественной топологии отказываться. Очень полезное для понимания того, что в программе происходит, продолжение теории множеств.
                                                0
                                                Не говорю отказываться, но не изучать абстрактно. То есть понадобилось — тогда уже изучить. Тут похожий подход нужен, как в физике — берем аппарат тогда, когда он нужен, а не заранее не пойми зачем.
                                                  +1
                                                  Эти дисциплины полезны не столько сами по себе возможностью применения (этим тоже, но обычно можно пережить и без них), сколько тем что дают новый взгляд на базовые понятия. Как и теория множеств.
                                                    0
                                                    Математики для computer science мало не бывает. Но нельзя сначала закончить мехмат, а потом учить computer science. Да и на мехмате не все выдерживают одну абстракцию без практического приложения. Вот посмотрите книжку Виану по теории баз данных — там очень хорошая математика, но вся сразу в приложении.
                                                +1
                                                Видимо Computer Science != Information Technologies
                                                Я учился на M.Sc.IT в Британии, из вашего списка нам преподавали от силы 20% дисциплин
                                                  0
                                                  Ну IT = бизнес образование по сути, на одном science без бизнеса далеко не уедешь
                                                  +1
                                                  Я учился в Германии на степень диплом-информатик (потом эту степень переименовали в M.Sc.). Курс был очень похож.

                                                  P.S.: Хорошая книга по model checking'у (одна из ветвей верификации): mitpress.mit.edu/books/principles-model-checking
                                                    0
                                                    Очень интересно про Германию, там всегда была мощная школа по Computer Science, но все никак не получается там сделать конкурент силиконовой долины. А прямо совсем похож, или какие-то отличия? Немецких студентов, приезжающих в штаты на PhD обычно отличала особенно сильная математическая подготовка.
                                                      +1
                                                      Ну тут первые 2-3 семестра основы математики (анализ, линейная алгебра, дискретная математика, теория вероятности, мат. логика и игры, основы нумерики) являются общими лекциями для информатиков, математиков и физиков (+ учителя). Соответственно поблажек там нет, учат доказывать, разбираться в нотации итд. После второго года можно выбирать специализацию в том числе и в теорию (advanced alogirhtms, complexity beyond NP, parameterized algotihms, automata theory and logic, formal verification etc.). Заставляют сохранять некий «микс» между теорией и практикой, но специализаций очень много — практически по числу кафедр.
                                                        +1
                                                        и еще, тут лекции часто ведутся не по одной книге как в часто штатах или Англии (где даже слайды стандартные по книге), а по нескольким книгам и/или пэйперам. Это заставляет студентов читать разные книги и сравнивать источники.
                                                      0
                                                      Вот еще пара ссылок на подобные же идеи — собрать из онлайн-курсов университетскую программу: http://abava.blogspot.ru/2014/05/blog-post_10.html
                                                      Вполне получается.

                                                      Мне кажется, такого будет больше — учебные сайты будут собирать «программы» под конкретных заказчиков
                                                        +4
                                                        Вот мнения аспиранта из Brown, который учился в МГУ:

                                                        Добавлю мои пять копеек. Наверное, больше не с точки зрения «сделай сам», а как человек покрутившийся здесь в graduate school.
                                                        Снача немного воды.

                                                        Имхо, MSc нужен только тем, у кого нет достаточного образования после бакалавратуры. Дело не в специализации. Средний бакалавр помимо major еще получает и minor, со всеми вытекающими. А еще курсы по истории и искусству может взять. У него просто может не быть достаточно знаний. У нас, в Брауне, были MSc-шники, у которых CS был лишь minor, и им хотелось переквалификации. Я, как PhD студент, обязан был брать курсы. Это было жутко лишнее, и только занимало время. После МГУ-шной подготовки курсы смотрелись как детский сад. Я не пытаюсь быть элитистом и говорить про «лучшее математическое образование в мире». Математические курсы, которые я брал: комбинаторика, дискретная вероятность, приближенные алгоритмы, были очень загружены. В этом основное отличие от России: нужно много пахать в течение семестра. Но материал воспринимался вторично, и мне казалось, что курсы идут ооочень медленно. Вывод: если вы учились (не зубрили, забивали или ещё что), в приличном Российском ВУЗе с приличной программой, MSc с математическими курсами вам нафиг не сдался.

                                                        Немного воды про курсы. Оставим математику, вернёмся к более техническим вещам. В Российском образовании этого реально не хватает. Имхо, основной аргумент идёт так: мы научили человека мыслить логично, а в практичных вещах он и сам разберётся. Фишка в том, что разобраться во всём объёме сложно. Поэтому взять курс с какой-то выжимкой по предмету может очень помочь. Практики чисто в виде implementation в России точно не хватает. В Штатах, в курсе по СУБДам могут спокойно попросить дополнить движок новыми оптимизациями или новыми методами хранения. В курсе по сетям могут попросить реализовать TCP/IP. В курсе по ОС реализовать куски операционки. В моё время в России этим никто не занимался, что плохо. Потому что это позволяет понять как всё устроено на практике. Программирование было, но мало. Ещё одна фича graduate school, которая мне очень понравилась: собственные проекты. Если брать graduate курс, то часто могут попросить придумать и реализовать небольшой проектик, можно в команде. На статью не хватит, но работать практически научит. Вывод: я бы не сказал, что программа в России прямо сильно страдает, это можно исправить. Но вот практическую составляющую поднимать нужно, она там нулевая. Одно но: деньги. В Штатах на курсе присутствует орава платных TA-ев, которые способны все эти проекты проверять. Одному-двум человекам справиться сложно, особенно профессорам или аспирантам.

                                                        Теперь немного критики. Можно себе представить MSc таким вот гениальным инженером, но на практике это не так. В Штатах развитой капитализм. В первую очередь MSc-шники приносят деньги. В связи с этим никто не будет требовать слишком много из страха потерять народ. Я общался и делал что-то совместное с «мастерами». Уровень часто низкий. Как всегда, всё зависит от человека. Честно говоря, среди бакалавров, имхо, гораздо больше смышлёных ребят. Многие люди воспринимают MSc просто как карьерный move, ради корочки. Профессионал выходит соответствующий. Кстати, где-то comprehensive экзамены есть, где-то нет. В Брауне, например, нет. Достаточно взять какое-то количество курсов из разных дисциплин. Опционально можно ещё сделать какой-нибудь проект и написать тезис. Всё. Имхо, это правильно. Comprehensive exams по принципу знал-сдал-забыл --просто зубрёжка, которая в реальности ничего не проверяет. Зачем сдавать одно и то же по два раза? В любом случае, не стоит забывать, что Штатовские вузы — просто брэнд, со всеми рекламами, рейтингами и прочей фигнёй. Проработка курсов в своём роде тоже грамотный маркетинг. Не стоит думать, что выпускник какого-нибудь Stanford в десять раз круче всех остальных. У него просто корочка красивее. Человеческий фактор важнее ВУЗовского.
                                                        1 hr · Like · 1

                                                        Alexander Kalinin Предложенный выше курс мне понравился. Я не уверен, что всё это легко выполнимо в рамках ВУЗовской программы. Каждый курс будет слишком нагружен. Плюс, теоретику часто не нужны ЯП или ассемблер. Например, если он занимается графами. Хотя я сторонник глубокой специализации (разумеется, с учётом необходимых базовых областей). Для всего остального существует collaboration. Собственно, проще всего — понять что нужно, посмотреть course prerequisites, и составить программу. С остальным можно познакомиться самостоятельно и если потребуется. Имхо, главный скилл хорошего профессионала --умение быстро находить информацию и обучаться. Забывать что-то и не знать чего-то никогда не стыдно.

                                                        Книжки и курсы:
                                                        1) По алгоритмам добавил бы Седжвика. У него есть очень хороший курс по алгоритмам на Java, что делает его доступным. И да, нижние границы для сортировки он выводит Курс на Coursera тоже есть.
                                                        2) По теории вычислений: Arora, Barak «Computational Complexity: A Modern Approach». Хорошо написана, хотя некоторым сложновато. Она поновее заодно.
                                                        3) Книжка про «Approximate algorithms», которую ты приводишь, --про _приближённые_, а не рандомные алгоритмы. Основной Грааль там в том, что бы выполнять polynomial-time approximation (PTAS) с любым уровнем приближения (эпсилон), если возможно. Многие из приближённых алгоритмов не рандомны, для многих существует де-рандомизация. Плюс, многие рандомные алгоритмы не являются приближёнными. Книжку читал ещё до того, как вышла
                                                        4) Про ЯП и компиляторы. Не вижу архи-большой необходимости спускаться в ассемблер для всех, если честно. Особенностей много, в зависимости от архитектуры. Если ты берёшь только ANTLR или JavaCC, ты теряешь LALR-грамматики. Это упущение. Вообще, C/C++ не страшный. Более того, в большинстве нормальных мест его очень активно используют. На Bison написать грамматику можно не медленнее чем на Java-свистульках. Вообще, как можно больше стоит учить про параллельное программирование и соответствующие алгоритмы.
                                                        5) В архитектуре я не вижу смысла проектировать CPU в обязательном порядке. А вот узнать про особенности архитектур стоит. Разница между ARM и x86-64, например, значительная. Например, с точки зрения orderings. Не зная этого, не будешь хорошо программировать параллельно. Там же и узнаешь про кэши и их когерентность, что для multi-core становится всё важнее.
                                                        6) В AI вообще ничего не вижу про Constraint Programming. А тема, замечу, важная. И да, 8 (и не только 8) ферзей нормальный солвер по местам расставит Туда же, в принципе, входят LP и MIP, так что это относится к оптимизации, которую ты упомянул.

                                                        Извиняюсь за каламбур Что-то, наверное, пропустил. Я считаю, что в MSc «топовых ВУЗов» заложено слишком много веры, и не стоит их считать за золотой стандарт. Самостоятельно или в ВУЗе практике всё равно не обучишься, хотя базовые знания помогут более-менее разбираться в теме. По мне, так когда начинаешь заниматься чем-то реальным, знания приходят очень быстро и более естественно.
                                                          0
                                                          так практика (ее отсутствие) в вузах России именно с деньгами и связана. Нет денег на оплату руководителей (исполнителей) этой практики — нет и практики :(
                                                            +3
                                                            Мнение программиста, закончевшего MIT:

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

                                                            Из того что заметил:
                                                            — у нас первый курс по теме был достаточно тероетический, проводился на scheme и по этой книжке: en.wikipedia.org/wiki/Structure_and_Interpretation_of_Computer_Programs
                                                            Выбор scheme был интересен т.к. этому языку мало где учат (что позволяет уравновесить возможности разных студентов) но при этом на нем можно написать очень глубокие вещи — символическую манипуляцию, и тд. Одна из задачек заключалась в том чтобы написать интерпретатор scheme на scheme. Так же scheme использовался для курса по искусственному интеллекту.

                                                            Ну эт было давно — в недавнее время со scheme перешли на python и старички начали жаловаться что мол «падает у нас качество и мало мы издеваемся над юнцами».

                                                            По алгоритмам вот этот курс очень понравился — он на undergrad уровне но там есть и про b-tree и про randomization чуток:
                                                            stellar.mit.edu/S/course/6/sp14/6.046/materials.html

                                                            Еще понравился курс computer language engineering: ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-035-computer-language-engineering-spring-2010/lecture-notes/
                                                            Тут цель — написать свой собственный компилятор — с оптимизацией и переводом на ассемблер. И это включает в себя обучение ассемблера. И сразу появляется резон выучить эту нечисть.

                                                            Вот еще интересный рисунок — как картину обучения видит MIT
                                                            www.eecs.mit.edu/docs/ug/6-3.pdf

                                                            То есть в принципе — меньше внимания уделяется конкретным языкам (C++ и SQL вообще не упоминаются) но больше теории и практики на конкретных задачах (напиши интерпретатор, напиши компилятор, хоть и на Java, напиши простенькое ядро и тд)…

                                                            По базам данных у нас курс только elective — а я, не зная что это мне потом пригодится, так его и не взял. Зато брал криптографию. Вот эт тоже было интересно! Чуть не помер.

                                                            Вот так-с… does this help?
                                                              0
                                                              Диалог с американским профессором:

                                                              Professor: Teamwork is essential. The choice of programming languages is also curious. Why Scala?
                                                              1d ago

                                                              Pavel Velikhov Yeah, thanks, I forgot about teamwork, a lot of projects in: compilers, operating systems, databases, definitely teams of two. Scala: its really nice to have both a low-level language and a high-level language. You can build pretty-much systems code...more
                                                              1d ago
                                                              Pavel Velikhov
                                                              Pavel Velikhov I did though listen to a lecture about Scala's collections and map operator, which is in a complete state of mess, but I hope they will fix it soon.
                                                              1d ago

                                                              Professor: Agreed. I would also add a course on software testing and just as you had mentioned a formal methods, which is missing from your synopsis. For example, I would add a course on theorem proving (automated or interactive) and/or model checking and/or using theorem proving or model checking for program analysis. I have experience trying to teach all of these, will email you if interested. For a functional language, I would go with either Lisp (as it is classic) or Haskell (as I am in Scotland). I would not chose Scala, since despite the idea being good, there are quite a few things to fix.
                                                              1d ago

                                                              I put theorem proving into AI and Database Theory, so from my experience there would be no need for such class — expect a couple seminars on applying the techniques to the specific problem. I like Haskell as a language and I'm aware of some serious flaws in Scala (I was very optimistic about it when they started). But it gives all Java libraries and frameworks and its much much easier to get a job with Scala skills.
                                                                0
                                                                Просто оставлю этот документик здесь — Рекомендации по преподаванию программной инженерии и информатики в университетах. Это перевод рекомендаций ACM и IEEE CS. Может, пригодится кому-то.
                                                                  +1
                                                                  ДА, но очень сухой и not much fun
                                                                  0
                                                                  Павел, спасибо за интересную информацию.
                                                                  Попробовал сделать примерное сравнение с курсами по специальности 22-01 «Вычислительные системы, комплексы и сети», совпадение процентов на 80.
                                                                  Обучение студентов: американские университеты в сравнении с советским вузом
                                                                    0
                                                                    P.S. Обнаружил эту дискуссию четырехлетней давности, где какие-то КТН учили меня ZFC, приводя в пример американских профессоров, которые все лучше знают.

                                                                    Я как-то не отметил тогда тот факт, что я как раз американский профессор.
                                                                    ZFC я тоже преподаю моим студентам, если чо. И теорию моделей. Но собравшиеся полуобразованцы, включая этого срезавшего Глеба, путающего Бунина с Шукшиным, видимо, пока им credentials не предъявишь, будут продолжать нести свою фигню. Ну вперед. Вы ж не мои студенты, не переучивать же вас.

                                                                    Only users with full accounts can post comments. Log in, please.