Сосредоточение внимания во время автоматических процессов, «Это компиляция»

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

Оправдание программиста № 1 за то, что он законно бездельничает: мой код компилируется.  Из xkcd 303 Рэндалла Манро на https://creativecommons.org/licenses/by-nc/2.5/

[комикс xkcd 303 Рэндалла Манро]

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

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

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

Как я могу оставаться продуктивным?

Редактировать:

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

Обновлять:

Я взял из множества предложенных ответов, и ни один из них не является «правильным», поскольку все они предлагают разные идеи и мнения. Есть отличные способы ускорить компиляцию, но, к сожалению, ни один из них мне не подходит. Я работаю на быстрой системе с двумя ssd, но узким местом является то, что я работаю на Android, который должен загружаться через USB. Так как компиляцию нельзя ускорить, мне придется продолжать свой рабочий процесс по-другому.

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

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

Что, на мой взгляд, имело самое большое изменение, так это то, что не упоминалось в этой ветке, поскольку я не предоставил конкретных деталей для ответа, подобного этому. Проходя мой процесс снова и фактически замеряя время компиляции (оказывается 1 минута 15), я понял, что самая большая проблема заключалась в том, что я фактически ничего не мог сделать во время компиляции. Visual Studio имеет неприятную привычку блокировать ваши файлы... Итак, благодаря https://stackoverflow.com/questions/3123624/visual-studio-locking-files-while-debugging мне удалось это изменить, и я могу скажем, очень помогает возможность прикасаться к коду во время его выполнения.

Большое спасибо всем, кто ответил, мне стало намного легче сохранять концентрацию по 8 часов в день.

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

Комментарии не для расширенного обсуждения; этот разговор был перемещен в чат .
Вопрос был защищен, поэтому я не могу добавить новый ответ, но я думаю, что есть лучший ответ, чем те, которые уже даны: лучше используйте модульные тесты. Вы можете создать класс и протестировать его поведение в модульных тестах, которые можно запустить в вашей среде IDE. Вероятно, это также позволит вам запустить один конкретный модульный тест, чтобы проверить, исправили ли его ваши изменения. Таким образом, вам придется развертывать его реже.
Забавно - я попал сюда, пока мой латексный документ компилировался...
...But the bottle neck is that I'm working on Android, which has to upload via an USB. So as the compiling can't be sped up...- Тогда вашим узким местом является не этап компиляции. Это шаг загрузки .

Ответы (14)

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

  1. Купите SSD .
  2. Добавьте больше оперативной памяти.
  3. Если вы разрабатываете веб-приложение: используйте браузер для горячей перезагрузки кода на стороне клиента.
  4. При разработке создавайте только те части кодовой базы, которые изменяются.
  5. Изучите код сборки и на локальном компьютере замкните сборку, чтобы она строила только изменяемые части кодовой базы.
  6. Рассмотрите возможность запуска автоматических модульных тестов только перед регистрацией.
  7. Сотрудничайте с членами команды и менеджерами, чтобы навсегда сократить время сборки.

Подробнее о № 1 и № 2: они особенно эффективны. Вы должны делать это, даже если вам нужно тратить деньги из собственного кармана, потому что это повысит вашу общую удовлетворенность работой. Хороший плотник не потерпит тупой пилы, а вы не должны мириться с медленным жестким диском или рабочей станцией с недостаточным объемом оперативной памяти. Вы хотите быть дома ночью, ужинать с семьей или смотреть Netflix. Вы не хотите страдать от жалкой «смерти от тысячи порезов», ожидая медленных сборок.


РЕДАКТИРОВАТЬ:

  1. Тем людям, которые сказали, что я не ответил на вопрос ОП: рассмотрите этот мета-ответ .
  2. Медленная сборка может повредить рабочему месту. Очень важно изучить все варианты, прежде чем смириться с тем, что сборка выполняется медленно.
