[СММ-2024] Интеллект с инструментами

Читаю первую главу “Системного мышления”.

Интеллект — это мыслительное мастерство, часть личности. Интеллект реализован мозгом и телом (embodied), или даже совместно работающими мозгом и компьютером (экзокортекс), телом и инструментами (экзотело) обобщённый вычислитель-как-устройство, «мозг с глазками, ушками, ножками и ручками, компьютерами и инструментами»

Зацепилась за инструменты. И подумала: интеллект с инструментами (tools and instruments) бьёт просто интеллект.

Мысль не новая, везде на все лады нам повторяют “экзокортекс”, пишите и т.п. Но в рабочей ситуации возникла другая мысль: “Линтеры лучше людей”.

Размышления про ревью и уровень компетентности

Я с одной стороны за компетентность. С другой стороны, всё знать, а тем более всё помнить - невозможно. Проще спросить. Плюс это экономит время (на важное)?

Вот у нас в вакансии написано “требуется знание docker”. Но знание можно разметить какой-нибудь шкалой.

Никидываю шкалу:
0 - слышал, но не пользовался
1 - пользуюсь на уровне простых команд
2 - пользуюсь командами посложнее, могу написать код, который работает
3 - могу написать код, который работает оптимально, знаю распространённые ошибки и не делаю их
4 - знаю хитрые ошибки, знаю как работает внутри
5 - ходячая энциклопедия, слежу за всеми апдейтами и несу эти знания в массы

Вот у нас в команде нет нулевых по знанию докера. 80% людей единички. 20% двойки. И в то же время реальность такова, что Dockerfile для приложения пишется крайне редко. Один раз в начале, когда проект только начинался. В следующий раз только если мы дробим приложение на части. Из всей команды, может пара человек это делали. Остальные используют то, что написано другими.

Чтобы стать тройкой, я вижу два пути: заморочиться и добрать знаний, поставить навык; либо заручиться поддержкой tools. Медленный и более привычный путь первый. Для меня иногда он контринтуитивный - уточнять информацию по методу, когда делаешь. Я же специалист, знаю что делаю! Второй: автоматизировать уточнение инфы (воткнуть linter, спрашивать у бота).

А ещё у нас T-shape person. Т.е. я от себя ожидаю глубокой экспертизы в профильных областях и неплохой в смежных. И тут я подумала: как будто надо разделить какие у меня знания из вертикальной палки T-shape, а какие из горизонтальной. Мы вертикальную обычно доучиваем (растим цифру из моей шкалы), а по горизонтальной - может достаточно знать, где искать (у кого или как спросить)?

К чему я про ревью упомянула. Это взаимосвязанные вещи. Мне сейчас назначили пачку задач по правкам замечаний от службы безопастности. Как это выглядит? Да почти так же, как пожарную безопасность проверяют в кафе. Раз в период какой-то приходит инспектор и давай шерстить ваше заведение. У нас шерстит какой-нибудь статический анализатор кода по всем репозиториям проекта на предмет уязвимостей. С периодичностью тоже есть вопросы. Вот я сейчас допустим поправлю всё, что нашли. А в следующий раз они через полгода придут? А за эти полгода каков шанс, что мы снова дырок не наделаем?

Тут возникает вопрос ревью и линтеров. Как в любой команде разработки у нас есть процесс код ревью. И даже правило (непреложное), что апрувнуть (одобрить) твою ветку с кодом должен любой другой член команды. Сам ты себе не должен ставить галочку. Хотя на уровне репозитория правила на это нет и её всё-таки можно поставить. Но мы такие “это на критичные случаи”. Критичные случаи это когда кто-то хотфикс ночью делает для продакшена. И просто нет на связи тех, кто может поставить галочку. Что подразумевает ревью кода? Как будто бы, то что коллега (или несколько коллег) посмотрят глазами твой код, побудут “интерпретатором программы”, попытаются в голове прогнать код и подумать где он может работать криво. Криво - не так, как мы ожидаем. Что для этого нужно от коллег? Компетентность (экспертиза в той технологии кода, которая используется для решения задачи) и внимательность. Я выше про компетентность написала, она может быть разная. Плюс умножаем комптентность на невнимательность получаем ноль пользы. “Я не заметил! - ты не обратил внимание”. Умножаем компетентность на плохую память мокрой нейросетки - опять получаем ноль. Я вроде знаю это, но конкретно в этот момент не вспомнила. Какого качество такое ручное интерпретирование программ? Так себе. Это я ещё про формальность галочек ничего не сказала. А формальные галочки тоже бывают. Потому что опять вопросы собранности, срочности, того чем человек занят, когда ты в чат кидаешь просьбу провести ревью. Можно сейчас начать разговор, что ревью это не про качество. Но не будем.

