Как программисты пишут код


Процесс написания кода | Жизнь программиста

Видео может быть заблокировано из-за расширений браузера. В статье вы найдете решение этой проблемы.

Не волнуйтесь, если что-то не работает. Если бы всё работало, вас бы уволили.

Насколько важным является процесс кодирования в программировании? Ответ на этот вопрос не так очевиден, как может показаться на первый взгляд. Некоторые считают, что это и есть программирование, но на самом деле это не так.

Факты о программировании

Вот некоторые неочевидные факты о программировании:

  • Только 10-20% времени тратится на кодирование
  • Большая часть времени тратится на размышления
  • Существенная часть времени тратится на отладку
  • В день пишутся лишь десятки строк кода, которые пойдут в конечный продукт

Действительно, профессиональные разработчики тратят лишь 10-20% времени непосредственно на написание кода. Сравним, как выглядит работа программиста в реальной жизни с тем, как она обычно представляется в кино. В фильмах программисты постоянно набирают что-то на клавиатуре, но в обычной жизни вы скорее увидите человека, который чешет голову и задумчиво смотрит в экран, записи или вообще в пустоту. Зачастую тот код, который пишет программист, не является конечным. Он может постоянно его дорабатывать, переписывать, и в конечном итоге в день будет написаны несколько десятков строк готового кода, которые пойдут в конечный продукт.

Рассмотрим график, который показывает распределение рабочего времени в зависимости от уровня программиста: от начинающего до профессионального.

Ось Х отражает уровень программиста, а ось Y — его рабочий день. Видно, что есть очень сильная корелляция между уровнем разработчика и тем, на что уходит его рабочее время. Когда человек только начинает учиться программированию, то большую часть времени занимает именно процесс кодинга и отладки. Причем на отладку будет уходить даже больше времени, нежели указано на графике — не менее 90%. Отладка — это процесс поиска ошибок в коде. Именно количество времени, которое уходит на отладку, является одним из показателей уровня программиста. Помимо отладки новичок много занимается и кодингом, потому что ему нужно набивать руку. Кодинг можно сравнить с любым ремеслом, даже боевым искусством. Это такой процесс, который в конечном итоге, когда вы становитесь профессионалом достаточно серьёзного уровня, автоматизируется и становится просто способом реализации того, что вы придумали. И для ремесленника, и для художника, и для программиста первоочередная и самая сложная задача — это создать идею, продумать, что она в себя будет включать и как её воплотить в жизнь. А сам процесс воплощения обычно протекает гораздо проще.

Из чего состоят языки

Процесс кодинга — это непосредственная работа с языком. Пришло время разобраться, что из себя представляет язык. Любой язык программирования, равно как и язык естественный, состоит из 3 элементов.

Лексика

Первый элемент — это лексика. Лексика включает в себя словарь языка — набор слов, который в нём используется. В языках программирования такой набор слов гораздо более ограничен: в нём могут использоваться несколько десятков слов и спецсимволов против десятков тысяч слов в естественном языке. С другой стороны, выучить лексику языков программирования, а значит и усвоить его основы, гораздо проще. Ключевые слова учатся в процессе обучения и очень похожи во многих языках.

Синтаксис

Второй элемент языка — синтаксис, то есть те слова и конструкции, которые в нём присутствуют. Они записываются в виде программ, которые должны быть синтаксически корректными — это означает, что слова должны стоять в определенном порядке и подчиняться определенным правилам. Нарушение синтаксиса — это ошибка, и, в отличие от естественных языков, синтаксис в языках программирования — штука очень строгая, его нарушение сразу приводит к ошибке. Именно с этими ошибками в первую очередь сталкиваются программисты, которые пишут свои первые программы. Синтаксические ошибки просто отслеживать — нужно лишь немного набить руку. Знание синтаксиса — это основа, с которой начинается программирование.

Семантика

Третьим элементом языка является семантика. Одно дело — просто написать синтаксически верную конструкцию, но совершенно другое — чтобы она ещё и правильно работала. Семантика подразумевает, что должно происходить под синтаксисом, и как это будет работать. Знание семантики — это уже более глубокий уровень и требует хорошего понимания того, что происходит в том или ином коде, начиная от уровня конкретных конструкций и заканчивая программами в целом. Она сопровождает разработчиков всегда и везде, поэтому важно понимать, зачем выполняется какое-то действие и почему оно так работает.

Чем на самом деле является язык программирования

Языки программирования существуют в 2 формах:

  • Стандарт языка
  • Реализация стандарта

Первая форма языка — это его стандарт, определяющий синтаксис и семантику. Не у всех языков есть стандарты, и они не всегда появляются до появления самого языка. Обычно появляется какой-то язык, и если он становится популярен, создается его стандарт и спецификация. Большинство современных языков имеют такие стандарты в том или ином виде.

Вторая форма языка — это реализация стандарта. Их может быть несколько, они все могут быть разработаны разными производителями, иметь свои особенности, но все без исключения должны подчиняться спецификации (стандарту). Подчинение спецификации даёт возможность исполнять код в разных средах.

Разобраться в разнице между стандартом языка и его реализацией можно на примере популярнейшего языка программирования JavaScript, который используется абсолютно везде и часто идёт вторым языком почти в каждом проекте, особенно в веб-разработке. Есть стандарт ECMA-262 или ECMAScript, а есть язык JavaScript, который является его реализацией. Существует несколько реализаций ECMAScript, среди которых TypeScript и JScript, которые написаны Microsoft, ActionScript от Macromedia (Adobe) и другие. При этом сам язык JavaScript остаётся такой же реализацией, которая имеет несколько сред исполнения.

Одной из таких сред является браузер. Есть несколько разных браузеров, у каждого из которых своя реализация JavaScript. Существует еще серверная, бэкенд-реализация — она называется NodeJS — которая позволяет исполнять тот же самый JavaScript. Некоторые теряются и не понимают разницы между JavaScript и NodeJS, выбирая, что же из этого им нужно учить. На самом деле, выбор здесь прост: в первую очередь надо осваивать JavaSсript, как самую популярную реализацию стандарта ECMAScript, и только после этого погружаться в специфики сред исполнения. Примерно такая же ситуация с другими языками.

Для любого языка истина в последней инстанции — это его спецификация. Зачастую её очень непросто читать, и есть более человечные способы знакомства с синтаксисом и семантикой языка, но помните о первоисточнике — к нему всегда можно обратиться и найти ответ на вопрос, как работает тот или иной элемент языка.

Заблуждение

Знание синтаксиса языка программирования и семантики и есть программирование?

Есть одно очень важное заблуждение, которое касается практически всех начинающих программистов. Его распространению способствует огромное количество курсов на просторах сети, разговоров на форумах, чатах, где бы то ни было. У молодых разработчиков возникает ощущение, что знание синтаксиса языка и его семантики — это и есть программирование, но на самом деле это не так. Да, это знание очень сильно приближает к освоению программирования, и без него нельзя стать разработчиком, но оно не является определяющим. Точно так же, как покупка фотоаппарата и изучение его документации не делает из человека фотографа, знание синтаксиса и семантики языка программирования не делает из человека программиста.


Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

Что такое код и почему компьютеры все еще не пишут сами? | GeekBrains

Программисты набрались терпения и ответили на самые часто задаваемые вопросы. Читаем!

https://gbcdn.mrgcdn.ru/uploads/post/70/og_cover_image/634f2abc2b8213347ad6676483903afa

Что говорят программисты, когда их просят дать определение своей деятельности и намекают, что “машины справились бы быстрее”? Мы собрали ответы пользователей Quora, и вот что у нас получилось.

Вопрос:

- Почему компьютеры все еще не заменили программистов, если они быстрее, умнее и не ошибаются?

Ответы:

- Не поверите, ваш вопрос изучен до тошноты, и продолжает изучаться.
Давайте рассмотрим ситуацию так: на самом деле, много механической работы, которую должен выполнять программист, уже делает компьютер (хотя некоторые все еще используют C++, вместо того, чтобы написать скрипт в одну строчку). То есть (в идеале), мы не делаем то, что повторяется много раз — машины делают это за нас.

Таким образом, частично мы уже на этом пути. С другой стороны, передать кодинг компьютеру мы не можем сейчас, и не сможем в ближайшем будущем.

- Алан Купер отлично высказался по этому поводу:
Далекие от программирования люди видят в нем только механический, инженерный процесс. На самом же деле, это исключительно вариативная и творческая деятельность.

- Я бы хотел рассмотреть вопрос немного с другой стороны. Программирование решает 5 задач:

  1. Создание новой программы или функции
  2. Расширение функциональных возможностей уже существующих программ
  3. Исправление того, что не работает
  4. Реализация известного (существующего) шаблона проектирования в простой ситуации
  5. Реализация известного паттерна в вызывающе сложной задаче.

А теперь способности, которыми должен обладать исполнитель (компьютер):

  • Понимать задачу
  • Видеть пути реализации (знать возможности)
  • Быть в состоянии определить, какое решение будет оптимальным для конкретной задачи
  • Иметь возможность осуществить решение