Комментарии не для расширенного обсуждения; этот разговор был перемещен в чат .
Я бы также добавил, глядя на другие инструменты. Я помню, как мне приходилось работать с Sharepoint, и мне потребовалось 15 минут, чтобы развернуть и протестировать изменение JavaScript! В конце концов я использовал Fiddler для перенаправления вызовов JS-файлов на локально сохраненные файлы, которые я мог быстро изменить.
Могу подтвердить. У меня была старая установка в течение довольно долгого времени, и это действительно усугубляло ситуацию. После получения одного с большим объемом оперативной памяти работа стала намного лучше, чем раньше.
Также проверьте свою программу проверки на вирусы и посмотрите, насколько она замедляет сборку. При необходимости измените средство проверки на вирусы.
Просто чтобы добавить к # 1 и # 2, если у вас достаточно оперативной памяти для этого, возможно, стоит подумать о том, чтобы поместить всю свою разработку на RAM-диск (много ресурсов о том, как сделать его в вашей системе), просто убедитесь, что у вас есть что-то для поддержки он включается каждые пару минут в случае отключения питания, неожиданного отключения и т. д. Я сам использовал это с большим эффектом, поместив в него всю свою среду разработки (экземпляр Java, ant, eclipse, исходный код и т. д.)

Бой на мечах — отличное упражнение. Используй это.

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

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

  • Отвечать на электронные письма
  • Документ Билеты
  • Заявка на документ
  • Примите участие в SCM, если можете
  • Сделайте законный перерыв.
  • Обработка других несвязанных задач кода
  • проводить встречи с членами команды
  • Вздремнуть

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

Например, в .NET вы можете разделить большие фрагменты логики на библиотеки DLL. Тогда вам нужно только часто компилировать участки кода.

Вы также можете посмотреть параметры компилятора и выбрать параметры, которые «прерывают работу после первой ошибки».

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

Вы должны прочитать о том, как плохо переключаться между задачами снова и снова для продуктивности. Такие вещи действительно не работают. Он еще больше потеряет в продуктивности и будет больше нервничать
Что ж, когда я впервые прочитал вопрос, я предположил, что от 30 минут до часа - это долгая сборка. Если у вас есть полчаса, чтобы убить, пока вы ждете компилятора, то лучше всего заполнить его хотя бы полусмежными задачами. Если вы говорите о 30 секундах... Что ж, это самое подходящее время, чтобы сделать какое-нибудь упражнение для напряжения глаз или пальцев. Там легко и быстро, и КРАЙНЕ важно.
Ну тогда я с этим согласен.
Рассмотрите возможность добавления пункта: «Проверьте список вопросов о сети StackExchange Hot Network » ;-)
@DigitalTrauma Это должно быть один из худших советов по продуктивности;) Почти так же плохо, как «прочитать статью в Википедии и постараться не переходить ни по каким ссылкам» (так никогда не работает).
Из-за накладных расходов на переключение контекста и ограниченного пространства в мысленном стеке попытки заглушить постороннюю работу во время этого ожидания, вероятно, менее продуктивны, чем смотреть в потолок.
@NathanCooper Упражнения для пальцев или упражнения на напряжение глаз не требуют особых умственных способностей. Особенно, если вы привыкнете их делать. "F5" 1-2-3-4-5 1-2-3-4-5 Проверить сборку. Код код код. "F5" 1-2-3-4-5 1-2-3-4-5 Проверить сборку. И это гораздо меньше накладных расходов, чем напряжение глаз или RSI.
Я читаю это, пока что-то устанавливается, но это было сделано несколько минут назад :)
Я думаю, что исследование Microsoft показало, что ответы на электронные письма стоят 30 минут продуктивной работы? Этот ответ является активно вредным советом, я не знаю, почему 14 человек проголосовали за комментарий, предлагающий столько же, но не проголосовали против ответа.
30 секунд прямо в плохой долине. Слишком долго, чтобы оставаться сосредоточенным, если вам приходится очень часто строить, но слишком мало, чтобы переключиться на что-то другое.
«Перейти к SCM, если сможете» до завершения сборки?
@StuperUser Возможно, зависит от языка, SCM и вашего игнорирования. Вы не проверяете двоичные объекты, так почему бы не зафиксировать? Если вы в функциональной ветке совершаете столько ошибок, сколько хотите, некоторые из лучших идей исходят из ошибок. Вы будете объединять/раздавливать перед тем, как слиться с основной/главной веткой, верно? Дело в том, что каждая установка отличается. Нет никаких причин, по которым вы не можете совершить коммит во время сборки, если вы находитесь в среде, которая его поддерживает.

