Slide 1

Slide 1 text

Код, с которым приятно иметь дело Владимир Дементьев (Злые марсиане)

Slide 2

Slide 2 text

palkan_tula palkan Кот, с которым приятно иметь дело Что это? Д Если код хорош — то всегда легко, а когда наоборот — трудно

Slide 3

Slide 3 text

palkan_tula palkan Чек-лист для авторов и пользователей Код, с которым приятно иметь дело Yet Another Framework

Slide 4

Slide 4 text

palkan_tula palkan А судьи кто? Или обо мне

Slide 5

Slide 5 text

palkan_tula palkan github.com/palkan 5

Slide 6

Slide 6 text

palkan_tula palkan evilmartians.com 6

Slide 7

Slide 7 text

palkan_tula palkan evilmartians.com 7

Slide 8

Slide 8 text

palkan_tula palkan evilmartians.com 8 Ruby Next Transpiler for Ruby

Slide 9

Slide 9 text

palkan_tula palkan evl.ms/blog 9

Slide 10

Slide 10 text

palkan_tula palkan github.com/palkan 10

Slide 11

Slide 11 text

palkan_tula palkan Ruby Hero ...По-русски

Slide 12

Slide 12 text

palkan_tula palkan –Matz “Ruby is designed to make programmers happy.” 12

Slide 13

Slide 13 text

palkan_tula palkan “The more expressive language the much easier is to write terrible code” –Noah Gibbs 13

Slide 14

Slide 14 text

palkan_tula palkan Код, с которым приятно иметь дело

Slide 15

Slide 15 text

palkan_tula palkan «Иметь дело» 15 Читать Писать и изменять Отлаживать Делиться

Slide 16

Slide 16 text

palkan_tula palkan Читать Писать и изменять Отлаживать Делиться «Иметь дело» 16 Приятно

Slide 17

Slide 17 text

palkan_tula palkan Пишите код для других, а не для себя 17

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

palkan_tula palkan Пишем код для людей

Slide 20

Slide 20 text

palkan_tula palkan Простой код

Slide 21

Slide 21 text

palkan_tula palkan Простой код 21 Минимум кода для простого функционала Меньше думать при написании Легко понимать написанное

Slide 22

Slide 22 text

palkan_tula palkan –Alan Kay “Simple things should be simple, complex things should be possible.” 22

Slide 23

Slide 23 text

palkan_tula palkan Boilerplate Враг №1

Slide 24

Slide 24 text

palkan_tula palkan 24 var req = new XMLHttpRequest(); req.responseType = 'json'; req.onload = function() { handle(xhr.response) }; req.open('GET', '/api/me.json', true); req.send(null);

Slide 25

Slide 25 text

palkan_tula palkan 25 fetch('/api/me.json') .then(response => response.json() .then(handle);

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

palkan_tula palkan 27 HTTParty.get( "http: //example.com/index.json", {limit: 10, page: 3}, basic_auth: {username: "user", password: "pass"} )

Slide 28

Slide 28 text

palkan_tula palkan 28 Лаконичный API поверх низкоуровневого

Slide 29

Slide 29 text

palkan_tula palkan Boilerplate 29 «Легковесный» API Разумные значения по умолчанию

Slide 30

Slide 30 text

palkan_tula palkan Больше разумных значений по умолчанию 㱺 Меньше действий пользователя 㱺 Меньше шансов на ошибку 30

Slide 31

Slide 31 text

palkan_tula palkan Значения по умолчанию 31 Аргументы методов/функций Параметры конфигурации

Slide 32

Slide 32 text

palkan_tula palkan Разумная конфигурация 32 Значения, которые подходят большинству пользователей

Slide 33

Slide 33 text

palkan_tula palkan Hanami 1.0 → 2.0 slidr.io/jodosha/parisrb-2020-keynote 33

Slide 34

Slide 34 text

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

Slide 37

Slide 37 text

palkan_tula palkan 37 SOME_SDK_ACCESS_KEY_ID=123 SOME_SDK_SECRET_ACCESS_KEY=secret # or some_sdk.yml access_key_id: 123 secret_access_key: secret Zero-code конфигурация

Slide 38

Slide 38 text

palkan_tula palkan Zero-code конфигурация 38 Ruby: anyway_config Go: viper

Slide 39

Slide 39 text

palkan_tula palkan Anyway Config evilmartians.com/chronicles/anyway-config-keep-your-ruby-configuration-sane 39

Slide 40

Slide 40 text

palkan_tula palkan 40 Аргументы методов/функций Параметры конфигурации Соглашения об именовании (Convention over configuration) Значения по умолчанию

Slide 41

Slide 41 text

palkan_tula palkan Разумные соглашения 41 class Post < ActiveRecord ::Base belongs_to :user end Post.joins(:user).all # => SELECT * FROM posts INNER JOIN users ...

Slide 42

Slide 42 text

palkan_tula palkan 42 class Post < ActiveRecord ::Base self.table_name = "posts" belongs_to :user, foreign_key: :user_id, class_name: "User", primary_key: :id end Разумные соглашения

Slide 43

Slide 43 text

palkan_tula palkan Простой код 43 Минимум кода для простого функционала Меньше думать при написании Легко понимать написанное

Slide 44

Slide 44 text

palkan_tula palkan Принцип наименьшего удивления

Slide 45

Slide 45 text

palkan_tula palkan Wat, Ruby?! 45 1.nonzero? # => 1 0.nonzero? # => nil 0.zero? # => true 1.zero? # => false

Slide 46

Slide 46 text

palkan_tula palkan Wat, JS?! medium.com/@winwardo/the-principle-of-least-astonishment-and-javascripts-sort-e98a734a30c9 46

Slide 47

Slide 47 text

palkan_tula palkan Erlang :( 47 1> lists:split(2, [2, 0, 2, 0]). {[2,0],[2,0]} 2> lists:sublist(2, [2, 0, 2, 0]). ** exception error: no function clause matching 3> lists:sublist([2, 0, 2, 0], 2). [2, 0]

Slide 48

Slide 48 text

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

Slide 55

Slide 55 text

palkan_tula palkan 55 unsafe fn dangerous() {} unsafe { dangerous(); }

Slide 56

Slide 56 text

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 Должно помогать, а не мешать Должно быть настраиваемым (уровни, формат, устройство вывода)

Slide 66

Slide 66 text

palkan_tula palkan Идеальный логгер 66 MyLibrary.logger = Logger.new

Slide 67

Slide 67 text

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

Slide 71

Slide 71 text

palkan_tula palkan Тестируемость 71 Тестовый режим/бекенд/адаптер

Slide 72

Slide 72 text

palkan_tula palkan 72 # Тестовые адаптеры config.active_job.queue_adapter = :test config.action_mailer.delivery_method = :test # Мок-режим Fog.mock! # No-op режим Sidekiq ::Testing.fake! Тестируемость

Slide 73

Slide 73 text

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