ݺߣ

ݺߣShare a Scribd company logo
Ментальное
программирование
обзор
Ментальная модель
Ментальной моделью в психологии называют трудно
формализуемую совокупность эмпирических знаний,
которая формируется в сознании человека при
взаимодействии с объектом. Проще говоря, это то, как
мы представляем себе некий предмет.
Ментальное программирование
Кодирование ментальной модели. Чтение исходного
кода такой программы восстанавливает картину мира с
максимальной точностью.
Философия языка python
● Красивое лучше, чем уродливое.
● Явное лучше, чем неявное.
● Простое лучше, чем сложное.
● Сложное лучше, чем запутанное.
● Плоское лучше, чем вложенное.
● Разреженное лучше, чем плотное.
● Читаемость имеет значение.
● Особые случаи не настолько особые, чтобы нарушать
правила.
● При этом практичность важнее безупречности.
● Должен существовать один — и, желательно, только один —
очевидный способ сделать это.
● Если реализацию сложно объяснить — идея плоха.
● Если реализацию легко объяснить — идея, возможно,
хороша
Литература
Примеры
Запоминаем в сессию user id
session[:user_id] = user.id
Авторизуем пользователя
session[:user_id] = user.id
vs
sign_in(user)
Длинное условие ...
# комментарий без которого сложно понять
_зачем_
if user.company? && user.company.active? &&
user.money > 50
Простая задача
# комментарий без которого сложно понять
_зачем_
if user.company? && user.company.active? &&
user.money > 50
vs
if user.can_edit_company?
Комментарии зло
# этот метод проверяет что ...
validate_dates: (from, to) ->
year_in_milliseconds = 1000 * 60 * 60 * 24 * 365
return !(Math.abs(from.getTime() - to.getTime())
/ year_in_milliseconds >= @MAX
Нет комментария - нет проблем
# этот метод проверяет что ...
validate_dates: (from, to) ->
year_in_milliseconds = 1000 * 60 * 60 * 24 * 365
return !(Math.abs(from.getTime() - to.getTime())
/ year_in_milliseconds >= @MAX
vs
check_years_range: (from, to) ->
...
Создаем бранч
git branch my_super_feature
Создаем фичу
git branch my_super_feature
vs
git feature start implement_api
Gitflow extentions
Набор скриптов к git, реализующий модель
gitflow на ментальном уровне.
● git flow feature start implement_api
● git flow feature finish implement_api
● git flow release start
● git flow hotfix finish
Не забываем про "закон дырявых абстракций"
Слова ложатся на действия
(работа с git, написание кода и
т.д.) максимально точно
Подходы
domain driven design
● Моделирование предметной области
● Единый язык
Понятия:
● Entity
● Value Object
● Service
● Repository
● Aggregate
DSL
state_machine initial: :new do
state :new
state :done
state :rejected
after_transition :new => :done,
do: :update_related_telecast
event :perform do
transition :new => :done
end
event :reject do
transition :new => :rejected
end
end
Метод по агрегату
if user.company? && user.company.active? &&
user.money > 50
if user.can_edit_company?
Программистам от
программистов
представления о коде
Антипаттерны
Нарушение контракта
# до
u = User.first
u.destroy # стандартное поведение,
удаляет из базы
# после
u = User.first
u.destroy # переопределенное
поведение, помечает как удаленное
Паттерны и принципы
Принципы
● DRY
● KISS
● YAGNI
Принципы
● GRASP
● SOLID
● CQS
● Law of Demeter
● Single Level of Abstraction Principle
Command-query separation
Принцип сформулирован Бертраном Мейером, как одно
из основных правил разрабатываемого им языка
программирования Eiffel. Самая короткая
формулировка:
Задавая вопрос, не изменяй ответ.
Практики
● Первый раз - лучший
Практики
● Первый раз - лучший
● Разбитое окно
Практики
● Первый раз - лучший
● Разбитое окно
● Черные и белые списки
Практики
● Первый раз - лучший
● Разбитое окно
● Черные и белые списки
● безопасность по умолчанию
Практики
● Первый раз - лучший
● Разбитое окно
● Черные и белые списки
● безопасность по умолчанию
● api
Получай и используй отдельно
sign_in(create(:user))
assert_equal name, User.find(id).name
Company.find(params[:id]).destroy
Сложность выбора
Мы не будем использовать мощную
библиотеку X, ради пары методов. Внедрим
ее по необходимости.
Сложность выбора
"Еще рано" превращается в "слишком поздно"
Выделяем при дублировании
● сильное влияние человеческого фактора
● продублирует кто-то другой
● нет тестов, страшно менять
XP
● весь код написан так, словно его писал
один высококвалифицированный
разработчик
● парное программирование
● TDD
Вопросы?
@mokevnin
mokevnin@gmail.com

More Related Content

Кирилл Мокевнин — Ментальное программирование