Кое-что из собственного опыта:

Попробуйте исправить сразу несколько ошибок.

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

Например, вы можете уменьшить количество циклов, проверив другие вещи:

  • По крайней мере, столбцы отформатированы правильно?
  • Содержат ли все остальные столбцы то, что должны?
  • ...

Это особенно важно в первых 1 или 2 циклах и может помочь вам вернуться с 15 к 5 задержкам по 30 секунд (и, возможно, к лучшему результату).

О, чувак, это так критично. Мы так много внимания уделяем сокращению времени цикла... Общее время = время цикла * количество циклов. Сокращение количества циклов так же важно, как и сокращение времени цикла!!
Я думаю, что это упускает из виду стоимость исправления слишком многих вещей в одном цикле — это очень затрудняет изолирование влияния отдельных изменений. Вот почему так много внимания уделяется времени цикла — сокращение количества циклов приводит к другим пагубным последствиям.
@Dancrumb Это не обязательно, если вам удастся исправить, особенно на этапе, когда все «построено» и вы тестируете. Во время тестирования составьте хороший список всех проблем, которые вам нужно исправить. Постарайтесь выяснить, что вам нужно исправить, чтобы потом не прибегать к пробам и ошибкам. Тестируйте как можно больше новой/исправленной функциональности. Затем убейте программу, зайдите в свою IDE и исправьте все это. Отметьте в списке, какие из них вы исправили. Затем сделайте свою сборку и протестируйте все свои исправления - зачеркните, когда закончите. Таким образом, вы можете легко делать циклы из 10-20 исправлений за раз, прежде чем вам придется перестраивать.
Это то, что я делаю. Точнее, я стараюсь работать над двумя независимыми вопросами одновременно. Я буду работать над задачей № 1, нажимаю «Компилировать», переключаюсь на задачу № 2, которая является электронной почтой, или другой кодовой базой. Затем вернитесь к задаче № 1, проверьте и повторите.
На самом деле, при времени сборки 30 секунд это не имеет большого значения. В худшем случае вы начнете компилировать и перепроверите код тем временем, если вы ничего не нашли, вы сэкономили 30 секунд. В любом случае, слишком много думать о коде в течение 30 секунд просто не стоит.
Вам всегда придется тестировать то, что вы делаете. В противном случае вы можете создать ошибки или другие сбои, которые может быть трудно исправить, потому что вы не знаете, какие из ваших изменений вызвали эту ошибку.
Пропустил тот. Это не так хорошо, как фактическое сокращение времени компиляции, но для тех, у кого нет возможности сократить время компиляции, это отличное использование своих когнитивных способностей — поскольку вы делаете все сразу.
Я сбился со счета, сколько программистов, которых я встречал, спешат отлаживать и устранять только первую найденную ошибку, не тестируя остальные изменения. Это отличный ответ.

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

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


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

Slack интеграции или подобные хорошо подходят для этого
+1; случаются задержки, и если вы не предоставите себе достаточно места на мониторе для просмотра результатов во время многозадачности, лучшее, что вы можете сделать, — это избежать человеческого эквивалента «опроса». Также может быть легко обернуть команду компилятора, чтобы она выдавала всплывающее сообщение; Я использую очень короткий notifyсценарий оболочки, который, вкратце, "$@"; notify-send "$1 is done."( docs )
Косвенно касаясь темы длинных процессов, если вы регулярно выполняете длительные SQL-запросы, некоторые клиенты SQL также могут воспроизводить звук по завершении.

Мой ответ зависит от компилятора, но попробуйте следующее:

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

Ты сможешь:

  1. Не отвлекаться и не терять фокус.
  2. Если есть ошибка, вам не потребуется двух минут, чтобы исправить и снова скомпилировать, но гораздо меньше.

Например, замена двух (плохо задокументированных) идентификаторов.

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

Если вы можете передать идентификатор цыпленка в автомат для напитков, ваш код имеет проблему (*).

