Промышленное программирование на языке Java — различия между версиями
Lotrek (обсуждение | вклад) |
Lotrek (обсуждение | вклад) |
||
(не показано 20 промежуточных версии 3 участников) | |||
Строка 11: | Строка 11: | ||
Лекции по вторникам, 09:00 - 10:20 | Лекции по вторникам, 09:00 - 10:20 | ||
− | Семинары | + | Семинары 3-ий курс: вторники 10:30 - 11:50 |
− | Семинары | + | Семинары 4-ый курс понедельники 10:30 - 11:50 |
== Лекции == | == Лекции == | ||
− | + | Лекции лежат на [https://yadi.sk/d/pnm_X0KmiFfsVA Яндекс.Диске] | |
− | + | Список тем: | |
− | + | * Управляющие конструкции, типы данных, преобразование типов | |
+ | * Объекты классы и интерфейсы, утилитные классы, пакеты, фабричный метод | ||
+ | * Строки | ||
+ | * Исключения | ||
+ | * Дженерики | ||
+ | * Коллекции | ||
+ | * Varargs, try-finally | ||
+ | * Работа с датой и временем | ||
+ | * Элементы функционального программирования | ||
+ | * Стримы | ||
+ | * Потоковый ввод и вывод | ||
+ | * Многопоточность | ||
+ | |||
+ | * Аннотации. Рефлекшн. Байткод | ||
+ | * Java и базы данных. JDBC | ||
+ | * JPA, Hibernate, JOOQ | ||
+ | * Java и Web | ||
+ | * IOC, DI, Spring | ||
+ | * Паттерны проектирования | ||
+ | * GC, CI/CD | ||
+ | |||
+ | == Домашнее задание == | ||
Планируется 2 ДЗ в 3ем модуле и 2 ДЗ в 4ом. | Планируется 2 ДЗ в 3ем модуле и 2 ДЗ в 4ом. | ||
+ | |||
+ | [https://docs.google.com/spreadsheets/d/1dLmscZdQaAluX77yU1IRt744yHbqH7e301JZxfNxEHw/edit#gid=596552630 Статусы проверки] | ||
+ | === Задание 1: Disk Analyzer === | ||
+ | * Консольное приложение | ||
+ | * Принимает на вход папку | ||
+ | * Выводит непосредственное (только на первом уровне вложенности в переданную папку) содержимое папки в консоль в виде таблицы: | ||
+ | # Номер | ||
+ | # Название папки | ||
+ | # Размер папки с содержимым | ||
+ | # Процент от общего размера | ||
+ | # Количество вложенных элементов | ||
+ | * Отдельно рисует таблицу — топ самых больших файлов с полным путем | ||
+ | * Выводит время работы | ||
+ | * Симлинки не нужно учитывать и не надо выводить | ||
+ | |||
+ | Срок сдачи: 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го модуля). | ||
+ | * большое количество багов в задании | ||
+ | |||
+ | Преподаватель может требовать выполнения тех или иных дополнительных условий, не обозначенных в условии задачи. | ||
== Правила выставления оценок == | == Правила выставления оценок == | ||
Строка 27: | Строка 123: | ||
В курсе предусмотрено две формы контроля знания: | В курсе предусмотрено две формы контроля знания: | ||
* Домашние работы | * Домашние работы | ||
− | * | + | * Устный экзамен |
Итоговая оценка вычисляется по формуле: | Итоговая оценка вычисляется по формуле: | ||
Строка 49: | Строка 145: | ||
== Полезные ссылки == | == Полезные ссылки == | ||
https://compscicenter.ru/courses/java/nsk/2017-autumn/ | https://compscicenter.ru/courses/java/nsk/2017-autumn/ | ||
+ | |||
+ | https://github.com/c-tash/HSE-CS-Java2020-Tasks |
Текущая версия на 19:24, 2 июня 2020
Содержание
О курсе
Курс читается для студентов 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
- Консольное приложение
- Принимает на вход папку
- Выводит непосредственное (только на первом уровне вложенности в переданную папку) содержимое папки в консоль в виде таблицы:
- Номер
- Название папки
- Размер папки с содержимым
- Процент от общего размера
- Количество вложенных элементов
- Отдельно рисует таблицу — топ самых больших файлов с полным путем
- Выводит время работы
- Симлинки не нужно учитывать и не надо выводить
Срок сдачи: 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