Сейчас понять новую задачу (ее цели, проблемы, которые нужно решить) могут только люди. Для того чтобы компьютер мог понимать людей — их особенности, потребности, проблемы, которые могут возникать у них в процессе работы, он должен обладать более высоким уровнем осознанности, чем может сейчас. И я говорю не об искусственном разуме, а просто о больших по сравнению с нынешними возможностями. Например, сделать заключение на основании недостаточного количества данных путем поиска дополнительных во внешней среде или среди имеющихся.

Это достаточно сложный функционал, который, возможно, будет реализован, но это сомнительно.

Компьютер может написать код, используя достаточно сложные существующие шаблоны проектирования, и даже, в какой-то мере, удовлетворить некоторые пользовательские требования — это метапрограммирование. Есть задачи, которые могут решать только превосходные профессионалы, а написать средство для решения таких задач — особенно сложно.

- Думаю, что с появлением беспилотных автомобилей мы должны признать: компьютеры уже  на полпути к окончательному превосходству над нами. Что касается "компьютеров, способных программировать хотя бы на уровне среднего разработчика", то задача эта отнюдь не простая, но вполне реальная.

Не поверите, машины УЖЕ программируют за нас. LINQ — достойный пример из относительно современных: наш код становится все ближе и ближе к словесным формулировкам, так что ваш вопрос отчасти уже решен.

Тем не менее, обрабатывать абстрактные запросы и понятия они пока не умеют, как и самостоятельно приобретать новые знания, и вряд ли мы это увидим в нашей жизни.

- Отвечу вопросом на вопрос: а зачем для этого нужны люди?
Ответ в одном слове: творчество. Люди могут смотреть на одну вещь настолько по-разному! И, казалось бы, все решения логичны, но все они уникальны. Люди великолепны тем, что могут выполнить задание, данное в виде смутного описания. То есть, они могут понять ее — это уже неплохо, — и, более того, найти рабочее решение и воплотить его в жизнь.

А теперь представьте, каким должен быть компьютер, который решит задачу с требованием "Провести два перпендикулярных друг другу перпендикуляра к прямой". 

Человек обязательно что-нибудь придумает.

- Хм, если появится специальная программа, которая будет писать глючный код, то да — компьютер сможет заменить человека.
Я всегда думал, что идеальный код возникает только в процессе работы.

- Почему писатели все еще существуют? Неужели нельзя создать супермашину, которая будет писать книги лучше (см. Лем 'Электрибальд Трурля')?
Просто компьютеры — это инструменты, как молоток или печатная машинка. Почему писатели все еще существуют? Потому что машина набирает текст, а писатель создает историю.

Компьютер, который использует программист — это такой же инструмент, работающий с числовыми данными. Если его разобрать, оттуда не вылетит магический шар, излучающий логику.

- Да-да, это же тот самый вопрос, который частенько задают CEO, продакт-менеджеры и менеджеры по продажам: "Почему я не могу просто дать команду компьютеру вместо того чтобы иметь дело с вечно недовольными программистами?". Программист должен понять смутную и непонятную  "большую идею" управленца (даже если два человека хотят диаметрально противоположных вещей) и "объяснить" ее компьютеру в виде кода. А вот если все начнут мыслить как программисты, мы сможем продолжить обдумывать эту идею.

- Я хочу посмотреть, как он будет сам себя тестировать! Куда подать заявку?

- Если вы создадите программу, которая сможет генерировать другой софт на основании четких вербальных требований, вы обнаружите, что 99,99% людей не могут четко и недвусмысленно эти требования ставить. Весомая часть работы программиста — выслушивать и пытаться понять.

- Зачем нам нужны водители, разве автомобиль не справится с управлением лучше?

Все автоматизируется, и будет автоматизироваться до тех пор, пока человек существует как вид — это неизбежно. Другой вопрос, что для нас это стало  обыденно до незаметности, и мы продолжаем мечтать. Допустим, вы решили воспользоваться экспериментальным беспилотником. Ваши действия сведутся к единственной команде (точка прибытия) — будет ли это означать, что автомобиль “едет сам”, и вы не участвуете в управлении? Нет. Вы все еще водитель, который пользуется продвинутой автоматизированной системой, но все еще управляет ею.

Мы не замечаем постепенное упрощение жизни сейчас, как и не будем замечать его позже. То же касается и программирования.

С одной стороны, мы уже сильно продвинулись по пути автоматизации. Пример — те самые экспериментальные автомобили. С другой, хотя процесс написания кода уже тоже упрощен IDE, фрейморками и т.п., мы пока не можем доверить компьютеру самому решать, с какими именно проблемами работать, и как. И вряд ли доверим в ближайшее время: система принятия таких решений — это уже искусственный интеллект.

Вопрос:

Что вообще такое код и программирование?

Ответы:

- Постараюсь ответить. Допустим, вы играете в видеоигру. Чтобы она не закончилась, и вы могли продолжать играть, вам нужно совершать некие действия — "убивать боссов", решать головоломки и просто продолжать идти.

Я вижу свою профессию как решение логических задач творческого характера. В кодинге достаточно много головоломок, и часто они требуют нестандартного видения для того чтобы найти ответы, которые лежат за рамками привычного игрового поля.

И да, есть вторая сторона — дружба с браузером и умение составлять запросы поисковикам :)

Все это работает вместе примерно как симфония. Символьная. Это и есть кодинг.

- Программирование — это удивительная область знаний, в которой поиск ошибки — еще большее таинство, чем написание кода: почему я могу подключиться к трем другим SFTP-серверам, но только не к этому? Почему, черт возьми, копировать-вставить не работает в этом WebView?! Или у вас веселый марафон с загрузкой приложения в AppStore?

И, фактически, все, что вы делаете, сводится к поиску и устранению  багов (и попутному созданию новых). Иногда я ловлю себя на мысли: "А может, я просто пишу ошибки?"

- Это сложная, но интересная логическая игра против начальства :) Вы просто собираетесь вместе с командой, чтобы решить проблему. Ищете решения, и находите наиболее оптимальный путь из возможных (иногда оказывается, что был и более оптимальный, но это другая история). Затем вам нужно идти, придерживаясь выбранного пути с тем условием, что начальник, вступивший в игру, будет подкидывать новые "ловушки" — например, в виде правок к ТЗ.

А еще у этой игры нет финала.

- Представим это в таком виде: работа состоит из двух последовательных состояний — самодовольство и стресс — когда вы горды тем, что нашли крутое решение, а потом поняли, что оно провалилось по какой-то причине. Иногда цепь прерывается, например, когда у одного из них вы не находите недостатков и принимаете в работу. И потом вы переходите к следующей задаче, и все начинаете заново: "Я понял, как это сделать! Как же я находчив” — "Ok, оно не работает" — "Я понял, почему!" — "Хмм..." — ...

Чтобы цепи были как можно короче, надо постоянно учиться и подглядывать к старшим по должности ;)

- Это как делать любую другую вещь. Попробуйте!

Тем, кто хочет стать программистом, рекомендуем профессию «Веб-разработчик».

Создан помощник программистов, который будет писать за них код. Видео

| Поделиться

Microsoft запустила сервис Copilot, представляющий собой виртуального помощника программиста на базе искусственного интеллекта. Он изучает код и комментарии к нему и предлагает разработчику функции и целые строки для добавления в этот код. Такой подход ускоряет процесс написания программ и отказаться от поиска решений в интернете. К тому же в процессе работы Codex обучается и с каждым разом становится все умнее. Инструмент полностью бесплатный.

Виртуальный коллега-программист

Корпорация Microsoft разработала нейросетевого помощника программиста, который позволит упростить процесс написания кода. Проект получил название Copilot (второй пилот – англ.), и в его основе лежат технологии искусственного интеллекта стартапа Open AI.

Copilot развернут на базе GitHub, одного из крупнейших в мире Git-репозиториев. С 2018 г. он принадлежит Microsoft. Open AI тоже имеет определенные связи с корпорацией. Как сообщал CNews, в 2019 г. она вложила в этот стартап $1 млрд.

Виртуальный помощник программиста обучен взаимодействовать с различными фреймворками (средами разработки). Он понимает несколько языков программирования, но на момент публикации материала Copilot был заточен в первую очередь под JavaScript, Go, Python, Ruby и TypeScript.

Copilot постоянно обучается и со временем начинает давать все более дельные советы

Со слов главы GitHub Нэта Фридмана (Nat Friedman), Copilot – это именно помощник программиста, а не его заменитель. Это находит свое отражение и в названии проекта.

Copilot, утверждает Фридман, даст разработчикам возможность писать более качественный код. Он даже может позволить ускорить этот процесс за счет быстрого поиска решения возникших в ходе написания кода проблем. Другими словами, Copilot может заменить программистам поиск решений в интернете.

Как работает Copilot

В основе системы Copilot лежит система искусственного интеллекта Codex за авторством специалистов OpenAI. Для ее обучения были задействованы ресурсы самого GitHub, то есть миллионы строк кода в файлах, хранящихся в открытых репозиториях.

