Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Нейрофизиология сложности кода

Нейрофизиология сложности кода

Григорий Петров (Devrel в Evrone) @ Moscow Python №78

"В этом докладе я хочу продемонстрировать вам детали: как именно выглядит сложность в нейронах наших мозгов. Нас ждет огромное дерево когнитома, облака когов с оптическим зумом, зрительная кора, бесчеловечные эксперименты с воображением. И код. Много кода. Простого кода, сложного кода и непонятного кода, который с одной стороны простой, с другой сложный, а с третьей стороны вообще пересечение параллельных линий в форме котика".

Видео: https://moscowpython.ru/meetup/78/code-complexity-neurophysiology/

MoscowPython: http://moscowpython.ru
Курсы Learn Python: http://learn.python.ru
Moscow Python Podcast: http://podcast.python.ru

Moscow Python Meetup

July 14, 2022
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. @grigoryvp Григорий Петров http://bit.ly/ccomnf Давайте использовать социальные сети: [email protected] t.me/grigoryvp

    fb.com/grigoryvp vk.com/grigoryvp github.com/grigoryvp twitter.com/grigoryvp instagram.com/grigoryvp Соцсети Имя 2
  2. @grigoryvp Григорий Петров http://bit.ly/ccomnf Что сейчас будет? 3 { speaker_name:

    "Григорий Петров", skill_list: ["Python", "Ruby", "JS", "Go", "Rust", "Cpp"], job_begin: 1998, job_title: "DevRel", talk_minutes: 30, questions_at: TALK_END, }
  3. @grigoryvp Григорий Петров http://bit.ly/ccomnf Как мы осознаем окружающий мир 6

    • комната • телевизор • окно • стеллаж • цветок
  4. @grigoryvp Григорий Петров http://bit.ly/ccomnf Как мы осознаем окружающий мир 8

    • стеллаж • цветок • ковер • пиала • книги
  5. @grigoryvp Григорий Петров http://bit.ly/ccomnf Как мы осознаем окружающий мир 10

    • белый фарфор • форма пиалы • отражение • горизонтальная доска • вертикальная доска
  6. @grigoryvp Григорий Петров http://bit.ly/ccomnf Код мы осознаем также def reset_loaders():

    for backend in engines.all(): if not backend.is_template(): continue for loader in backend.loaders: loader.reset() 14
  7. @grigoryvp Григорий Петров http://bit.ly/ccomnf Код мы осознаем также def reset_loaders():

    for backend in engines.all(): if not backend.is_template(): continue for loader in backend.loaders: loader.reset() 15 для всех бэкендов * только для темплейтов для всех лоадеров бэкенда ресет!
  8. @grigoryvp Григорий Петров http://bit.ly/ccomnf Откуда берется облако смыслов? ✓ "Когнитом"

    Анохина. ✓ Дерево смыслов, растущее с рождения. ➜ Новые элементы соединяются с существующими. 19
  9. @grigoryvp Григорий Петров http://bit.ly/ccomnf Откуда берется облако смыслов? ✓ "Когнитом"

    Анохина. ✓ Дерево смыслов, растущее с рождения. ✓ Новые элементы соединяются с существующими ➜ и закрепляются повторениями *. 20 * Обучение от простого к сложному и практика
  10. @grigoryvp Григорий Петров http://bit.ly/ccomnf Откуда берется облако смыслов? ✓ "Когнитом"

    Анохина. ✓ Дерево смыслов, растущее с рождения. ✓ Новые элементы соединяются с существующими ➜ и закрепляются повторениями *. 21 * Обучение от простого к сложному и практика
  11. @grigoryvp Григорий Петров http://bit.ly/ccomnf Облако смыслов для кода берется из:

    def foo(left, right): mid = (left + right) / 2 return mid 24 Синтаксис языка
  12. @grigoryvp Григорий Петров http://bit.ly/ccomnf Облако смыслов для кода берется из:

    def foo(left, right): mid = (left + right) / 2 return mid 25 Синтаксис языка callable с параметрами туша callable с возвратом
  13. @grigoryvp Григорий Петров http://bit.ly/ccomnf Облако смыслов для кода берется из:

    class Publisher(models.Model): name = models.CharField() website = models.URLField() class Meta: ordering = ["-name"] def __str__(self): return self.name 27 Фреймворк
  14. @grigoryvp Григорий Петров http://bit.ly/ccomnf Облако смыслов для кода берется из:

    class Publisher(models.Model): name = models.CharField() website = models.URLField() class Meta: ordering = ["-name"] def __str__(self): return self.name 28 Фреймворк Модель для базы Пара полей Отображение для админки
  15. @grigoryvp Григорий Петров http://bit.ly/ccomnf Облако смыслов для кода берется из:

    user = next(admin_users, None) 34 Идиомы стека Первый админ * Если есть
  16. @grigoryvp Григорий Петров http://bit.ly/ccomnf Облако смыслов для кода берется из:

    def check_token(self, user, token): if not (user and token): return False ... 36 Идиомы программирования
  17. @grigoryvp Григорий Петров http://bit.ly/ccomnf Облако смыслов для кода берется из:

    def check_token(self, user, token): if not (user and token): return False ... 37 Идиомы программирования Будем проверять токен Все хорошо? Продолжаем разговор
  18. @grigoryvp Григорий Петров http://bit.ly/ccomnf Облако смыслов для кода берется из:

    i j k 41 Имена идентификаторов default_username permission_name_max_length resolved_login_url Что? Где? Когда?
  19. @grigoryvp Григорий Петров http://bit.ly/ccomnf Облако смыслов для кода берется из:

    i j k 42 Имена идентификаторов default_username permission_name_max_length resolved_login_url Что? Где? Когда? Имя пользователя, если не задано Максимальная длина какого-то текста URL для логина, с которым что-то случилось
  20. @grigoryvp Григорий Петров http://bit.ly/ccomnf Облако смыслов для кода берется из:

    43 Имена идентификаторов Идиомы программирования Идиомы стека Библиотеки Фреймворк Синтаксис языка
  21. @grigoryvp Григорий Петров http://bit.ly/ccomnf У разных людей разный когнитом Код

    45 if val is None: try: del self['_session_expiry'] except KeyError: pass return if isinstance(val, timedelta): val = timezone.now() + val self['_session_expiry'] = val
  22. @grigoryvp Григорий Петров http://bit.ly/ccomnf У разных людей разный когнитом Код

    46 Что осознает junior if val is None: try: del self['_session_expiry'] except KeyError: pass return if isinstance(val, timedelta): val = timezone.now() + val self['_session_expiry'] = val Ничего не передали? Пробуем стереть по ключу * А так можно? Ошибки игнорируем Передали разницу времени? Делаем что-то с чем-то Сохраняем по ключу
  23. @grigoryvp Григорий Петров http://bit.ly/ccomnf У разных людей разный когнитом Код

    47 Что осознает junior Что осознает senior if val is None: try: del self['_session_expiry'] except KeyError: pass return if isinstance(val, timedelta): val = timezone.now() + val self['_session_expiry'] = val Ставим/удаляем поле * Соблюдаем таймзону * Собственный сеттер Ничего не передали? Пробуем стереть по ключу * А так можно? Ошибки игнорируем Передали разницу времени? Делаем что-то с чем-то Сохраняем по ключу
  24. @grigoryvp Григорий Петров http://bit.ly/ccomnf Кошелек Миллера ✓ Мы не знаем

    почему так. ➜ Активируемые части когнитома могут быть большими. 51
  25. @grigoryvp Григорий Петров http://bit.ly/ccomnf Кошелек Миллера ✓ Мы не знаем

    почему так. ✓ Активируемые части когнитома могут быть большими. ➜ Например "комната с дверью за спиной и окном". 52
  26. @grigoryvp Григорий Петров http://bit.ly/ccomnf Кошелек Миллера ✓ Мы не знаем

    почему так. ✓ Активируемые части когнитома могут быть большими. ✓ Например "комната с дверью за спиной и окном". ➜ Ориентироваться в непривычном помещении нам тяжело. 53
  27. @grigoryvp Григорий Петров http://bit.ly/ccomnf Очевидно: ✓ Чем больше знакомых приемов,

    тем проще разработчик читает код. ➜ Разработчик с большим опытом проще читает код. 56
  28. @grigoryvp Григорий Петров http://bit.ly/ccomnf Очевидно: ✓ Чем больше знакомых приемов,

    тем проще разработчик читает код. ✓ Разработчик с большим опытом проще читает код. ➜ Код, написанный знакомыми приемами, проще читается. 57
  29. @grigoryvp Григорий Петров http://bit.ly/ccomnf Очевидно: ✓ Чем больше знакомых приемов,

    тем проще разработчик читает код. ✓ Разработчик с большим опытом проще читает код. ✓ Код, написанный знакомыми приемами, проще читается. ➜ "Пять" это не число строк, методов или классов. 58
  30. @grigoryvp Григорий Петров http://bit.ly/ccomnf Очевидно: ✓ Чем больше знакомых приемов,

    тем проще разработчик читает код. ✓ Разработчик с большим опытом проще читает код. ✓ Код, написанный знакомыми приемами, проще читается. ✓ "Пять" это не число строк, методов или классов. ➜ Это количество несвязанных частей когнитома для осознания кода. 59
  31. @grigoryvp Григорий Петров http://bit.ly/ccomnf Очевидно: ✓ Чем больше знакомых приемов,

    тем проще разработчик читает код. ✓ Разработчик с большим опытом проще читает код. ✓ Код, написанный знакомыми приемами, проще читается. ✓ "Пять" это не число строк, методов или классов. ✓ Это количество несвязанных частей когнитома для осознания кода. ➜ Разное число для разных разработчиков. 60
  32. @grigoryvp Григорий Петров http://bit.ly/ccomnf Очевидно: ✓ Чем больше знакомых приемов,

    тем проще разработчик читает код. ✓ Разработчик с большим опытом проще читает код. ✓ Код, написанный знакомыми приемами, проще читается. ✓ "Пять" это не число строк, методов или классов. ✓ Это количество несвязанных частей когнитома для осознания кода. ✓ Разное число для разных разработчиков. ➜ Разное число для разных путей в коде. 61
  33. @grigoryvp Григорий Петров http://bit.ly/ccomnf Очевидно: ✓ Чем больше знакомых приемов,

    тем проще разработчик читает код. ✓ Разработчик с большим опытом проще читает код. ✓ Код, написанный знакомыми приемами, проще читается. ✓ "Пять" это не число строк, методов или классов. ✓ Это количество несвязанных частей когнитома для осознания кода. ✓ Разное число для разных разработчиков. ✓ Разное число для разных путей в коде. ➜ Мы привыкаем к коду, который пишем прямо сейчас. 62
  34. @grigoryvp Григорий Петров http://bit.ly/ccomnf Очевидно: ✓ Чем больше знакомых приемов,

    тем проще разработчик читает код. ✓ Разработчик с большим опытом проще читает код. ✓ Код, написанный знакомыми приемами, проще читается. ✓ "Пять" это не число строк, методов или классов. ✓ Это количество несвязанных частей когнитома для осознания кода. ✓ Разное число для разных разработчиков. ✓ Разное число для разных путей в коде. ✓ Мы привыкаем к коду, который пишем прямо сейчас. ➜ Когнитивная сложность разная с "прогретым кешом" и "вхолодную". 63
  35. @grigoryvp Григорий Петров http://bit.ly/ccomnf Очевидно: ✓ Чем больше знакомых приемов,

    тем проще разработчик читает код. ✓ Разработчик с большим опытом проще читает код. ✓ Код, написанный знакомыми приемами, проще читается. ✓ "Пять" это не число строк, методов или классов. ✓ Это количество несвязанных частей когнитома для осознания кода. ✓ Разное число для разных разработчиков. ✓ Разное число для разных путей в коде. ✓ Мы привыкаем к коду, который пишем прямо сейчас. ✓ Когнитивная сложность разная с "прогретым кешом" и "вхолодную". ➜ Когнитивная сложность целого больше сложности его частей. 64
  36. @grigoryvp Григорий Петров http://bit.ly/ccomnf Сложность целого больше сложности частей 66

    def _post_process(self, paths, adjustable_paths, hashed_files): # Sort the files by directory level def path_level(name): return len(name.split(os.sep)) for name in sorted(paths, key=path_level, reverse=True): substitutions = True # use the original, local file, not the copied-but-unprocessed # file, which might be somewhere far away, like S3 storage, path = paths[name] with storage.open(path) as original_file: cleaned_name = self.clean_name(name) hash_key = self.hash_key(cleaned_name) # generate the hash with the original content, even for # adjustable files. if hash_key not in hashed_files: hashed_name = self.hashed_name(name, original_file) else: hashed_name = hashed_files[hash_key] # then get the original's file content.. if hasattr(original_file, 'seek'): original_file.seek(0) hashed_file_exists = self.exists(hashed_name) processed = False # ..to apply each replacement pattern to the content if name in adjustable_paths: old_hashed_name = hashed_name content = original_file.read().decode('utf-8') for extension, patterns in self._patterns.items(): if matches_patterns(path, (extension,)): for pattern, template in patterns: converter = self.url_converter(name, hashed_files, template) try: content = pattern.sub(converter, content) except ValueError as exc: yield name, None, exc, False if hashed_file_exists: self.delete(hashed_name) # then save the processed result content_file = ContentFile(content.encode()) if self.keep_intermediate_files: # Save intermediate file for reference self._save(hashed_name, content_file) hashed_name = self.hashed_name(name, content_file) if self.exists(hashed_name): self.delete(hashed_name) saved_name = self._save(hashed_name, content_file) hashed_name = self.clean_name(saved_name) # If the file hash stayed the same, this file didn't change if old_hashed_name == hashed_name: substitutions = False processed = True if not processed: # or handle the case in which neither processing nor # a change to the original file happened if not hashed_file_exists: processed = True saved_name = self._save(hashed_name, original_file) hashed_name = self.clean_name(saved_name) # and then set the cache accordingly hashed_files[hash_key] = hashed_name yield name, hashed_name, processed, substitutions
  37. @grigoryvp Григорий Петров http://bit.ly/ccomnf Что делать ✓ Следим за количеством

    "штук". ✓ Следим за "идеоматичностью". ➜ Проверка: Большинство разработчиков так это делают? 70
  38. @grigoryvp Григорий Петров http://bit.ly/ccomnf Что делать ✓ Следим за количеством

    "штук". ✓ Следим за "идеоматичностью". ✓ Проверка: Большинство разработчиков так это делают? ➜ Проверка: Это будет читать junior, middle или senior? 71
  39. @grigoryvp Григорий Петров http://bit.ly/ccomnf Что делать ✓ Следим за количеством

    "штук". ✓ Следим за "идеоматичностью". ✓ Проверка: Большинство разработчиков так это делают? ✓ Проверка: Это будет читать junior, middle или senior? ➜ Проверка: Это будет читать специалист или генералист? 72
  40. @grigoryvp Григорий Петров http://bit.ly/ccomnf Что делать ✓ Следим за количеством

    "штук". ✓ Следим за "идеоматичностью". ✓ Проверка: Большинство разработчиков так это делают? ✓ Проверка: Это будет читать junior, middle или senior? ✓ Проверка: Это будет читать специалист или генералист? ➜ Следим за именами "штук". 73
  41. @grigoryvp Григорий Петров http://bit.ly/ccomnf Что делать ✓ Следим за количеством

    "штук". ✓ Следим за "идеоматичностью". ✓ Проверка: Большинство разработчиков так это делают? ✓ Проверка: Это будет читать junior, middle или senior? ✓ Проверка: Это будет читать специалист или генералист? ✓ Следим за именами "штук". ➜ Проверка: Идентификатор отвечает на вопрос "что это"? 74
  42. @grigoryvp Григорий Петров http://bit.ly/ccomnf Что делать ✓ Следим за количеством

    "штук". ✓ Следим за "идеоматичностью". ✓ Проверка: Большинство разработчиков так это делают? ✓ Проверка: Это будет читать junior, middle или senior? ✓ Проверка: Это будет читать специалист или генералист? ✓ Следим за именами "штук". ✓ Проверка: Идентификатор отвечает на вопрос "что это"? ➜ Проверка: Код отвечает на вопрос "зачем это"? 75
  43. @grigoryvp Григорий Петров http://bit.ly/ccomnf Что делать ✓ Следим за количеством

    "штук". ✓ Следим за "идеоматичностью". ✓ Проверка: Большинство разработчиков так это делают? ✓ Проверка: Это будет читать junior, middle или senior? ✓ Проверка: Это будет читать специалист или генералист? ✓ Следим за именами "штук". ✓ Проверка: Идентификатор отвечает на вопрос "что это"? ✓ Проверка: Код отвечает на вопрос "зачем это"? ➜ Проверка: Код рассказывает историю? 76
  44. @grigoryvp Григорий Петров http://bit.ly/ccomnf Выводы ➜ Наш мозг работает не

    так, как рассказывают бабушки у подъезда. 78
  45. @grigoryvp Григорий Петров http://bit.ly/ccomnf Выводы ✓ Наш мозг работает не

    так, как рассказывают бабушки у подъезда. ➜ Есть контринтуитивные штуки: диеты, тренажерный зал, сложность кода. 79
  46. @grigoryvp Григорий Петров http://bit.ly/ccomnf Выводы ✓ Наш мозг работает не

    так, как рассказывают бабушки у подъезда. ✓ Есть контринтуитивные штуки: диеты, тренажерный зал, сложность кода. ➜ Есть люди худые, мускулистые, умные от природы. 80
  47. @grigoryvp Григорий Петров http://bit.ly/ccomnf Выводы ✓ Наш мозг работает не

    так, как рассказывают бабушки у подъезда. ✓ Есть контринтуитивные штуки: диеты, тренажерный зал, сложность кода. ✓ Есть люди худые, мускулистые, умные от природы. ➜ Нам нужно хорошо разобраться в вопросе, если хотим сделать круто. 81