Хитрость заключается в том, чтобы пометить идентификаторы. Поскольку вы говорите о длительном времени компиляции, я предполагаю, что в вашем распоряжении есть статически типизированный язык, и в этом случае вы должны использовать указанные типы. А ChickenIdне то же самое, что а DrinkId. А DrinkIdне то же самое, что а FuelId.

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

Это статически типизированная версия принципа Fail Fast : вряд ли есть что-то быстрее, чем когда компилятор (или даже IDE, если он компилируется в фоновом режиме) указывает вам на ошибки.

В качестве бонуса вы даже можете ввести некоторую проверку в той же системе. В моей части мира несколько идентификаторов когда-либо были отрицательными для примеров ... или, если вы String, идентификатор 2 КБ, мягко говоря, удивителен.

(*) Если питье куриной крови не является стандартной практикой у вас дома, откуда мне знать...

Хотя это может не касаться вопроса ОП напрямую, это неплохой совет. Сравните «Как сделать неправильный код неправильным» на Джоэле о программном обеспечении или Как сделать так, чтобы неправильный код выглядел неправильно? Какие шаблоны вы используете, чтобы избежать семантических ошибок? о переполнении стека .
@MichaelKjörling: Действительно; это не новая идея :) Также следует принципу Даниэля Дж. Бернстайна о попытках искоренить классы ошибок, а не случаи появления ошибок .
Я понимаю дух этого ответа, но я не понимаю, как вы можете применить это к чему-то вроде идентификатора. Во-первых, есть очень много статических типов, из которых можно выбирать, и многие из них заменяемы. Например, если вы создали id long, вы все равно можете случайно указать int. Кроме того, на практике это было бы просто безумием.
@ChrisPratt некоторые языки делают такие вещи смехотворно простыми (например, F # и OCaml). Идея состоит в том, что даже если два идентификатора относятся к одному и тому же примитивному типу ( intскажем), у вас есть тип intдля каждого типа идентификатора (ChickenID, DrinkID). Хотя они имеют одинаковую функциональность, семантика системы типов означает, что вы не можете получить их неправильно. Когда код должен выполнять сравнения и т. д. с идентификатором, соответствующие методы могут быть реализованы для каждого типа или код, специфичный для типа, может разложить их так, чтобы ничего не могло пойти не так.
@ChrisPratt: Чтобы расширить комментарий VisualMelon, использование различных встроенных типов было бы ужасной идеей, поскольку многие языки в любом случае имеют неявное преобразование, поэтому ничего не получится. Вместо этого для каждой бизнес-сущности необходимо иметь бизнес-тип с соответствующей функциональностью; помимо того, что вы не принимаете одну сущность за другую, вы также избегаете использования бессмысленных функций (даже если идентификатор является числовым, 2 + идентификатор, 2 * идентификатор и т. д. просто не имеет смысла!).

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

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

Вероятно, существует столько же способов сделать это, сколько и программирование людей. Все, что работает для вас. Устраните проблему в ее источнике.

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

Комментарии не для расширенного обсуждения; этот разговор был перемещен в чат .

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

Ждать 30 секунд один раз не так уж и страшно, но делать это примерно 15 раз в час утомительно.

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

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

Постарайтесь быть более внимательным к своему коду перед его компиляцией.

Просмотрите его, напишите несколько комментариев, просмотрите его еще раз. Затем скомпилируйте.

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

Извините за неясность, я не говорю об ошибках, пойманных компилятором. В основном это ошибки, которые я замечаю только во время работы программы, для чего ее нужно скомпилировать. Например, замена двух (плохо задокументированных) идентификаторов. Ошибки трудно увидеть по коду, но легко заметить по поведению.
@DaniëlvandenBerg Если такая ситуация случается часто, вы также можете рассмотреть возможность включения TDD (разработка через тестирование).
@Brandin TDD в значительной степени полагается на короткие циклы и очень, очень частую перекомпиляцию. Хотя TDD хорош, он, безусловно, усугубит его проблему .
И TDD — хорошая практика. Это похоже на то, что все должно быть сделано. «Больше сосредотачивайся и делай меньше ошибок» — это мечта людей, которые игнорируют характер работы. Как сказал ОП, для обнаружения ошибки в коде требуется НАМНОГО БОЛЬШЕ (например, в десять или более раз), чем при выполнении. И многие ошибки вы никогда не увидите в любом случае.
@nvoigt: Нет, потому что очень частая перекомпиляция ограничит количество потенциальных причин сбоя компиляции (и автоматического тестирования во время сборки). Если вы вносите лишь небольшие изменения между сборками и по-прежнему обнаруживаете, что вам нужно 15 попыток, чтобы сделать это правильно, то (несмотря на отрицательные голоса) программист просто делает слишком много ошибок (но, надеюсь, со временем они исправятся по мере накопления опыта) . . В любом случае TDD ограничит наносимый ущерб.
@LightnessRacesinOrbit «Нанесенный ущерб» - это потерянное время, потому что перекомпиляция занимает неоправданно много времени. Ответить на это с помощью TDD и «просто чаще перекомпилировать» я не понимаю. Если что-то требует много времени, и я не могу это изменить, мне нужно свести к минимуму потребность в этом. TDD делает очень много вещей, но не сводит к минимуму необходимость перекомпиляции. Перекомпиляция небольшими частыми шагами — сердце TDD.
@nvoigt: Если вы внесете 50 существенных изменений в код, прежде чем пытаться выполнить компиляцию, вам придется больше исправлять и выполнять повторную компиляцию, прежде чем вы достигнете своей цели. Каждое исправление/изменение может повлиять на 49 внесенных вами изменений. Если вместо этого вы сделаете одно существенное изменение кода, а затем сразу же протестируете его и обнаружите, что потерпели неудачу, ущерб, нанесенный этой ошибкой, скорее всего, будет гораздо менее выраженным. Хотя, если честно, я нахожу все это спорным, поскольку ОП говорит, что компиляция занимает всего 30 секунд, а это ничего! :D

Инвестируйте время в себя.

10 секунд бесплатно: отжимайтесь.
60 секунд бесплатно: просмотрите вопросы о горячей сети Stack Exchange.
120 секунд бесплатно: встаньте и выпейте воды.

Я только что встал после 20 отжиманий, пока ждал, пока коллега ответит мне в Slack. Каждый раз, когда я вижу, что мне нужно 10 < seconds < 120чего-то ждать, я использую это время, чтобы стать лучше . С тех пор, как я начал делать это несколько недель назад, я чувствую себя более здоровым, более энергичным и менее уставшим. Я вижу, что моя продуктивность резко возросла. И я чувствую себя прекрасно.

Будьте внимательнее / Получите лучшее программное обеспечение

Настоящая проблема заключается в том, что вам нужно дождаться завершения сборки, чтобы узнать, допустили ли вы ошибку, или в том, что вы допускаете достаточно мелких ошибок, из-за чего очень короткое время сборки (30 секунд!) стало проблемой?

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

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

Используйте время для небольших разовых задач

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

Многозадачность

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

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

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

Внедрите сервер непрерывной интеграции/сборки и автоматизированные тесты.

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

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

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

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

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

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

Учитывая, что ошибки здесь связаны не с плохим кодированием, а с плохой документацией, возможно ли (1) поймать много идентификаторов за один запуск компиляции, а не исправлять их по отдельности, тогда вы сможете работать более продуктивно, учитывая вашу систему сборки или (2 ) переместите идентификаторы, с которыми у вас возникла проблема, в текстовый файл, который можно прочитать во время выполнения. Затем вы хорошо скомпилируете, а затем проведете время в цикле «выполнение-редактирование-выполнение», что может быть быстрее в вашем случае.

Лучшее оборудование

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

Лучший процесс сборки

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

Лучше себя

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

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

- Find the appropriate button icon and place it in the index.html file.
- Make the button call something on the backend, usually an API
- Make the API call the appropriate service.
- Let the service call the appropriate DataAccess methods
- Create tests for valid and invalid logins (backend)
- Create tests for valid and invalid logins (integration)
- Add these tests to automated test repo
- Commit code
- proceed to next task

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

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