В теории, Copilot можно сравнить с коллегой-программистом, который постоянно смотрит в чужой монитор и дает советы. Система изучает код, над которым в данный момент идет работа, и заодно комментарии в нем. Также она следит за положением курсора и знает, над какой строчкой трудится программист.

Первый взгляд на Copilot

На основе этих данных Copilot начинает предлагать добавить в код одну или несколько строк или функций в зависимости от выполняемой работы. Разработчик сам решает, последовать совету искусственного интеллекта или отклонить его.

Решения программиста тоже влияют на обучение Copilot. Чем больше он взаимодействует с системой, тем быстрее она обучается программированию на различных языках, и тем более полезными становятся ее советы. Как следствие, процесс программирования при наличии постоянно набирающегося знаний помощника, пусть и виртуального, постепенно ускоряется.

На момент публикации материала Copilot был доступен в виде дополнения (плагина) к бесплатному редактору Microsoft Visual Studio Code. Также он работает и через любой современный в браузер в GitHub Codespaces. Оценить возможности Copilot сможет любой разработчик, без каких-либо ограничений.

Классическое программирование уходит в прошлое

Крупные компании делают все возможное, чтобы процесс программирования стал проще, быстрее и понятнее. Их действия также направлены на снижение порога входа в эту сферу, чтобы начать писать код мог почти каждый.

6 простых шагов: как импортозаместить решения в сфере информационной безопасности

Импортозамещение

Немалую роль в этом играет и сама Microsoft. За месяц до запуска Copilot она создала инструмент для написания ПО без развитых навыков программирования. Проект получил название Microsoft Power Apps, и он пригодится тем, кто пишет на языке Power Fx.

С его помощью пользователи смогут разрабатывать программы в формате диалога с компьютером. Например, при разработке приложения в сфере электронной коммерции можно будет описать в диалоге желаемую цель на естественном английском языке: «find products where the name starts with 'kids» («найти продукты, название которых начинается со слова "детский"» - англ).

Скоро писать программный код смогут абсолютно все

После этого Power Apps задействует алгоритмы искусственного интеллекта и предложит варианты преобразования этого запроса в формулу Microsoft Power Fx. Пользователю же останется только выбрать наиболее подходящий вариант, например «Filter('BC Orders' Left('Product Name', 4)="Kids")».

В октябре 2020 г. Microsoft выложила в открытый доступ приложение Lobe для создания готовых моделей машинного обучения. Lobe дает возможность создавать такие модели даже тем, кто не умеет программировать - от пользователей нужно лишь загрузить в нее данные, а всю работу программа выполнит сама.

MES по-русски: чем заменить зарубежные системы управления производственными процессами

Цифровизация

Lobe полностью бесплатна. Результат ее работы затем можно использовать в сторонних ПО и устройствах.

Но дальше всех пошла компания Amazon. Пока Microsoft развивает помощников программиста, Amazon продвигает сервис, полностью заменяющий разработчика.

В июне 2020 г. CNews писал, что Amazon запустила сервис Honeycode для создания приложений без необходимости написания программного кода. Проект полностью бесплатный, и использовать его могут как обычные потребители, так и крупные компании. К примеру, Slack, разработчик одноименного мессенджера, уже заявила о готовности к использованию Honeycode в своей работе.



Создана нейросеть, которая пишет код на уровне среднего программиста

Компания DeepMind, дочка Alphabet, запустил нейросеть AlphaCode, способную писать программы с нуля по одному лишь описанию задачи. Сейчас нейросеть способна справляться с написанием кода на уровне среднего программиста.

Создатели уверены, что в будущем AlphaCode позволит полностью автоматизировать процесс написания кода, пишут в Securitylab.

Возможности AlphaCode проверялись на платформе Codeforces, на которой выкладываются задачи и тесты для настоящих программистов. Для решения задач требовались навыки критического мышления, логики, алгоритмизации и кодирования. Чаще всего конкурсантов просят проложить дороги или разместить здания при определённых условиях, а также подобрать выигрышную стратегию для настольной игры. Нейросеть выполнила 10 тестов и попала в 54% лучших участников. В DeepMind подчеркнули, что при этом система создавала новый код с нуля, а не использовала готовые шаблоны.

Разработчики уверены, что в перспективе AlphaCode сможет заменить собой далеко не только начинающих программистов, чьи навыки в кодинге пока далеки от совершенства. Эта нейросеть может лишит работы и программистов более высокого уровня.

Компания надеется, что эти результаты помогут в разработке нейросетей, способных генерировать код. Сейчас навыки AlphaCode применимы только в конкурентном программировании, но в DeepMind верят, что в будущем оно станет полностью автоматизированным.

Над нейросетями, которые могли бы писать код с нуля, сейчас работают многие крупные компании. Основные проблемы таких систем на данный момент — ошибки в коде, которые бывает трудно найти, а также использование материалов, защищенных авторским правом.

Написание кода сверху вниз. Вокруг процессов разработки ПО есть… | by Ilya Lebedev

Дисклеймер: возможно, я переизобрёл что-то, что написано в книге, которую я не читал. В статье я использую термин “разработка сверху вниз”, но про topdown programming я ничего не читал. Про DDD я вообще не слышал ничего даже. Скорее всего, всё это уже было в Симпсонах. Не вините меня, я всего лишь котик, который играет с пакетом посреди ночи.

Вокруг процессов разработки ПО есть много интересного, а вот про сам процесс написания кода я не видел много материалов. Вот вы, разработчик, сидите перед компьютером. У вас есть понятная, оценённая и описанная задача. Вам нужно её реализовать. Как вы это будете делать?

Типичный ответ на вопрос — “просто сесть и сделать”, такой метод я называю водопадным. У него обычно есть такие этапы:

  • написание кода низкого качества, который иногда выполняет поставленную задачу;
  • отладка, чтобы выполнялся основной успешный кейс;
  • ручное тестирование;
  • “причёсывание” кода: разбиение на функции, нормальный нейминг;
  • написание автотестов (если повезёт).

У такого подхода много проблем. Остановлюсь на одной: в результате код обычно неверно декомпозирован. Это вызвано, с одной стороны, подходящим дедлайном, а с другой — тем, что нужно перелопачивать уже написанный код не лучшего качества.

Проблема критически важная: без её решения не получится годами пилить проект, не снижая скорости разработки.

Вот признаки разработчика, который использует водопадный способ написания кода:

  • сначала пишет код, потом его “причёсывает”;
  • обычно пишет большие функции, а потом их разбивает;
  • сперва использует переменные foo, bar, baz и подобные, а потом даёт им нормальные имена;
  • считает, что “причёсывание” не приносит пользу бизнесу, а “кодинг” приносит;
  • считает, что статический анализатор нужно убрать из билда и оставить его запуск на усмотрение разработчика.

Это не делает такого разработчика плохим: в результате он может выдавать код достаточно хорошего качества в достаточно короткие сроки. Такие ребята скорее всего уменьшают скорость внесения изменений в процессы команды, но это редко критическая проблема.

Тем не менее, есть способ повысить качество и уменьшить сроки. Один из них я называю программированием сверху вниз.

В модели сверху вниз перед написанием кода появляется этап дизайна кода. Без оглядки на реализацию каждого нового куска кода автор представляет, как было бы логично и правильно разбить задачу на шаги, где каждый шаг должен жить и как им пользоваться. Потом пишет тесты на ещё нереализованные шаги и рекурсивно применяет процедуру для оставшихся нереализованных модулей.

Чтобы стало понятно, давайте рассмотрим пример.

Итак, задача: нам нужно распарсить архив с отчётами, из названий директорий вытащить id клиник, из БД по id клиники получить её электронную почту и отправить каждый отчёт на нужный адрес.

Начинается всё с того, что у нас есть пустой обработчик формы:

Представим логические этапы того, что предстоит реализовать, и опишем их псевдокодом:

Теперь превратим псевдокод в настоящий код без реализации. Для новых функций решим, что они принимают на вход и что возвращают. На этом этапе мы решаем, что делает каждый из шагов и где он должен жить: в форме, модели, утилитах или где-то ещё:

Теперь добавим аннотации типов, чтобы при реализации было точно понятно, что мы имели в виду:

Теперь нужно провести ревью этих функций: точно ли каждая из них всегда возвращает значение? Если нет — как быть: она вернёт None , выкинет исключение, что-то ещё? В нашем примере fetch_clinic_email_for_lists точно не всегда возвращает строку: емейла может не быть, клиники с указанным id может не существовать. Будем возвращать в этом случае None. Тут же обработаем этот случай в form_valid и подправим аннотацию. Заодно сделаем так, чтобы функции возвращали значения, которые согласуются и её аннотацией:

Теперь мы уверены в том, как будет разбит наш код и какое АПИ будет у его внутренних модулей. Самое время написать юнит-тесты на некоторые из этих модулей. Для примера ограничимся одним простеньким тестом:

Чтобы доделать исходную задачу, нам осталось реализовать четыре функции. Формально мы должны применить к каждой из них тот же алгоритм, что и для form_valid: подизайнить, придумать АПИ новых юнитов кода, потом реализовать. В реальности все функции довольно простые и атомарные: им вряд ли будут нужны дополнительные хелперы, их можно просто реализовать.

Главная особенность такого способа написания кода — явный этап дизайна кода. Вот чем он помогает:

Заставляет думать о переиспользуемости кода

“А не слишком ли много параметров у этой функции? А не слишком ли мало”, “Не лишняя ли эта функция?”, “Не делает ли эта функция слишком много?”, “Будет ли её удобно использовать в других местах?” — эти вопросы ведут к более классной структуре кода.

Теперь внутри процесса написания кода есть целый этап для того, чтобы задавать такие вопросы.

Делает структуру кода более модульной из коробки

Теперь написать трёхэкранную функцию не получится не потому, что flake8 её не пропустит (для этого есть flake8-functions), а потому что за несколько часов до написания этого кода автор уже разобьёт её на несколько функций поменьше.

Не связывает руки реализацией

Когда код уже написан, растаскивать его на модули может быть не просто как раз из-за реализации. Типа того:

Вот этот кусок хорошо бы вынести в отдельную функцию, но тогда её придётся параметризовать десятью переменными, а чтобы сделать количество аргументов правильным, придётся ещё порефакторить тут и тут, а это займёт… мда, придётся оставить так, а то не успею.

С одной стороны, у нас понимание того, как сделать правильно, с другой — реализация, которая часто тянет одеяло на себя. Приходится искать компромиссное решение, чтобы и за код совсем стыдно не было и в срок уложиться.

Такой проблемы нет, если реализации ещё нет. Тогда мы можем сразу построить правильную структуру кода и реализовывать уже её.

Органично дополняется типами и тестами

Если вы считаете, что “аннотации типов в Python — это неплохо, если использовать их с умом”, но не представляете, как и зачем воткнуть их в ваш процесс разработки, то вот отличный способ. Тут понятна и польза для проекта и польза для разработчика.

С юнит-тестами похожая история: разработка сверху вниз нативным образом позволяет разработчикам писать юнит-тесты. Не потому что “это часть DOD задачи” или “иначе покрытие упадёт и билд сломается”, а потому что это защищает от ошибок уже сейчас. Вот прямо сейчас. Прям в этой фиче. Сейчас. Now. Jetzt.

Юнит-тесты помогают делать дизайн проще

Представим два варианта одной функции: send_email_to_patient(patient: Patient) иsend_email_to_patient(email: str) .

Какая из них правильнее? Если под капотом нет сложной логики получения почты из пациента, то вторая: она меньше связана с системой и её легче переиспользовать.

А на какую из них проще писать тест? Тоже на вторую. В первой придётся использовать БД или мокать модель, создавать фейковых пациентов, а во второй — просто вызвать функцию с аргументом-строкой.

Чем проще АПИ функции, тем легче её тестировать. Поэтому, если я знаю, что через 10 минут мне предстоит покрывать эту функцию тестами, я выберу самое простое АПИ из возможных. Оно обычно и оказывается самым правильным.

Грамотное именование сущностей – мастхев

При разработке сверху вниз не получится сделать метод handle с аргументом data: я просто сам не вспомню, что имел в виду, когда сяду реализовывать эту функцию. Мне придётся лезть в код, который использует эту функцию, расчехлять pdb, запускать код… гемор.

Поэтому я сразу дам и методу и аргументу понятное название. Не из дальновидности или заботе о коллегах через год, а из-за старой доброй лени.

Дизайн часто воспринимается как что-то простое

Раскидать примерную структуру кода проще, чем его реализовать. В деревне Вилларибо писали сложную бизнес-логику, а в Виллабаджо — кучку определений функций без реализации. Понятное дело, что в Виллабаджо людям живётся легче.

Это помогает в борьбе со страхом чистого листа. Если впереди реализация большой и зубастой фичи, то начать может быть сложно, а вот “за полчасика прикинуть структуру кода” — изи.

А ещё первая итерация дизайна фичи делается на свежую голову, обычно утром, когда голова хорошо варит. Это важно потому, что несмотря на кажущуюся простоту этапа, он самый важный и ошибки в нём, скорее всего, потом будет дорого исправлять.

Позволяет лучше оценить, сколько осталось сделать

Вот вы посреди реализации фичи. Сколько осталось делать? Вы успеваете?

Обычно вам придётся вспомнить весь контекст, понять, что самая ебанина уже сделана, осталось вроде как несколько мелочей и вроде норм.

Если вы проектируете сверху вниз, то вы знаете, что уже реализовали 10 из 15 функций. Да, любая из пяти оставшихся может превратиться ещё в десять функций и да, реализация каждой функции не занимает одно и то же время. Но всё же согласитесь, что число — это приятно.

А вот какую пользу можно извлечь из разработки сверху вниз для процессов внутри команды:

Код разных людей становится более похожим

Если все разработчики в команде пишут код сверху вниз, то уже нет такого, что кто-то пишет простыни кода, а кто-то сразу бьёт их на функции. Это уже делает код разных людей более похожим.

А если процесс дизайна кода унифицирован и все знают хорошие и плохие практики при дизайне кода, код разных людей становится ещё более похожим.

Когда разработчики пишут похожий код, им его легче поддерживать, багов меньше и кодить приятнее.

Валидаторы кода не мешают, а помогают

Теперь flake8, mypy и прочая автоматизация не бьёт по рукам, когда не надо, а помогает писать правильный код.

Если у функции большая цикломатическая сложность — значит, например, что на этапе дизайна её стоило разбить на несколько поменьше. Теперь это не “валидатор не даёт мне готовую фичу задеплоить”, а “система сразу показала мне мой косяк получасовой давности и я тут же его поправил”.

Если у функции слишком сложная аннотация (да, можно мерить и такое: flake8-annotations-complexity), то это не “бля, да они заебали со своими линтерами”, это “значит, я тут неправильно код декомпозировал, хорошо что это сразу выяснилось”.

Дизайн можно парно программировать

Поскольку дизайн — это не про написание кода, а про его АПИ, предметную область, знание проекта и понимание задачи, его можно делать сообща даже если вы не привыкли к парному программированию.

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

В таком случае кроме более чистого кода мы способствуем распространению знаний в команде и не тратим на это много времени.

Дизайн можно отдельно ревьювить

Раз у нас есть такой артефакт, как верхнеуровневый дизайн кода, грамотное составление которого избавляет нас от кучи проблем, то можно и провести его ревью.

Такое ревью позволит убедиться, что разработка задачи движется в правильную сторону и укладывается в систему без ошибок. При этом такое ревью не занимает много времени.

Наконец, чтобы делать такое ревью, код без реализации нужно коммитить. Если помечать такие коммиты отдельным префиксом, это добавит больше структуры истории кода и позволит ретроспективно подробнее разобраться, почему было принято то или иное решение.

Реализацию дизайна можно аутсорсить другим

Раз уж мы закоммитили и сделали ревью верхнеуровневого дизайна, то можно отдать его реализацию другому разработчику.

В некоторых случаях можно отдавать разные части реализации разным разработчикам и уменьшить таким образом TTM.

В любом случае такая практика увеличивает среднее знание о системе у каждого разработчика.

Разработка сверху вниз позволяет не забывать о том, что разработка — это не только про код, но и про его структуру, модульность, тесты, типы, АПИ, семантику, читаемость, документацию и ещё про много что.

Для программиста такой метод разработки делает реализацию задачи более структурированной, понятной, простой и комфортной.

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

Разработка сверху вниз — не панацея, а просто ещё один инструмент, который применяется для своего круга задач. Например, он не всегда подходит, когда нужно дорабатывать существующий код, а не писать новый. Для исправления некоторых багов такой подход тоже не работает.

