“Прыжок в продукт”
О красивом коде и пользе шпаргалок для программиста
Коллеги из IT-среды уделяют много внимания качеству кода.
Код тщательно выписывают и переписывают, о его красоте заботятся, его дизайн обсуждают.
Тем не менее, скажем страшную вещь.
О красоте кода можно и нужно заботиться, только если это требования работодателя или у вас большая команда.
Если вы пишете аналитический код для расчетов своих продуктов - пишите так, чтобы лично вам было (а) удобно, (б) понятно, (в) быстро.
В школе все писали шпаргалки. Мелким почерком на крохотном листе бумаги могли уместить сразу многое. И всё было сразу понятно. Это работает и для кода в production.
Например, мы в Raisk не используем autopep8 и в целом PEP8, потому что нам не нравятся переносы строки. Наш код бывает грязен и отвратителен. Он нарушает примерно все принципы и паттерны проектирования: как писать интерфейсы, классы, модели, как они должны соотноситься друг с другом на Python и других языках программирования.
Если посмотреть наш код на Python, то каждая строка насыщена смыслом. Там и трансформации, и преобразования данных, и многое другое. Хотя на проектах C# у нас реализованы и интерфейсы, и настоящее OOP - для нас время разработки приоритетнее, чем то, как код устроен изнутри.
После многих проб, ошибок, сомнений и угрызений совести мы пришли к выводу, что убиваться на проекте, вылизывая каждую строчку, не стоит. Особенно если ваши коллеги знают, о чем тот или иной блок.
Такой подход позволяет нам вести десяток проектов и не тратить огромные (клиентские) средства на то, что прямо не приносит прибыль.
Самое интересное, что на github мы видим десятки (сотни?) очень красивых, “вылизанных” проектов, перспективных с точки зрения бизнеса, но просто заброшенных. Почему? Красоту сложно поддерживать, а костыль работает всегда!
Часто нам говорят, что красивый код пишут, чтобы обеспечить более быстрое внедрение изменений - когда что-то ломается (меняется), то код правится в одном месте, а не в десяти. Честно говоря, это довод из книг. Как правило, с красивым кодом менять надо как раз в десяти местах, а не в одном.
Мы стараемся добиваться гибкости за счет несколько других принципов. Например, в основном продукте - Yes Systems - у нас активно используются конвенции и рефлексия и не используется Entity Framework. Код довольно гибкий, его удобно сопровождать, если знаешь принципы, на которых он был построен.
Десять лайфхаков, чтобы ваш код был понятен и вам, и коллегам:
- Активно используйте комментарии. Львиная доля трудозатрат - это работа с грязными данными, их особенностями либо скрупулезными пожеланиями клиента. Комментарии помогут вспомнить, что вы написали так, а не иначе, потому что отталкивались от исходных данных или требований. Или потому что не нашли другого способа.
- Используйте системы версионирования кода (очевидно) и версионирования данных (нигде кроме как у нас не видели).
- Мы также используем видео- и аудиокомментарии. Такого расширения для Visual Studio и Visual Code нет, но после записи мы вставляем ссылки комментарием туда, где они хранятся.
- Не гонитесь за новыми технологиями. Если говорить о среде .Net, то смена фреймворка (например на .Core) часто означает иной способ работы кода или вовсе прекращение его работы))
- Используйте протяжку кода в Excel. Например, на некоторых проектах мы не пользуемся Entity Framework и нам нужно довольно много кода с проверками данных, присвоением переменных, значений и проч. Мы делаем это в Excel, протягиваем код, копируем в Studio - и у нас получается та самая шпаргалка мелким почерком. Особенно это хороший совет для SQL-кода, но DBA со стажем, думаем, о нем знают.
- Используйте решения с развитой экосистемой. Для малых команд разработки такие решения, как PostgREST и сходные, - очень достойный вариант.
- Не сносите старые комментарии. Увы и ах, в наших решениях несколько страниц закомментированного кода, который работает, если его раскомментировать. Очень часто случается так, что он становится снова актуален, а искать его в ветках в гите довольно долго.
- Не идеализируйте гит, делайте хард-копи. Попробуйте взять какую-нибудь большую библиотеку и скомпилировать ее в нескольких предыдущих итерациях. Верим, что вы справитесь с этим, но ваш ключевой ресурс - время вашей жизни и работы - насколько пострадает от этого?
- Избавьте клиента от лишних программерских вопросов. Большинство ответов на технические вопросы звучит так: "Мне все равно". Но для приличия клиент вникает и пытается дать лучший ответ. На самом деле лучший ответ - это то, что работает у вас, а время покажет, насколько вы были правы.
- Дебаг - лучший способ вспомнить, что и как работает и почему. Применяйте собственные тесты на реальных данных и кейсах и тестируйте вручную свой код. Заодно через полгода-год становится быстро понятно, почему написано именно так.
Да, можно сказать, что все это походит на костыльное программирование, описанное в интервью Завински, либо, как мы бы предпочли это назвать, “прыжок в продукт”.
Поэтому если ваша задача - не потрясти github или угодить коллегам-программистам, а порадовать клиента или потребителя модели, то он гораздо больше обрадуется, что конечный продукт работает и все сходится с его расчетами. А когда он увидит счет - есть шанс, что он вас обнимет, пригласит на кофе или, что еще лучше, познакомит со своими бизнес-партнерами.