Три повседневных навыка в работе программиста
Публичный постВ объявлениях о работе и на интервью зачастую спрашивают не то, что приходится делать каждый день. Вместо задач на графы и оптимизации с помощью AVL-деревьев приходится парсить очередной JSON. Это несоответсвие больше всего, на мой взгляд, сбивает начинающих: учишь одно, а ожидания от тебя совсем другие.
В связи с этим хочу попросить сообщество [программистов] написать примерно 3 навыка (можно меньше), которые вам нужны практически каждый день (ну или чаще других). Навыки должны быть конкретными, такими, которым можно целенаправленно научиться самостоятельно (скажем, если вы останетесь одни, у вас будет компьютер, интернет и подходящая книжка). Не обязательно они являются сутью вашей работы: например, вы можете работать над автономными роботами, но навык, который вы указываете - умение писать юнит-тесты на Python. Как правило это те действия, которые вы делаете часто и "из головы", хотя я не хочу ставить такое условие - вполне обычно, если вы иногда смотрите в документацию
Пример подходящего навыка - применение awk в bash скриптах для вытаскивания ошибок из логов.
Пример неподходящего навыка - умение упрощать архитектуру приложения (навык не конкретный и ему невозможно научиться самостоятельно).
Опять же, больше в техническую часть, поэтому "разговорный английский", "умение общаться с людьми" здесь скорее всего не подойдут, хотя в целом очень полезны.
Снова зачем - чтобы дать начинающим и не только разработчикам информацию о том, чему уделить внимание.
На примере меня (программист инфраструктуры СУБД), 3 навыка:
умение писать с ходу jsonpath выражения (чтобы выстаскивать поля из K8S объектов)
умение писать умеренно сложные SQL запросы из головы (статистика работы сервисов лежит в СУБД, иногда приходится использовать window functions, и CTE чтобы, скажем, сегментировать время ответа сервиса и скоррелировать дату с каким-то еще событием)
умение писать unit и regression тесты на Gо.
Опять же, интересно, как оно есть конкретно у вас на самом деле в каждодневной работе, а не как оно должно быть в идеале.
Для большей релевантности, по отзывам из комментариев, наверное лучше еще указать стек, потому как навыки работы с той же Figma для embed-программистов вероятно будут нерелевантны.
Ваш ход :-)
Умение пользоваться vim'ом. Если надо подправить конфиг или чуть изменить скрипт на удаленной машине, то vim — это единственный редактор, который по умолчанию там есть. Даже если пишешь код в супер крутой IDE, даже если фанат emacs'a (каковым я и был до определенного момента), навык работы с vim экономит кучу времени.
Понимание, как работает Git внутри. Чтобы git merge, reset, rebase, etc не вводили в ступор и не порождали снежный ком косяков. Рекомендую книгу Version Control with Git. У нее еще летучая мышь на обложке.
Пункт применим не ко всем, но тем не менее: умение захватывать и анализировать сетевой траффик в Wireshark или подобном инструменте. Отлично дополняет development mode браузера и помогает находить тонкие низкоуровневые баги.
Три про отладку:
— гуглить
— использовать дебаггер (а не console.log / echo / print)
— потратить 2-3 минуты на решение вопроса самостоятельно, а уже потом спрашивать у кого-то «постарше»
Самое сложное в освоении для меня:
а еще твердо сидеть на попе в миллионный раз делая одно и то же
Регулярки!!! И парсинг, и сложные эндпоинты, и sed, и валидаторы, даже поиск файлов/текста в IDE.
Умение пользоваться cat/grep/find/awk/sed/xargs и т.д., писать на баше. Очень полезно для работы с большим количеством файлов, при работе с процессами/контейнерами на компе, при анализе логов и т.п. Можно скриптовать рутинные операции (например, git-хуки)
Работа с ssh, sshfs, scp, а также с ключами, настройкой хостов и ключей в ssh-конфигах, и работа с ssh-агентом. Умение с ними работать помогает настроить любое рабочее окружение под любой сетап. Особенно, когда у вас несколько гит-серверов, есть удаленная и локальная машины и т.п.
Всё это пригождалось всегда, независимо от стека
Самый главный мой навык — разобраться, почему всё не работает так, как надо, и сделать так, чтобы работало. Вроде неконкретно, но это именно так. Случаев полно, и часто выглядит всё магией.
Вот, например, последний такой. У кастомера не работает скрипт, выдаёт питоновские потроха голубыми кишочками наружу:
Выясняю. Оказывается, дело в том, что кастомер так засетапил нужную environment variable:
Лёгким движением руки на глазах у кастомера ввожу в терминал:
И всё работает! Кастомер рвёт на себе волосья и вопрошает: «Что это было?»
Фронтенд. Не маст-хэв, но полезные навыки:
Минимальное использование curl (получить ответ с кодом и заголовками, засетить хедеры, передать жсон постом). Полезно при общении с бэкендерами ("вижу вот тут 500-ю, вот запрос").
Баш-скриптинг. Тут и возможность написать длинную команду с пайпами (
grep ... | sed ...
- чтобы что-нибудь из логов достать, например), и какой-нибудь скриптик (запуск проекта одной командой). Всё с гуглом, нет необходимости помнить опции sed или синтаксис if-ов, чтобы уметь писать это сразу из головы, не так часто надо. Принципиально просто знание "вот так можно, ща уточню как это сделать" + https://tldr.sh/Представление о возможностях CI - что можно запускать тесты и прогонять линтер на пуллреквесты, прикрутить дополнительные штуки типа Danger JS, запускать отдельные джобы только на пуллреквесты, отдельные на мёрдж. Как сделать установку и сборку быстрее, как кэшировать зависимости, чтобы не ставить их каждый раз. Навык не ежедневный и системы везде разные, но можно потренироваться на каком-нибудь github actions, чтобы сформировать представление.
P.S. Еще бы вынес отдельно - независимость - на каком то уровне делать вещи за пределами своего стека
Пользуюсь этими навыками не каждый день, но и не раз в год. Когда надо, то прямо очень.
Мне чаще прихоидтся спускаться на более низкие уровни: запустить strace/perf для высокоуровневой программы, заглянуть в кишки компилятора/интепретатора и т.д.
Иногда надо и наоборот. Если после условного часа изучения логов или смотрения в дебаггер все равно ничего не понятно, полезно будет отступить назад и попробовать нарисовать диаграммку, проследить путь запроса/данных через весь стек и т.п.
Мне кажется, что у меня этот навык развит неплохо, но предел есть всегда. В какой–то момент я спущусь/поднимусь туда, где разобраться будет долго и/или сложно. В такие моменты я ищу людей, которые разбираются лучше меня.
Примеров из жизни слишком много чтобы выбрать что–то конкретное.
Начиная от языковых дебаггеров, strace и т.п. до посылки запросов вручную через netcat/openssl. В идеале уметь пользоваться парой разных тулзов из одной категории, чтобы быть готовым к тому, когда любимых инструментов не окажется под рукой.
Пример из жизни: недавно нужно было отладить проблему с валидацией TLS сертификатов. Библиотека TLS выдает какую–то невнятную ошибку. Из логов ничего не ясно, даже непонятно, сервер несогласен с клиентом или наоборот. Зарядил
openssl s_client
, почитал вывод, стало понятнее. Отыскал нужное место среди тысяч строк в TLS библиотеке, добавил логов. Бум, готово.Но такие вещи зависят от конкретного стека же. Я не думаю, что те, кто пишут на плюсах, например, пишут постоянно тесты. А пхпшникам нечасто нужно погружаться в дебри оптимизации с помощью битовых операций ) В шапке точно релевантный вопрос? Получится ли так собрать статистику, какие навыки являются более практическими?
😱 Комментарий удален его автором...