Что делать с этим? Я за линтеры. Если я забываю и невнимательная, а какие-то штуки можно проверять формально через tools. То их надо проверять. Просто добавляя очередной линтер. Но самая контринтуитивная мысль такая: использовать предподготовку до/во время написания кода. Т.е. сразу подумать, как я могу себя проверить, есть какая-то штука, которая проверит “распространенные ошибки”. И если она есть (библиотека или бот), то я её запускаю на то, что пишу. И до ревью уже какие-то вещи исправлю, несильно надеясь на коллег и дальнейшие этапы жизни моего кода. Это не волшебная таблетка, есть довольно много мест, которые всё ещё только глазами можно распарсить. Причём это тоже на уровне тела “что-то мне тут не нравится”. И там остановиться и подумать, пойти документацию почитать. Куча ошибок продолжает путешествовать по линии “первый делал быстро, потому что горело, второй скопировал код, не думал, третий и т.д. копируют кривое”. Потом полгода проходит и кто-то внимательный вдруг обнаруживает, “а что это за ерунда написана? это же не будет работать. И у нас это в 10 местах в проекте”. Тушите свет.

1 лайк

Это просто расширение идеи TDD и “диагностики компилятора” как первого же преднаписанного теста ))) Про инструменты идея всё-таки чуток пошире, в том числе инструменты ведь выходят и в физический мир. Голыми руками не копают, голыми мозгами не кодят.

1 лайк

С руками чуть проще, а вот с мозгами как раз и хочется для себя прояснить. Но это наверно ещё в методологию нужно нырять. Я сейчас для себя вижу несколько возможных проблем, об которые мы всё время бъёмся лбом.

  1. описание задачи (онтологика, размыто, не получается чёткого понимания, что мы хотим получить решая задачу)
    Лечится постоянными уточнениями. Но как будто постановка влияет на выбор метода работы, а потом и возможных инструментов по методу.
  2. разработчик получая задачу, должен бы подумать каким методом (технологией) будет решать задачу.
    Т.е. опять выбрать метод, если варианты предложены. Сформировать список подходящих методов, если их нет. И уже когда выбрал, выбрать инструменты (это что угодно может быть: разные библиотеки, разные технологии, может вообще без кода это можно решить, схему предоставить)
  3. разботчик приступает к работе по методу с выбранными инструментами.
    Тут возникает как раз вопрос насколько он умеет работать этими инструментами по этому методу и можно ли его мозг поддержать, как-то ещё. Соседскими мозгами (людскими и не очень), другой практикой (медленного чтения документации, медленного чтения статей, решающих похожую задачу, сборника best practices решения этого класса задач).

Я для себя понимаю, что первый этап я уже не пропускаю (спасибо МиС, мы больше никому не верим). А на втором этапе часто не возникает мысли, чем копать. “Некогда пилу точить, надо пилить”. А перепроверка в конце: теперь стала думать, как ещё можно себя перепроверить. Обычно пользуешься “стандартным набором инструментов”. Оптимальный этот набор или его надо обновлять, тоже редко кто думает.

Проблема в том, что разработчик обычно тут не думает про метод вообще! Не то, чтобы думает про метод – а потом выбирает инструментарий, а даже мысли не думает, что можно как-то сделать иначе, чем он начал делать. Метод берётся ad hoc (любой), и для него сразу делается планирование – план работы пишется и там инструменты-как-ресурсы, исходя из того, что неявно пришло в голову.

Один из наших выпускников только после второго прохождения курса говорил: “иду по своему предприятию, вижу, что все мои сотруднички работают, что-то делают, и сразу у меня мысль – это они ведь по методу что-то делают, а метод наверняка выбрали не лучший, даже не думали над тем, какой”. А до этого – “люди работают, всё в порядке”. Нет, не всё: “люди работают по наилучшему из известных методов” – это совсем другое утверждение.

А дальше надо разбираться с понятием метода. Это будет в курсе “Методология”.

2 лайка

тогда линтеры+люди лучше людей?

для меня тоже загадка зачем в вакансии подобное пишут. По идее достаточно просто слышать про это и где применяется(за исключением инфраструктурных команд), а потом при необходимости - за пару часов видосиков на ютубе все наверстает.
Я как-то предложил в вакансии вместо вот этого вот огромного списка требований оставить только “писал продакшн код и не дурак” мои предложения не оценили.

Но это не точно)

Тоже есть нюансы. У Левенчука инженер должен шарить, что происходит на соседних системных уровнях (один уровень вверх, один вниз). Я по опыту пока вижу, что скинуть полностью обязательства по экспертизе на команду платформы, мы тоже не можем. Они генералисты, их же не заставишь выучить как писать докер файлы под все языки программирования. Значит мы это вместе должны делать (что у нас и делается). Каждый свою часть знаний приносит и они накладываются.

Это красиво)

  • Не дурак, а чем докажешь?
  • Слово пацана!
1 лайк