palkan_tula
palkan
26
uri = URI("http: //example.com/index.json")
params = {limit: 10, page: 3}
uri.query = URI.encode_ www_form(params)
req = Net ::HTTP ::Get.new uri
req.basic_auth 'user', 'pass'
res = Net ::HTTP.start(uri.host, uri.port) do |http|
http.request(req)
end
if res.is_a?(Net ::HTTPSuccess)
JSON.parse(res.body)
end
palkan_tula
palkan
Разумная конфигурация
34
Значения, которые подходят большинству
пользователей
Автоматическое «распознавание»
популярных переменных окружения
(DATABASE_URL, REDIS_URL)
Slide 35
Slide 35 text
palkan_tula
palkan
Разумная конфигурация
35
Slide 36
Slide 36 text
palkan_tula
palkan
36
SomeSDK.configure do |config|
config.access_key = "REPLACE_WITH_ACCESS_KEY_ID"
config.secret_key = "REPLACE_WITH_SECRET_ACCESS_KEY"
end
Разумная конфигурация
В документации каждой второй библиотеки для интеграции с API
palkan_tula
palkan
Минимум wtf
48
Консистентность API и стиля кода
Slide 49
Slide 49 text
palkan_tula
palkan
Стандартный стиль
49
StandardJS
StandardRB
PEP8
go fmt
Slide 50
Slide 50 text
palkan_tula
palkan
Минимум wtf
50
Консистентность API и стиля кода
Узнаваемость/похожесть/подражание
Отсутствующие/осмысленные monkey patches
Однозначные именования
Slide 51
Slide 51 text
palkan_tula
palkan
Удивительные названия
51
Slide 52
Slide 52 text
palkan_tula
palkan
Синтаксический
уксус
Как не дать выстрелить
себе в ногу
Slide 53
Slide 53 text
palkan_tula
palkan
Синтаксический уксус
53
Заставляет разработчика задуматься о том,
что он делает
Намекает на потенциальную опасность
операции
Slide 54
Slide 54 text
palkan_tula
palkan
54
class SomeTest < Minitest ::Test
i_suck_and_my_tests_are_order_dependent!
end
palkan_tula
palkan
Отладь меня,
если сможешь
Код, помогающий исправлять
ошибки
Slide 57
Slide 57 text
palkan_tula
palkan
Отладка обычного человека
57
Slide 58
Slide 58 text
palkan_tula
palkan
Коды ошибок для машин,
сообщения — для людей
58
Slide 59
Slide 59 text
palkan_tula
palkan
Сообщения об ошибках
59
Содержательные: содержат максимум
контекста для быстрой локализации
проблемы
Призывающие к действию: содержат
инструкции для устранения проблемы
Slide 60
Slide 60 text
palkan_tula
palkan
Содержательные ошибки
60
# плохо
create_event(type: "BBQ")
=> Unknown type.
# хорошо
create_event(type: "BBQ")
=> Unknown type: BBQ.
Slide 61
Slide 61 text
palkan_tula
palkan
Ошибки с подсказками
61
# плохо
create_event(type: "BBQ")
=> Unknown type.
# хорошо
create_event(type: "BBQ")
=> Unknown type: BBQ.
# отлично
create_event(type: "BBQ")
=> Unknown type: BBQ. Choose: quarantine or self-
isolation"
Slide 62
Slide 62 text
palkan_tula
palkan
https://twitter.com/o0ignition0o/status/1223003607966060544
62
Ошибки с подсказками
Slide 63
Slide 63 text
palkan_tula
palkan
63
https://github.com/jules2689/extended_bundler-errors
Ошибки с подсказками
Slide 64
Slide 64 text
palkan_tula
palkan
Human errors
64
Slide 65
Slide 65 text
palkan_tula
palkan
Логирование
65
Должно помогать, а не мешать
Должно быть настраиваемым (уровни,
формат, устройство вывода)
palkan_tula
palkan
Логирование
67
Должно помогать, а не мешать
Должно быть настраиваемым (уровни,
формат, устройство вывода)
Должно иметь разумные настройки по
умолчанию
Slide 68
Slide 68 text
palkan_tula
palkan
[36mCOLOR=true[0m
68
Slide 69
Slide 69 text
palkan_tula
palkan
Тестируемость
2 unit tests. 0 integration tests.
Вы же пишете тесты, не так ли?
Slide 70
Slide 70 text
palkan_tula
palkan
Удобно ли тестировать код, который
использует ваш код, или код, который
использует код, которой использует
ваш код, или код, который использует
код, который использует код,
которой использует ваш код...
70
palkan_tula
palkan
Тестируемость
73
Тестовый режим/бекенд/адаптер
Инструменты для тестирования
Slide 74
Slide 74 text
palkan_tula
palkan
Тестируемость
74
Тестовый режим/бекенд/адаптер
Инструменты для тестирования
Забота о скорости выполнения тестов
Slide 75
Slide 75 text
palkan_tula
palkan
75
CarrierWave.configure do |config|
config.enable_processing = false
end
Devise.setup do |config|
config.stretches = Rails.env.test? ? 1 : 11
end
Тестируемость
Slide 76
Slide 76 text
palkan_tula
palkan
От частного
к общему
Принципы гибкой архитектуры
Slide 77
Slide 77 text
palkan_tula
palkan
Гибкая архитектура
77
Взаимозаменяемость (adapter pattern, DI)
Расширяемость (plugins, middlewares)
В следующей серии
Slide 78
Slide 78 text
palkan_tula
palkan
Заметки
Про вашего мальчика код
Slide 79
Slide 79 text
palkan_tula
palkan
–Joe Armstrong
“A program is only as good as its
documentation.”
79
Slide 80
Slide 80 text
palkan_tula
palkan
Документация (в широком смысле)
— это всё то, что в будущем за вас
ответит на вопросы разработчиков
80
Slide 81
Slide 81 text
palkan_tula
palkan
Документация
81
Непосредственно документы (специально
написанные)
Комментарии в коде
Сообщения коммитов / описания PR
История изменений (change log)
Примеры / демо / тесты
Slide 82
Slide 82 text
palkan_tula
palkan
Лучше никакой документации,
чем устаревшая
82
Slide 83
Slide 83 text
palkan_tula
palkan
Чек-лист
83
Минимум шаблонного кода
Разумные значения по умолчанию
Интуитивно понятный API
Содержательные сообщения об ошибках
Slide 84
Slide 84 text
palkan_tula
palkan
Чек-лист
84
Гибкое и настраиваемое логирование
Тестируемость
Расширяемость и взаимозаменяемость
Полезная документация
Slide 85
Slide 85 text
palkan_tula
palkan
85
gemcheck.evilmartians.io
Slide 86
Slide 86 text
palkan_tula
palkan
Writing code for people
slideshare.net/iAdramelk/writing-code-for-people-228709457
86
Slide 87
Slide 87 text
Спасибо
Владимир Дементьев,
Злые марсиане
Write code for
@evilmartians
evilmartians.com
@palkan
@palkan_tula