Если вы считаете, что я неправ и всё это брехня — пожалуйста, напишите мне об этом в Фейсбуке (http://fb.com/melevir). Хочу узнать ваше мнение.

Софт для программиста на каждый день — Блог HTML Academy

Программисты пишут код. Поэтому сходу кажется, что им для работы нужен только редактор кода. Пишешь, компилируешь, смотришь на результат. Если всё в порядке — отлично, не работает — надо исправить.

Но если спросить, чем программисты пользуются в работе, окажется, что всё не так просто. Нужны редактор кода, дебагер, консоль, система контроля версий, таск-трекер и много чего ещё, в зависимости от специализации. Например, верстальщикам нужны графические редакторы, а мобильным разработчикам — эмуляторы.

По большому счёту софт — это инструмент, который может подходить или не подходить для конкретной задачи. Как молоток для шурупов или отвёртка для открывания замков. Поэтому мы предложим несколько вариантов, а вы выбирайте сердцем, используйте с умом, но не относитесь к выбору слишком серьёзно. В конце концов, это просто компьютерные программы.

Редактор кода

Редактор кода — основной инструмент программиста и заодно машина по превращению знаний и опыта в продукт. Поэтому чем выше качество знаний, тем лучше получится продукт [источник?].

Старые программисты застали времена, когда целый сайт можно было сделать в блокноте, и вам даже ничего за это не было. Сейчас блокнотом не обойдёшься — потому что в редакторы кода встроено всё на свете. Подсветка кода, отладчики, автодополняторы, компиляторы и предпросмотрщики. Говорят, они даже варят кофе.

Из чего выбирать: Visual Studio Code, Atom, Sublime Text 3. Ну или в зависимости от языка и системы — кому-то нужны Visual Studio для C# или IntelliJ IDEA для Java.

  • Обзор редакторов кода
  • Как написать и запустить HTML на компьютере
  • 10 горячих клавиш VS Code, которые ускорят вашу работу
  • Консоль

    Консоль помогает быстро сделать рутинную работу и не отвлекаться на окошки и мышь. Команды в консоли — сила, соизмеримая с горячими клавишами по воздействию на мозг программиста. Говорят, что если научиться один раз, то потом по-другому уже не сможешь.

    Из чего выбирать: Git Bash, PowerShell, Bash, iTerm.

    • Работа с Git через консоль
    • Браузер

      В нём и сайты (если вы делаете сайты), и консоль разработчика (если вы делаете сайты), и GitHub, и Хабр, и блог HTML Academy.

      Из чего выбирать: хороший веб-разработчик проверяет сайт во всех браузерах, которые нужны клиенту. А Хабр и Пикабу везде выглядят одинаково, поэтому для личных целей пойдёт любой.

      Тест. Когда появились первые браузеры?

      Система контроля версий

      Программисты используют их, чтобы не потерять написанный код и не упустить никакие изменения. Особенно, если в команде работает несколько человек — нужно, чтобы всё было учтено и записано.

      Система контроля версий помогает хранить историю изменений кода и, если что-то пошло не так, быстро вернуться к прошлому состоянию.

      Из чего выбирать: Git, Subversion, Bazaar, тысячи их.

      • Введение в системы контроля версий
      • Как склеить коммиты и зачем это нужно
      • Таск-трекер

        Место, где собираются все задачи. Таск-трекерами пользуются не только программисты, это универсальный инструмент для всех. Но организовать работу без нормального списка задач бывает сложно — поэтому этот пункт и попал сюда.

        Из чего выбирать: Jira, Confluence, Trello, Asana, ClickUp.

        Дебагер

        Он же отладчик. Помогает найти и исправить ошибки в коде. Программисты, которые пишут для мобилок и десктопа, отлаживают код в своих IDE. Веб-разработчики — прямо в браузере, через инструменты разработчика и  плагины для браузеров.

        Из чего выбирать: Chrome DevTools, Firebug

почему всем нужно научиться писать код

Навык программирования может пригодиться не только тем, кто хочет создавать программы или сайты профессионально. О том, как умение писать код может облегчить жизнь, рассказал Илья Щуров, доцент кафедры высшей математики ВШЭ и преподаватель Центра непрерывного образования факультета компьютерных наук НИУ ВШЭ. T&P публикуют конспект его лекции «Программирование как новый английский, или Почему программирование не только для разработчиков».

Илья Щуров

доцент кафедры высшей математики ВШЭ и преподаватель Центра непрерывного образования факультета компьютерных наук НИУ ВШЭ

Можно придумать множество классификаций, но в первую очередь я бы разделил программирование на две большие категории: программирование для кого-то, когда вы пишете программу, которой будут пользоваться люди, и программирование для себя. Профессиональное программирование — это в основном деятельность для других, и я бы не сказал, что она всегда приятна. Вне зависимости от того, заплатили вам за программу или вы пишете свободный софт, которым может пользоваться кто угодно, огромное количество людей предъявит претензии, что у них что-то не работает, и их всегда будет больше, чем тех, кто вас похвалит. А программирование для себя — занятие очень приятное, и сегодня мы обсудим именно его.

Опрос профессиональных программистов этого года показал, что 81% из них программируют в качестве хобби. Это означает, что программирование доставляет удовольствие, что это не просто работа, но и развлечение. Вы можете пользоваться готовыми программами, и в 95% случаев вы будете это делать, даже если вы профессиональный программист. Но в любой области есть задачи, которые никто до вас не решал, и умение программировать позволяет решать их гораздо эффективнее. Однажды я был в call-центре, и меня попросили объединить две таблицы. Человек, который поручил мне эту задачу, ожидал, что я начну по одной копировать ячейки из первой таблицы во вторую. Я перенес пару записей, мне надоело, и я написал короткий скрипт, который брал данные из одной таблицы и вместо меня заполнял гугл-форму, что не очень сложно. Мне это понравилось, но больше всего мне понравилось то, что коллеги смотрели на меня так, будто я владею какой-то магией.

Писать код интересно, но, с другой стороны, это испытание. Ты взаимодействуешь с компьютером, и очень часто это взаимодействие, особенно если ты осваиваешь новую технологию, новый язык, выглядит так. Ты пишешь код, считаешь, что написал его верно, а компьютер говорит, что у тебя ошибка синтаксиса. Действительно, забыл точку с запятой, исправил, запустил заново. А компьютер говорит: «Закрой скобку». Через несколько таких итераций программа начинает работать, и становится ясно, кто в доме хозяин. Дело в том, что и у навыка программирования, и у процесса обучения ему есть некоторые побочные (в том числе положительные) эффекты.

1. Экстремальный опыт руководства

Компьютеры по сравнению с людьми очень глупые, они все понимают буквально, и если вы научились управлять машиной, то, скорее всего, вы справитесь с руководством любыми людьми.

2. Новый подход к информации

Вы начинаете по-другому смотреть на обработку информации, организацию информационных потоков и управления. Например, собирая массивы данных, вы уже задумываетесь, чтобы они были пригодны для последующей автоматической обработки. Это очень важно, если у вас большая организация или проект со множеством информационных потоков, с которыми нужно работать эффективно. Если у вас есть опыт автоматизации, вы довольно быстро поймете, в каком виде нужно получать информацию, чтобы потом ее ловко обрабатывать.

3. Профессиональная коммуникация

Если вы научитесь программировать хотя бы чуть-чуть, вам будет гораздо проще общаться с программистами. Полезно хотя бы на базовом уровне понимать, как устроен мир IT, и коммуницировать в этой сфере без посредников. Люди учат языки, чтобы лучше понять другую культуру, а языки программирования — технологии.

4. Ответственность

Почему уметь программировать может быть опасным? Первая причина — «тыжпрограммист». Если вдруг кто-то узнает, что вы умеете программировать, на вас начинают сыпаться запросы: «Переустанови мне операционную систему, пожалуйста, ты ж программист», «Почини чайник, ты ж программист» и так далее. Это не самая страшная проблема, есть пострашнее. Например, в 2001 году на первом курсе, когда интернет еще был медленным, я решил, что нужно сделать какую-то штуку, чтобы быстрее обмениваться информацией с друзьями. Я подумал: есть почта, и она работает. Тогда я завел отдельный почтовый ящик для нашей тусовки и написал скрипт. Робот заходил в этот ящик, брал письма, которые туда пришли, и пересылал их всем, кто был подписан на эту штуку. Так сейчас работают гугл-группы. Если я хотел написать всем, я отправлял письмо на этот общий ящик; если кто-то хотел ответить, он отвечал на него же, письмо попадало ко всем, и можно было что-то обсуждать.

Но у кого-то переполнился ящик, а когда ящик переполняется, почтовый сервер в ответ на любое письмо направляет отлуп, который тоже является письмом. Оно тоже попало в общий ящик, мой скрипт разослал его по всем адресам, в том числе и по тому, который переполнился. Почтовый сервер сгенерировал новый отлуп и так далее. В результате в воскресенье утром меня разбудил звонок моего друга, который аккуратно сказал: «Возможно, там какая-то проблема, потому что у меня в почтовом ящике 6 тысяч писем, и их количество увеличивается». Ничего особенно страшного не произошло, но это была проблема. Тогда я понял, что код легко может выйти из-под контроля и натворить бед, поэтому надо действовать аккуратно.

Это история как в «Маленьком принце»: вы в ответе за тех, кого приручили. Люди и процессы зависят от кода, который вы написали. То есть, как только вы делаете что-то полезное для других, цена ошибки возрастает.

Как научиться?

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

Противоположное мнение заключается в том, что если вы не программируете со школьных лет, то нечего и начинать. Это тоже неправда. Программирование требует усилий, но вход в эту область открыт, даже если вы никогда им не занимались.

Вполне вероятно, что задача, с которой вы столкнулись, уже решена и это решение где-то лежит. Иногда разобраться с тем, как оно работает, сложнее, чем написать заново. Это стандартная программистская проблема, но для этого у нас есть Stack Overflow, одно из главных изобретений человечества в сфере программирования. Это сайт, где разработчики делятся опытом и отвечают на вопросы друг друга. У каждого участника свой уровень репутации, все очень удачно спроектировано, поэтому на простые вопросы можно получить ответ в течение десяти секунд. Это очень помогает. В современном мире вы не просто пишете программу — вы одновременно используете огромное количество программ и инструментов, уже созданных другими людьми.

Хороший способ научиться программировать — поставить перед собой задачу, которой вам было бы интересно заниматься, и потом попытаться ее решить. Конечно, есть множество онлайн-курсов — почитайте отзывы, чтобы выбрать подходящий. Первый язык программирования — это сложно, потому что нужно перестраивать то, как вы взаимодействуете с компьютерами и анализируете процессы. Универсальных ответов нет, все очень индивидуально. Кому-то достаточно почитать документацию, посмотреть примеры кода, и все понятно. В другой ситуации хорошо иметь наставника, который ответил бы на базовые вопросы. Вот несколько советов, которые кажутся мне важными.

1. Самый лучший способ что-то понять — найти работающий кусок кода, начать его модифицировать и изучать, что получится. Это нужно сделать после того, как вы разобрались с базовым синтаксисом. Подгоняйте код под свои задачи или просто экспериментируйте.

2. Если вы только учитесь программированию, не нужно сразу пытаться писать много кода до тех пор, пока вы не сможете корректно объяснять, чего хотите. Это нужно для того, чтобы компьютер выполнял команды четко и маленькими шажками. Всякий раз ваши эксперименты должны заканчиваться не тем, что вы случайно наткнулись на правильное решение, а пониманием, почему и как это работает.

3. Не беспокойтесь по поводу математики. Желательно знать, что такое остаток от деления числа на другое число, но все зависит от задач, которые перед вами стоят. Конечно, если вы хотите хитро обрабатывать данные, то вам нужна математика в том объеме, который нужен для такой обработки.

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

Есть мнение, что на фоне развития искусственного интеллекта и машинного обучения программисты скоро будут не нужны: компьютеры сами научатся себя программировать. Но мне кажется, что это не так. До тех пор, пока есть задачи и пока нужно объяснять, как их решать, программирование будет существовать. Безусловно, программирование сильно эволюционирует, за последние 20 лет оно изменилось очень сильно. Но от того, что компьютеры стали умнее, разработчиков меньше не стало — наоборот, их стало гораздо больше. И мне кажется, что дальше будет происходить то же самое.

О прослушивании кода и мифическом «настоящем программировании»

Мы даже не знаем, сколько раз эта тема появлялась в электронных письмах, комментариях и личных сообщениях. Сегодня мы постараемся развеять все сомнения и ответить на следующие вопросы: Как не стать взломщиком кода? Когда ты "настоящий программист"? и есть ли шанс на это без учебы? Интересно наше мнение? Теперь мы начнем.

Учеба (не обязательно программирование)

У меня есть некоторые размышления об учебе.Начнем с самого начала - у меня нет обучения программированию (я изучал химическую технологию и менеджмент и технологию производства). Куба имеет инженера в области компьютерных наук и неоконченную степень магистра. Поскольку этот пост написан мной (Аней), я сосредоточусь на своем собственном опыте.

Во-первых, я несколько лет назад закончил химию и никогда не работал по этой специальности. Тем не менее, эти исследования были требовательными и очень обширными. Мои друзья, оставшиеся в индустрии, прямо говорили, что им приходится всему с нуля учиться на работе (точнее).Сегодня я могу сослаться на свои химические знания - поскольку они не использовались ежедневно, я мало что помню, и даже умеренно сложная задача по термодинамике или физической химии сегодня была бы проблемой. Однако я бы знал, с чего начать искать нужную мне информацию, и, скорее всего, изучив некоторые вещи с нуля, я бы смог их решить.

Мои инженерные исследования были сосредоточены на демонстрации всего спектра химии и представлении основ.Только недавно семестр показал нам более специализированные вещи. На самом деле, для полного их понимания стоило знать эти основы, но для того, чтобы, например, выполнить специализированный инструментальный анализ пробы, нужны были конкретные знания о том или ином методе измерения или конкретных веществах, которые необходимо было обнаружить. гораздо полезнее. Поэтому перед каждой лабораторией нам приходилось тщательно готовиться к выполняемому упражнению. Я не знаю человека, который не узнал бы ни о новом аналитическом методе, ни о конкретных веществах, которые мы будем узнавать.Даже лучшие ученики должны были/хотели повторить это перед классом.

В году были разные люди. Некоторые из них действительно открыли для себя химию как свое призвание благодаря учебе, другие знали ее намного раньше, а многие из них... просто учились. Итак, у нас были люди, заинтересованные в предмете, заинтересованные в хороших оценках и заинтересованные в сдаче экзаменов. Каждая из этих групп подошла к обучению по-своему. Каждый закончил с совершенно разным уровнем знаний...

Могу добавить еще одну историю из моей аспирантуры.У нас был механический отдел в рамках производственных технологий. Среди людей, с которыми я тогда тусовался, не было никого, кто обладал бы значительными знаниями в этой области (все мы сменили направление после инженерного образования). У одного из моих друзей был дядя, который профессионально работал на станке с ЧПУ. Она попросила его помочь с проектом. Его конструкция, признанная технологически правильной на основе этих консультаций, получила плохую оценку. Наводящие замечания девушка передала дяде.Он рассмеялся и заявил, что его завод давно бы обанкротился, если бы он позволил себе такие потери в обработке материала и количество операций, которые усложнили бы процесс. Практика должна выполняться дешево и с уважением к сырью.

Что следует из этих размышлений? Никакие исследования не сделают из вас волшебника, эксперта, специалиста. Неиспользованные знания быстро испаряются из головы. Никто не будет учиться за вас, и его прохождение не гарантирует, что вы знаете и понимаете тему.Зачастую то, что работает в лаборатории или передается в университет, слишком оторвано от рынка и современных практик. Конечно, учеба также может помочь. Прежде всего, в поиске своей области, ознакомлении с определенным спектром важных тем или просто в приобретении друзей, которые окупятся в будущем. Однако сам по себе диплом ничего не гарантирует.

Нажатие кода

Что вообще значит погладить код? Для меня это бездумно программировать, не понимая.Очень простые задания, не требующие усилий, размышлений…

А теперь давайте на минутку задумаемся, от чего зависит, будут ли у программиста такие задачи... Прежде всего, дизайн, потому что иногда проекты сопровождения могут просто рассчитывать на такие незначительные модификации - с другой стороны, если вы присоединитесь к проекту, который уже в производстве несколько лет, то же ознакомление с существующим кодом может быть проблемой. Тем не менее, в «неинтересном проекте» легче найти неинтересные задачи.

В проекте Scrum команда отвечает за разделение задач. И я бы сказал, что вне зависимости от должности или многолетнего опыта это решение принимается. Что важнее, так это приверженность делу, желание учиться, прогресс, достигнутый в рамках проекта, или наличие у вас времени в данный момент. Я никогда не был в ситуации, когда задачи делились на легкие и сложные и распределялись по должности/образованию/полу и т.д. Дело в том, что иногда внутри компании, например, чтобы изменить проект, нужно узнать о заданной технологии или познакомиться с конкретными аспектами бизнеса.Однако это не тайное, недоступное или непроницаемое знание.

Все в ваших руках. Свобода и опыт, конечно, придут со временем и окупятся упорным трудом, но благодаря ему и вашему развитию вы сможете решать все более и более сложные задачи, а также находить более интересные стороны этих простых «обезьяньих хлопот». " задачи.

Выбор кода — выбор программиста. Возможно, он боится, еще не уверен в своих силах, не хочет менять ни проект, ни компанию.Он не хочет брать на себя ответственность за себя, свою разработку и код. Предпочитает пассивно ждать выполнения заданий. Он предпочитает жаловаться, или ему просто нравится то, что он делает (что тоже нормально, не каждый должен быть гуру программирования, и во многих случаях достаточно хорошо).

Не хотите погладить код? Учитесь, развивайтесь. Спрашивайте, задавайте вопросы. Попробуйте разобраться в проблеме, ищите пути решения самостоятельно. Быть инициативным. Если ваша задача повторяется и утомительна, вы, скорее всего, можете автоматизировать ее.Требуйте задач, которые бросят вам вызов и подтолкнут вас к развитию. Нести ответственность не только за конечный результат, но и за весь процесс определения User Story.

"Настоящий код" для "Настоящего программиста"

Внимание, открою секрет. Он не существует. И по крайней мере не из вашей IDE и того, что вы в ней печатаете.…

Все, что мы производим, — это не искусство ради искусства, а то, что в конечном итоге отвечает потребностям пользователя. Настоящий код — это когда он приносит пользу бизнесу, он окупается.

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

И хотя сферы интересов разные, каждая из них одинаково интересна и неинтересна одновременно. Потому что только ВАШИ увлеченность, увлеченность, обучение и опыт определяют, будете ли вы удовлетворены тем, что делаете, и будет ли ваша работа для вас настоящей страстью или простым прослушиванием кода.

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

И, в конце концов, все! Для удовлетворения бизнеса и вашего собственного удовлетворения. И, конечно же, чтобы быть архитектором, техлидом или полевым экспертом, нужны знания и несколько лет разнообразного опыта.Достижение этого уровня, однако, означает: «просто, но не легко» и означает упорную и настойчивую работу над своими навыками.

.

Хороший код, какой какой? - ИТ-блог и подбор ИТ-специалистов

Из этого поста вы узнаете:

  • что такое качественный код?
  • каковы его характеристики?
  • Как отличить профессионального программиста от любителя?

Каждый профессиональный разработчик знает, что написание работающего исходного кода — это только полдела. Созданный сценарий, скорее всего, будет прочитан и разработан другими людьми в будущем.Какой программист никогда не чувствовал себя ребенком в тумане, модифицируя чужое приложение? Вот почему код хорошего качества является ключевым вопросом в ИТ-индустрии. Но что это значит? Вот наиболее важные особенности, позволяющие отличить хороший код от плохого.

Читабельность

Программисты большую часть времени читают, а не пишут исходный код. Добавление даже небольшого фрагмента в существующий проект требует прочтения нескольких-десятка строк кода.Чем меньше вы их понимаете, тем больше времени требуется, чтобы написать что-то новое. Это одна из причин, по которой удобочитаемость — одна из важнейших характеристик хорошего кода. Используя соответствующие отступы, пробелы и в комментариях, объясняя причины, по которым код написан именно так, а не иначе , программист облегчает работу не только другим, но и себе.

Гибкость

Простота модификации при необходимости — еще одна особенность хорошего кода.Это облегчает разработчикам определение строк кода, которые необходимо изменить, чтобы приложение функционировало должным образом. Хорошая модифицируемость значительно ускоряет время внесения исправлений и устранения возможных побочных эффектов.

Эффективность

Эффективность означает, что написанный код выполняет ожидаемые задачи быстро и надежно. Запущенные через него приложения не только запускаются сразу и надежно, но и быстро реагируют на команды, отдаваемые пользователями.

Непротиворечивость

Чистый код также включает согласованность при его создании. При выборе одного метода программирования в начале или использовании соглашений, преобладающих в данной среде, разработчик должен последовательно придерживаться их до самого конца. Помимо эстетических соображений, этот сценарий легче понять людям, которые его просматривают.

Тестируемость

Вопрос тестируемости кода имеет решающее значение с точки зрения правильной работы приложения, а также удовлетворенности конечных пользователей.Что это означает? Это не что иное, как соответствующая структура, значительно облегчающая автоматическое тестирование, уменьшающая количество ошибок и позволяющая быстрее реагировать на изменяющиеся требования.

Плохое качество программирования не только затрудняет работу всех, кто будет заниматься кодом, но и влияет на работу приложения. Вот почему так важно применять высокие стандарты в этом вопросе. К ним стоит привыкнуть с самого начала вашего пути программирования.

.

Чистый код - 15 шагов к созданию чистого кода

Каждый программист знает, сколько проблем и разочарований может быть вызвано небрежно написанным кодом. Однако не все знают, как написать чистый код и как он должен выглядеть на самом деле. Эта статья обязательна для всех, кто хочет изучить методы надежного и эффективного программирования.

Введение

Наверное, каждый программист сталкивался с грязным кодом, тратой уймы времени на то, чтобы разобраться с непонятными именами переменных, запутанной структурой программы и скрытым поведением методов.Такой беспорядок замедляет вашу работу, создает разочарование и, в некотором смысле, пугает вас, чтобы вносить какие-либо изменения. Все это значительно удорожает производство программного обеспечения. Каждая новая функциональность, модификация системы требует понимания этих запутанных, загадочных ветвей, что отнимает у разработчика много времени. Изменения в плохом коде могут привести к ошибкам в других частях кода, которые потребуют повторного анализа и, в конечном итоге, исправления ошибок. Это классический пример регрессии: то, что раньше работало, вдруг перестало работать.Обычно беспорядок создает еще больший беспорядок, который значительно снижает эффективность команды и со временем становится невозможным «навести порядок». Как следствие, корявый код приводит к апатии проекта и, в худшем случае, к краху компании. Также читайте статью о самых популярных языках программирования.

Для чего создан этот код?

Это может быть из-за незнания чистого кода, отсутствия понимания того, что вызывает плохой код, отсутствия опыта программиста, который видит код неаккуратным - осознает последствия, но понятия не имеет, как исправить Это.Это можно сравнить с рисованием картины. Большинство людей могут сказать, красивая картина или уродливая, но это не значит, что они умеют рисовать. Спешка, сроки и давление со стороны руководства, вероятно, являются следующими наиболее распространенными причинами беспорядка в коде. К сожалению, это ловушка, в которую довольно часто попадают программисты, потому что нельзя уложиться в сроки, написав неправильный код. Профессиональный программист прекрасно знает, что беспорядок в коде сразу замедляет его работу, а это в значительной степени вызывает перерасход. Чистый код — это главный путь к успеху , соблюдение сроков, поддержка качественного программного обеспечения и, прежде всего, быстрая разработка приложений. Программист должен защищать код так же страстно, как босс защищает расписание.

Как определить, что мой код запутан?

Наиболее распространенный показатель, показывающий, является ли код плохим, — это количество WTF, произносимых в минуту при его чтении. Чем больше WTF, тем более грязный код.Дополнительно могут помочь различные инструменты, такие как Sonarqube , которые на основе автоматического статического анализа кода и заданных правил могут наглядно показать недостатки и нечистоты в коде. Однако это машины, которые должны, конечно, давать обратную связь программисту в первую очередь, но лучшая оценка кода — это оценка других опытных программистов, которые «чувствуют код», знают и умеют применять правила чистого кода и съели зубы не на одном приложении.

Что такое чистый код?

Вероятно, у каждого программиста есть четкое определение кода, но я думаю, что идея должна быть такой же. Чистый код должен быть:

  • читаемым, самокомментирующим, упорядоченным. Ее часто сравнивают с хорошей статьей. Есть введение, которое дает общее представление о том, о чем эта статья, есть наводящие на размышления, понятные заголовки с несколькими абзацами, которые разделяют мысли и темы таким образом, чтобы статью было приятно читать.Переводя это в код, заголовки — это классы, абзацы — методы, а предложения — инструкции,
  • просты в реализации, короткие, без секретных приемов, не дающих никакой ценности,
  • проверены — все тесты должны пройти правильно,
  • сплошные — пробуждают доверие, интуитивно понятен, отвечает принципам SOLID.

Как писать чистый код?

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

Ниже я представляю 15 основных правил как писать чистый код:

1. Описательные имена

Имена переменных, методов и классов должны быть описательными, они должны представлять намерения, сообщать, для какой цели они существуют, что они делают , как они используются.

Ниже приведен пример нечитаемого кода.Появляются магические числа (0, 1), бессмысленные названия (l, PTLights, m1). Кроме того, имя переменной вносит дезинформацию, поскольку буква L в нижнем регистре очень похожа на цифру 1.

Использование магических чисел в константах и ​​ввод соответствующих имен классов, полей и методов значительно улучшает читаемость. Пример решения:

2. Имена на соответствующем уровне абстракции

Имена могут быть описательными, но могут говорить слишком мало или слишком много на определенном уровне абстракции.Например:

По переменной csvPath видно, что это путь к CSV файлу, но возникают вопросы, можно ли сжимать только CSV файлы? Можно ли сжимать файлы только в формат ZIP? Такие имена ограничивают использование этого метода сжатием файлов CSV только в формате ZIP. Это правда, что это ограничение только на уровне контекста, но это означает, что метод может использоваться реже. Кроме того, очень похожие методы могут возникнуть для сжатия других файлов в других форматах.В этом случае лучшим именем метода будет сжатие и путь к файлу.

3. Имена должны описывать побочные эффекты

Имя должно описывать, что делает метод, переменная или класс. Например, если функция ищет объект и в случае ненахождения создает новый, лучше использовать имя findOrCreate, а не просто найти.

4. Комментарии не должны существовать

Обычно, когда вы пишете комментарии в своем коде, причины имен переменных, методов и классов неразборчивы или неверны.Вместо того, чтобы их создавать, лучше потратить время на выбор правильных названий. Если написание комментария действительно уместно, напишите его хорошо. Оно должно быть кратким, грамматически правильным, с тщательно подобранными словами.

5. Закомментированный код следует удалить

Закомментированный код вызывает много вопросов у читателя, в общем засоряет весь код и мешает читать. Чем дольше он существует, тем больше он ломается и теряет свою актуальность. Кроме того, не исключено, что никто его не удалит, потому что не будет знать, существенное оно или нет, нужно ли оно кому-то и есть ли на это какие-то планы.Закомментированный код всегда следует удалять.

6. Отформатируйте код согласно правилам команды

При работе в команде не применяйте свои любимые правила форматирования. Команда разработчиков должна выбрать один стиль форматирования, и каждый должен адаптироваться к нему. Код должен быть последовательным, он должен внушать читателю уверенность в том, что форматирование в одном исходном файле означает то же самое в другом.

7. Функции должны быть маленькими за один шаг

Размер функции можно измерить количеством строк, из которых она состоит.Чем больше строк, тем нечитаемее функция и тем сложнее понять ее работу. Маленькие функции — это те, которые состоят максимум из 20 строк и выполняют только одну операцию. Если строк больше, функция, вероятно, делает больше.

Приведенный выше код не длинный, но вы можете видеть, что он выполняет несколько действий: загружает отношения, удаляет все отношения, регистрирует информацию об удалении отношений и удаляет автомобиль. Это можно исправить следующим образом:

В этом случае также легко показать, что функция выполняет три действия, но обратите внимание, что эти три шага находятся на один уровень абстракции ниже объявленного имени функции, и это доказывает, что функция выполняет только одну операцию.

8. Минимальное количество аргументов функции

Аргументы функции громоздки и затрудняют понимание функции. Лучше всего строить функции без аргументов, затем унарные и бинарные функции. Следует избегать функций с тремя аргументами и не следует использовать функции с несколькими аргументами (более 3 аргументов). Например, writeText (текст) легче понять, чем writeText (outputStream, text). В этой ситуации аргумент outputStream можно удалить, определив его как поле класса.Когда функции требуется несколько аргументов, вы, вероятно, можете поместить некоторые из них в отдельный класс. Например:

можно перезаписать

9. Функции не должны возвращать null

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

вместо возврата null в методе getCars() лучше вернуть пустой список...

10. Разделение команд и запросов

Функция должна выполнить команду или ответь на вопрос. Ей не следует делать эти две операции одновременно, так как это часто приводит к путанице. Например, следующая функция:

устанавливает значение данного атрибута и возвращает true в случае успеха и false, если такой атрибут не существует.Отсюда появляются странные инструкции вида:

Возникает вопрос, а что именно делает эта функция? Проверяет ли он, был ли атрибут «название» ранее установлен на «Чистый код»? Удалось ли установить значение «Чистый код» в атрибуте «название»? В этом случае слово «установить» может быть глаголом или прилагательным, что затрудняет вывод смысла из вызова этого метода.

Решение этой головоломки состоит в том, чтобы отделить команду от запроса, чтобы не было двусмысленности.

11. DRY (Не повторяйтесь)

Правило DRY рекомендует избегать всех видов повторений, выполняемых программистами во время разработки программного обеспечения. Когда речь идет о коде, речь идет о том, чтобы не вставлять или не писать одинаковые или очень похожие фрагменты кода в разных местах. Такое дублирование кода вызывает его рост, требует одинаковых доработок в нескольких местах в случае каких-либо изменений алгоритма, а это, в свою очередь, увеличивает возможность совершения ошибки.

Самое простое решение дублирования кода — вынести его в отдельный метод. В некоторых случаях помогает использование полиморфизма или шаблонов проектирования, таких как шаблон метода или стратегия.

12. Обработка ошибок должна быть одной операцией

Обработка ошибок является одной операцией, и в соответствии с принципом единой ответственности функция обработки ошибок не должна делать ничего другого. Это означает, что ключевое слово try должно быть первым словом в функции, а в нее не должно входить ничего, кроме catch и finally.

Неверный код:

Пересмотренный код:

13. Классы должны иметь одну обязанность

Согласно Принципу единой ответственности (SRP), у класса должна быть только одна причина для изменения. Если класс отвечает более чем за одну область в нашем приложении, это может вызвать проблемы в будущем, т.е. внося изменения в одну область, вы можете сломать что-то в другой области, которая кажется несвязанной.

В приведенном выше примере класс FileCompressor имеет несколько функций.Во-первых, он сжимает файл, во-вторых, создает каталог. Для того, чтобы FileCompressor соответствовал принципу SRP, его необходимо вынести в отдельный класс с помощью метода createDirectory, например, DirectoryCreator.

14. Инкапсуляция — переменные и вспомогательные функции остаются закрытыми

Чаще всего переменные и вспомогательные функции в классах должны быть закрытыми. Такое сокрытие доступа к другим классам делает рефакторинг более безопасным, а изменение состояния объекта полностью контролируемым. Иногда область действия переменных или функций изменяется на защищенную или включается в пакет.Это в основном вынуждается тестами, когда тесту нужно вызвать такую ​​функцию или обратиться к переменной. Тем не менее, вы должны сначала найти способ сохранить конфиденциальность.

15. Консистентность класса должна быть высокой

Класс, в котором каждая переменная экземпляра используется в каждом методе, максимально согласован. Обычно такие классы создать невозможно, но согласованность должна быть высокой. В результате методы и переменные класса взаимозависимы и образуют логическое целое.

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

Класс Engine имеет поле передачи, которое используется только двумя методами shiftGearUp и shiftGearDown. Благодаря этому наблюдению мы можем создать новый класс Gearbox и, таким образом, получить высокую согласованность классов Engine и Gearbox.Кроме того, на эти классы была возложена одна обязанность.

Резюме

Чистый код — это основа хорошего приложения, которое легко поддерживать и расширять за счет новых функций. Написание чистого кода требует знаний, практики и уверенности в себе, а представленные здесь принципы — лишь капля в море правил чистого кода. Однако их использование — это первый шаг к повышению качества и удобочитаемости нашего кода:

  1. Выбор описательных имен для классов, функций и переменных
  2. Имена должны быть на соответствующем уровне абстракции
  3. Имена должны описывать побочные эффекты
  4. Не использовать комментарии.Код должен быть самоописывающим
  5. Код с комментариями должен быть удален
  6. Форматирование кода должно соответствовать правилам, принятым в сборке
  7. Функции должны быть небольшими в один шаг
  8. Функции должны принимать до 3-х аргументов. Чем меньше, тем лучше
  9. Функции не должны возвращать null
  10. Функции должны либо выполнять команду, либо отвечать на вопрос
  11. Применять принцип DRY
  12. Обработка ошибок должна быть одной операцией
  13. Классы должны иметь одну ответственность
  14. Переменные и служебные функции должен быть закрытым
  15. Консистентность класса должна быть высокой
  16. Код должен быть покрыт модульными тестами
  17. Объектно-ориентированное программирование должно соответствовать предположениям SOLID

Также приглашаем вас на вдохновляющую беседу «Из программирования на первую линию поддержки».

.

Почему стоит писать документацию? - Программисты молодцы!

Так что помните, что одной из причин создания документации является написать для себя .

Во-вторых, вы хотите, чтобы ваш проект использовали и другие…

Пользовательская документация чрезвычайно важна! Если вы хотите, чтобы кто-то использовал вашу работу, они должны знать, как это сделать. Теперь подумайте о настольных играх — авторы игр пишут отличные инструкции, чтобы каждый, кто инвестирует в их игру, мог прочитать и понять, что происходит.И ваш проект разработки также должен предоставлять пользователям не менее четкие инструкции.

Хорошо написанная пользовательская документация также экономит ваше время , потому что вам не нужно повторно отвечать на одни и те же вопросы от запутавшихся пользователей. Вы просто отсылаете их к соответствующему месту в документации для получения всей информации, советов и примеров.

Третье - вы же не хотите навсегда остаться одиноким программистским волком...

Программные проекты имеют следующую характеристику: чем больше, тем больше рук вам нужно для их поддержки и развития.Работая в компании по разработке программного обеспечения, вы, вероятно, будете работать в группе людей. И да — есть большая вероятность, что вы разобьёте один проект на более мелкие части и будете заниматься чем-то совершенно другим, чем ваш напарник или коллега, но почти наверняка в какой-то момент вам придётся работать вместе. И для таких ситуаций хорошо иметь внутреннюю документацию , т.е. такую, которая кратко проведет других программистов по самому проекту и наиболее важным проектным решениям, принятым до сих пор, и позволит им быстро реализовать тему и начать продуктивно работать.

В-четвертых - потому что вы хотите развиваться!

Быть "хакером кода" очень приятно, но это только начало карьеры программиста. Следующим этапом является работа так называемого Tech Leada (или Team Leada), т.е. быть лидером команды разработчиков. Многие TL часто попадают в ловушку - они все еще пытаются писать код, пытаясь охватить команду "первокурсников", то есть программистов на более ранней стадии своей карьеры, которые имеют меньше опыта и часто нуждаются в помощи при выполнении своих обязанностей.Вот тогда и выясняется, что TL не может разделиться — и со всеми их знаниями в голове, команда не может двигаться дальше без помощи своего лидера.

Поэтому хорошо документировать свои проекты, дизайнерские решения и даже часто задаваемые вопросы, потому что благодаря этому вы экономите свое время, вы также экономите время своей команды , вы позволяете пользователям в полной мере использовать инструменты, которые вы создаете , и вы поддерживаете собственную разработку , делая вашу команду не на 100% зависимой от вас!

Как писать документацию - или как это сделать, чтобы не прогореть?

Мы уже знаем, что написание документации важно, но я также писал о том, что это одна из самых нелюбимых задач среди программистов.Итак, как вы подходите к написанию документации, чтобы это стало удовольствием?

.

Смотрите также

Только новые статьи

Введите свой e-mail

Видео-курс

Blender для новичков

Ваше имя:Ваш E-Mail: