Промышленное программирование на языке Java

Материал из Wiki - Факультет компьютерных наук
Перейти к: навигация, поиск

О курсе

Курс читается для студентов 3-го и 4-го курса ПМИ ФКН ВШЭ в 3-4 модулях.


Лектор: Лепешкин Игорь

Семинаристы: Косолапов Кирилл, Буланов Артем

Расписание: Лекции по вторникам, 09:00 - 10:20

Семинары 3-ий курс: вторники 10:30 - 11:50

Семинары 4-ый курс понедельники 10:30 - 11:50

Лекции

Лекции лежат на Яндекс.Диске

Список тем:

  • Управляющие конструкции, типы данных, преобразование типов
  • Объекты классы и интерфейсы, утилитные классы, пакеты, фабричный метод
  • Строки
  • Исключения
  • Дженерики
  • Коллекции
  • Varargs, try-finally
  • Работа с датой и временем
  • Элементы функционального программирования
  • Стримы
  • Потоковый ввод и вывод
  • Многопоточность


  • Аннотации. Рефлекшн. Байткод
  • Java и базы данных. JDBC
  • JPA, Hibernate, JOOQ
  • Java и Web
  • IOC, DI, Spring
  • Паттерны проектирования
  • GC, CI/CD

Домашнее задание

Планируется 2 ДЗ в 3ем модуле и 2 ДЗ в 4ом.

Статусы проверки

Задание 1: Disk Analyzer

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

Срок сдачи: 3.03.2020

Домашнее задание 2: Кеш

  • В итоге мы должны получить интерфейс и его имплементацию, которые уже затем использовать в любом приложении
  • Кеш из long в String (из-за десериализации, но можно писать и обобщенно)
  • Поддерживает минимум две Eviction Policy (LRU + LFU)
  • Может хранить данные на диске
  • При создании указывается размер кеша в памяти, предельный размер на диске, папка, в которой кеш хранится и Eviction Policy: public CacheImpl(long memorySize, long diskSize, String path, EvictionPolicy policy)
  • Нельзя создавать по файлу на каждую запись
  • memorySize < diskSize
  • Если данные есть в памяти, читаем из памяти, если нет, то с диска
  • Скорость из памяти O(L), где L - длина строки, скорость чтения с диска тоже, за исключением моментов компактизации диска
  • Компактизация диска не должна происходить на каждую запись, способ компактизации не принципиален.
  • При работе с диском все ключи можно держать в памяти (но не все значения)
  • Кеш not thread-safe.
  • Можно восстановить с диска
  • В интерфейсе только get и put (возвращает старое значение)
  • Подсчет размера кеша в памяти можно делать приближенно (но учитывать количество записей + длину значений)

Срок сдачи: 24.03.2020

Домашнее задание 3: Телеграм бот для работы с Яндекс.Трекером

Функциональные требования:

  • любой пользователь любой организации в трекере может авторизоваться через бота
  • пользователь может создать задачу в любой очереди, поля для заполнения: название, описание, назначить на меня или нет (добавить себя в поле "исполнитель")
  • пользователь может посмотреть список задач, назначенные на него, отсортированные по убыванию по дате обновления с паджинацией
  • пользователь может посмотреть задачу по ключу и из списка найденных, при просмотре доступны: описание, название, автор, исполнитель, наблюдатели + комментарии

Нефункциональные требования:

  • клиент трекера, клиент Телеграма, работа с базой, должны быть изолированы от остального кода (отдельные классы, библиотеки или модули)
  • тесты
  • использование OAuth
  • использование БД для хранения необходимых данных

Срок сдачи: 26.05.2020

Домашнее задание 4: ДЗ 3 + комментирование и подписки

  • Пользователь может прокомментировать задачу
  • Можно подписаться на задачу и получать в боте уведомления по изменениям в ней (используя механизм триггеров и вебхуков)

Срок сдачи: до экзамена

Правила сдачи ДЗ:

  • Для запуска сборки, проверок стиля и юнит-тестов используем gradle. Если оно не собирается через грэйдл, оно не собирается.
  • Сдачу задач ведем в отдельных приватных клонах репозитория на github.
  • Все задачи располагаем в одном репозитории. В корне репозитория находится необходимая обвязка для сборки и запуска, и, по отдельной директории-модулю на каждую задачу (task-XX-taskname).
  • Код реализации задач располагаем в пакете ru.hse.cs.java2020.<github-login>.task-XX
  • Задание считается принятым, если вы отправили PR, получили ок у преподавателя по PR и затем защитили очно у преподавателя задание
  • Преподаватель может пропустить часть очной защиты по своему усмотрению
  • до дедлайна надо успеть не только отправить PR, но и пройти защиту ДЗ

За что снимаются баллы:

  • опоздание при сдаче задания
  • сдача задания, в котором не проходят checkstyle/tests
  • плохая структура кода (слишком большие классы, неочевидные зависимости, отсутствие валидаций входных параметров, непонятный нейминг и т.п.)
  • отсутствие тестов на базовые сценарии, низкое покрытие тестов (для заданий 4го модуля).
  • большое количество багов в задании

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

Правила выставления оценок

В курсе предусмотрено две формы контроля знания:

  • Домашние работы
  • Устный экзамен

Итоговая оценка вычисляется по формуле:

Итог 3го курса = Округление(0.15 * ДЗ1 + 0.15 * ДЗ2 + 0.15 * ДЗ3 +0.15 * ДЗ4 + 0.4 * Э)

Итог 4го курса = Округление(0.3 * ДЗ1 + 0.3 * ДЗ2 + 0.4 * Э)

ДЗ1 - ДЗ4 — оценки за домашние задания

Э — оценка за экзамен

Округление арифметическое.

Необходимый инвентарь

Ноутбук с установленными: JDK 11 IntelliJ IDEA Git

Полезные ссылки

https://compscicenter.ru/courses/java/nsk/2017-autumn/

https://github.com/c-tash/HSE-CS-Java2020-Tasks