Information
- Rating
- Does not participate
- Location
- Москва, Москва и Московская обл., Россия
- Date of birth
- Registered
- Activity
Specialization
Backend Developer, Руководитель отдела разработки
Lead
From 450,000 ₽
C#
.NET
Software development
Database
High-loaded systems
Designing application architecture
Creating project architecture
Design information systems
Monitoring
Проект
— Система 1
… — Модуль 11
… — Модуль 12
…… — Решение задачи XXX
…… — Интерфейс
……… — Реализация
……… — Логгирования
…… — Решение задачи YYY
……… — Подготовка данных для исследования
……… — Разработка структуры
и т.д. и т.п.
Если в одном трекере будет это всё валяться сплошняком, будет ад. Теги, связи — конечно хороши, но они не дают надёжную чёткую структуру что из чего состоит, потому что иерархия задач подразумевает: какая работа частью какой работы является. Она может зависеть от других задач, быть с ними связана, укладываться на диаграму, быть триггером для старта/завершении цикла, но она всегда является частью чего-то большего.
В любом случае иерархия есть, как минимум в разрезе Проект — Задачи. По сути проект это и есть одна большая задача. Хотя мне не нравится, когда некоторые разработчики выбирают подход «Всё есть задача». Тоже фейл но в обратном направлении.
Хороший пример с файловой системой. Папки и подпапки — это чрезвычайно удобно. Доказано временем. Хотя это не единственный способ для организации данных.
Просто дайте людям возможность создавать подзадачи. Если они хотят плоский список, пусть не создают подзадач. Какая проблема? Я и правда видел на своём веку людей, которые все свои файлы хранили в одной единственной папке: музыку, документы, картинки и т.д. Но все люди разные, и всё сильно зависит в команде от того, как работает менеджер. Вы его работать по-своему не заставите. Просто дайте инструмент. И сделайте его простым, понятным и очевидным.
Не надо за людей решать: вам не нужны подзадачи (потому что мы не знаем как сделать работу с ними удобной).
С другой стороны, простейший ведроид за три копья легко справится с задачей. Не надо ничего выдумывать, считайте что у большинства людей аппарат всегда есть под рукой, осталось поставить туда соответствующий софт. Переписывать карандашиком на бумажку какие-то неудобочитаемые коды в наше время — натуральное издевательство. И бумагу портитить почём зря. Всё правильно там написано. Оправдания админской лени разобраться и найти приемлемое недорогое решение — не принимаются!
Теория автора разбивается о банальный пример. День Рождения. Давайте создадим такой тип, ибо вполне уместно. День Рождения не должен быть ранее, допустим 100 лет от текущей даты и позже текущей даты. И День Рождения не может быть пустым, ибо не бывает таких людей, у которых нет Дня Рождения. Посему должен быть обязательный конструктор в который надо передать Дату, и если что-то с ней не так, выплюнуть исключение. И всё вроде хорошо, и ладушки. Но вот проходит 10 лет со дня выпуска программы. Программа загружает из базы данных Людей их Дни Рождения. 10 лет назад в базу данных была добавлена Старушка, которой было 99 лет. И вот сегодня, программа падает с исключением, так как не бывает таки Дней Рождения, которые датируются ранее 100 годов. Что делать? Завести второй конструктор? Один для актуальных ДР (от сегодняшнего дня), другой для загружаемых? Или проще. Пусть будет один конструктор, в который будет запихиваться ДР и ещё одна дата отсчёта? Класс. И так с каждым доменным типом. Видимое удобство влечёт кучу неочевидных побочных эффектов.
Но и это ещё не все.
Вместо того, чтобы пользоваться атрибутами и прочими «расширяющими дыру» инструментами, будем творить домен на каждый чих. Лично я в таком аду сразу откажусь что-то делать. Надо добавить День Рождения? Таааа-аа-ак, как же он там называется? BirthDay? BirthDate? DateOfBirth?..
Всё должно быть в меру с умом. Нельзя вот так взять и сказать «Атрибуты — зло». Очевидно, что автор этих слов бездумный фанатик, не написавший в своей жизни ни строчки кода для продакшена. Одни только разговоры разговаривать. И сливать этот поток бреда на чьи-нибудь уши на каких-нибудь конфах.
Атрибут [Required] — явное указание, что значение должно быть определено. Для значимых типов, таких как int, атрибут не требуется, так как существует определённая разница между int и int?, которую можно распознать без всяких атрибутов. Для String, который может принимать значение null без подобного атрибута не обойтись. Автор похоже в жизни не писал программного кода, иначе бы не плёл такой бред.
Ну и работать как с чистой датой (пикер даты), так и со временем (пикер даты + время).