<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Старинин Андрей</title>
    <description>The latest articles on DEV Community by Старинин Андрей (@anstfoto).</description>
    <link>https://dev.to/anstfoto</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F895109%2F169ebb3e-1e1e-4daf-92c1-0cef49d0b3a8.jpeg</url>
      <title>DEV Community: Старинин Андрей</title>
      <link>https://dev.to/anstfoto</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/anstfoto"/>
    <language>en</language>
    <item>
      <title>Использование GitHub в обучении студентов. Автоматизация проверок.</title>
      <dc:creator>Старинин Андрей</dc:creator>
      <pubDate>Sun, 09 Oct 2022 14:53:38 +0000</pubDate>
      <link>https://dev.to/anstfoto/ispolzovaniie-github-v-obuchienii-studientov-avtomatizatsiia-provierok-g0n</link>
      <guid>https://dev.to/anstfoto/ispolzovaniie-github-v-obuchienii-studientov-avtomatizatsiia-provierok-g0n</guid>
      <description>&lt;p&gt;&lt;em&gt;Статьи впервые опубликованы на портале Хабр:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://habr.com/p/687940/"&gt;Использование GitHub в обучении студентов. Автоматизация проверок. Часть I.&lt;/a&gt; - &lt;a href="https://habr.com/p/687940/"&gt;https://habr.com/p/687940/&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://habr.com/ru/post/692260/"&gt;Использование GitHub в обучении студентов. Автоматизация проверок. Часть II.&lt;/a&gt; - &lt;a href="https://habr.com/ru/post/692260/"&gt;https://habr.com/ru/post/692260/&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Статья будет обновляться по мере появления нового материала&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;В конце декабря 2020 года я написал &lt;a href="https://dev.to/anstfoto/ispolzovaniie-github-v-obuchienii-studientov-3gg3"&gt;статью по своему опыту использования GitHub в обучении студентов&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ниже буду рассказывать об автоматизации проверки кода студентов. Примеры будут про C#, т.к. это мой основной язык, на котором я преподаю программирование.&lt;/p&gt;

&lt;h2&gt;
  
  
  Часть I. Code style
&lt;/h2&gt;

&lt;p&gt;Для меня при обучении программированию важно, чтобы студенты умели не только правильно решать задания, но и красиво писать код. В обучении и проверки заданий я использую &lt;strong&gt;EditorConfig&lt;/strong&gt;, &lt;strong&gt;dotnet cli&lt;/strong&gt; и &lt;strong&gt;GitHub Actions&lt;/strong&gt;. Но обо всём по порядку.&lt;/p&gt;

&lt;h3&gt;
  
  
  EditorConfig
&lt;/h3&gt;

&lt;p&gt;Для C# существуют различные рекомендации по стилю кода, по именованию. Например:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/ru-ru/dotnet/csharp/fundamentals/coding-style/coding-conventions"&gt;https://docs.microsoft.com/ru-ru/dotnet/csharp/fundamentals/coding-style/coding-conventions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://google.github.io/styleguide/csharp-style.html"&gt;https://google.github.io/styleguide/csharp-style.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Подробно о стилевых особенностях останавливаться не буду. Они могут разниться в командах, да и кому как удобнее. Плюс правил очень много.&lt;/p&gt;

&lt;p&gt;Для формализации описания правил использую файл &lt;code&gt;.editorconfig&lt;/code&gt;, как сказано в документации Microsoft. За основу взял &lt;a href="https://docs.microsoft.com/ru-ru/dotnet/fundamentals/code-analysis/code-style-rule-options?view=vs-2019#example-editorconfig-file"&gt;файл из примера&lt;/a&gt; и немного его дополнил. Вот мой &lt;a href="https://github.com/anst-foto/dot_files/blob/master/EditorConfig/csharp_4.editorconfig"&gt;файл &lt;code&gt;.editorconfig&lt;/code&gt; для C#&lt;/a&gt;. Сей файл помещается в корень решения. Это необходимо чтобы правила оформления применялись для всего решения. При этом не важно в какой IDE вы пишите код, &lt;strong&gt;EditorConfig&lt;/strong&gt; поддерживается многими редакторами и средами разработки. Подробнее о поддержке редакторами и формате файла можете почитать на &lt;a href="https://editorconfig.org/"&gt;оф. сайте &lt;strong&gt;EditorConfig&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;dotnet format&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Для ручной проверки написанного кода на соответствие правил оформления можно использовать команду &lt;code&gt;dotnet format&lt;/code&gt;. Подробнее о команде можно узнать из &lt;a href="https://docs.microsoft.com/ru-ru/dotnet/core/tools/dotnet-format"&gt;оф. документации Microsoft&lt;/a&gt;. К тому же она умеет и автоматически исправлять и приводить код в соответствии с правилами в &lt;code&gt;.editorconfig&lt;/code&gt;. Но мне это не нужно для проверки заданий от студента. Наоборот нужно получить только отчёт об оформлении кода. Поэтому я использую команду со следующими ключами: &lt;code&gt;dotnet format --no-restore --verify-no-changes&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  GitHub Actions
&lt;/h3&gt;

&lt;p&gt;Вручную проверять конечно хорошо, но мне необходимо автоматизировать это действие. Для этого я буду использовать &lt;strong&gt;GitHub Actions&lt;/strong&gt;. Сей инструмент/сервис от GitHub очень мощный и позволяет много чего автоматизировать. Я буду использовать только маленькую толику его возможностей. Почитать подробнее об GitHub Actions можно в &lt;a href="https://docs.github.com/en/actions/using-workflows/about-workflows"&gt;официальной документации&lt;/a&gt; или в различных статьях, например в &lt;a href="https://cakeinpanic.medium.com/github-actions-%D0%B1%D0%B0%D0%B7%D0%B0-2501445e7392"&gt;этой статье&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Порядок действий
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Для начала необходимо задание залить в репозиторий на GitHub.&lt;/li&gt;
&lt;li&gt;После этого нужно объяснить студентам что сдают они задние через &lt;code&gt;pull request&lt;/code&gt; из своего форка. Подробнее о таком способе работы у меня написано &lt;a href="https://habr.com/ru/post/534198/"&gt;здесь&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Добавляете в корень репозитория файл &lt;code&gt;.editorconfig&lt;/code&gt; с вашим набором правил.&lt;/li&gt;
&lt;li&gt;Создаётся файл формата &lt;strong&gt;YAML&lt;/strong&gt; &lt;code&gt;dotnet-format.yml&lt;/code&gt; для проверки кода на соответствие code style. Файл должен находиться по следующему пути: &lt;code&gt;./.github/workflows/&lt;/code&gt; (в корне проекта создаётся папка &lt;strong&gt;.github&lt;/strong&gt;, а в ней подпапка &lt;strong&gt;workflows&lt;/strong&gt;). Содержимое файла приведено ниже.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dotnet format&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;master"&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;

  &lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;check-format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;windows-latest&lt;/span&gt;

      &lt;span class="s"&gt;steps&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Setup .NET Core&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-dotnet@v2&lt;/span&gt;
          &lt;span class="s"&gt;with&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;dotnet-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;6.0.x'&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Check out code&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run dotnet format&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dotnet format --no-restore --verify-no-changes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Если кратко, то содержимое файла описывает следующее:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;файл будет запускаться при создании запросов на слияние (pull request) в ветку master&lt;/li&gt;
&lt;li&gt;в виртуальной среде с Windows будет устанавливаться .NET 6&lt;/li&gt;
&lt;li&gt;проверка форматирования кода с выдачей отчёта&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Пример вывода отчёта:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tSDg_HWR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mndu0hts9su0977kc4wk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tSDg_HWR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mndu0hts9su0977kc4wk.png" alt="img-1" width="880" height="495"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zfFWsIRj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ec49rqavd52nh9x4ijpe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zfFWsIRj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ec49rqavd52nh9x4ijpe.png" alt="img-2" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Вот так, не сильно сложно, можно упростить себе работу по проверке заданий от студентов.&lt;/p&gt;


&lt;h2&gt;
  
  
  Часть II. Unit-тесты
&lt;/h2&gt;

&lt;p&gt;Добавить в репозиторий проверку прохождения unit-тестов на C# нет ничего сложного. При создании &lt;em&gt;workflow&lt;/em&gt; в &lt;strong&gt;GitHub Actions&lt;/strong&gt; можно выбрать &lt;em&gt;workflow&lt;/em&gt; специфичные для &lt;strong&gt;.Net&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NByA4J8H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yn0glpk9j84w459qa9bc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NByA4J8H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yn0glpk9j84w459qa9bc.png" alt="img-2-1" width="880" height="381"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zJyZXi6M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aurtr8bh1iwag9en2med.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zJyZXi6M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aurtr8bh1iwag9en2med.png" alt="img-2-2" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Предлагаемого варианта хватит с лихвой. Я только немного подправляю код "под себя".&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dotnet test&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;master"&lt;/span&gt; &lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Setup .NET&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-dotnet@v3&lt;/span&gt;
      &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;dotnet-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;6.0.x&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Restore dependencies&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dotnet restore&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dotnet build --no-restore&lt;/span&gt;

    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Test&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dotnet test --no-build --verbosity normal&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Почему я использую отдельный файл для автоматизации прохождения тестирования, а не добавляю этапы в один workflow?&lt;/strong&gt; Ответ простой: чтобы разграничить вывод результатов, чтобы понимать что прошло, а что нет. Так проще потом объяснять студентам: тесты пройдены, а вот правила оформления кода не соблюдаются.&lt;/p&gt;

&lt;p&gt;После выполнения мы получим "небольшой отчёт", примерно как на изображениях ниже.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eDIpX6i2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2b4vkps240zjt4s1pvvl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eDIpX6i2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2b4vkps240zjt4s1pvvl.png" alt="img-2-3" width="880" height="579"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--E_1ERWFE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9a6o1vmuwrjwsetyvcjd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--E_1ERWFE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9a6o1vmuwrjwsetyvcjd.png" alt="img-2-4" width="880" height="541"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--v2PewERQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c3icv8zgkxyop4a1ixpw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--v2PewERQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c3icv8zgkxyop4a1ixpw.png" alt="img-2-5" width="880" height="551"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Помимо прохождения самих unit-тестов в данном &lt;em&gt;workflow&lt;/em&gt; происходит ещё выполнение сборки. Следовательно мы увидим предупреждения и ошибки сборки проектов решения.&lt;/p&gt;

&lt;p&gt;Остаётся дело за малым: чтобы студенты научились писать unit-тесты. &lt;strong&gt;Почему я не советую писать unit-тесты преподавателю заранее?&lt;/strong&gt; Потому, что я стараюсь давать такие задания, для которых сложно сразу написать тесты. И мне важно чтобы студенты учились самостоятельно проектировать библиотеки классов. А если они их проектируют самостоятельно - то и подходить к написанию тестов нужно индивидуально. И да, этот подход влечёт за собой ещё и проверку правильности написания unit-тестов. Но нужно же подходить к работе преподавателя программирования со всей ответственностью и с правильным закладыванием фундамента, который требуется отрасли.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Использование GitHub в обучении студентов</title>
      <dc:creator>Старинин Андрей</dc:creator>
      <pubDate>Wed, 14 Sep 2022 14:45:38 +0000</pubDate>
      <link>https://dev.to/anstfoto/ispolzovaniie-github-v-obuchienii-studientov-3gg3</link>
      <guid>https://dev.to/anstfoto/ispolzovaniie-github-v-obuchienii-studientov-3gg3</guid>
      <description>&lt;p&gt;&lt;em&gt;Статьи впервые опубликованы на портале Хабр:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://habr.com/ru/post/533940/"&gt;Использование GitHub в обучении студентов&lt;/a&gt; - &lt;a href="https://habr.com/ru/post/533940/"&gt;https://habr.com/ru/post/533940/&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://habr.com/ru/post/534198/"&gt;Вариант с форками&lt;/a&gt; - &lt;a href="https://habr.com/ru/post/534198/"&gt;https://habr.com/ru/post/534198/&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://habr.com/ru/post/534292/"&gt;Вариант командной работы&lt;/a&gt; - &lt;a href="https://habr.com/ru/post/534292/"&gt;https://habr.com/ru/post/534292/&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href="https://habr.com/ru/post/536590/"&gt;Вариант командной работы с несколькими репозиториями&lt;/a&gt; - &lt;a href="https://habr.com/ru/post/536590/"&gt;https://habr.com/ru/post/536590/&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;В своей преподавательской практике использую GitHub...&lt;/p&gt;

&lt;p&gt;Но для начала давайте представлюсь. Зовут меня Старинин Андрей. И я преподаю программирование, хотя по первому образованию я биолог. А ещё - один из основателей и ведущих подкаста "IT за Edu".&lt;/p&gt;

&lt;p&gt;Мой стек дисциплин:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;C++

&lt;ul&gt;
&lt;li&gt;основы программирования&lt;/li&gt;
&lt;li&gt;основы ООП&lt;/li&gt;
&lt;li&gt;GUI-приложения (Qt)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;C#

&lt;ul&gt;
&lt;li&gt;ООП&lt;/li&gt;
&lt;li&gt;сетевое программирование&lt;/li&gt;
&lt;li&gt;GUI-приложения (WPF)&lt;/li&gt;
&lt;li&gt;взаимодействие приложений и БД (ADO.Net)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Базы данных

&lt;ul&gt;
&lt;li&gt;проектирование БД&lt;/li&gt;
&lt;li&gt;SQLite&lt;/li&gt;
&lt;li&gt;MySQL&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Управление проектами&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Кажется, что всего много. Но успеваем не сильно погрузиться в отдельные технологии. После какого-то времени (точно не помню уже какого) понял, что студентов можно, и даже нужно, "приучать" к системам управления версиями почти сразу - с начала обучения. Для обучения выбрал GitHub. Хотя Bitbucket тоже нравится. Да, я не учу студентов сразу по харду, они не сразу изучают git в CLI. Я их знакомлю сначала с web-интерфейсом GitHub'а. Потом рассказываю про GUI-клиенты. Из них мне нравится GitKraken. Но не заставляю их пользоваться тем, что нравится мне - они вольны выбирать сами чем пользоваться.&lt;/p&gt;

&lt;p&gt;Постепенно - это примерно так:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Просто показываю как выкладывать код&lt;/li&gt;
&lt;li&gt;Прошу их выкладывать свои решения и присылать мне ссылки на репозитории&lt;/li&gt;
&lt;li&gt;Выкладываю текст заданий и прошу ответы присылать через pull-request'ы&lt;/li&gt;
&lt;li&gt;Пробуем поработать в маленьких командах над одним репозиторием без веток&lt;/li&gt;
&lt;li&gt;Пробуем поработать небольшой командой над одним репозиторием с отдельными ветками&lt;/li&gt;
&lt;li&gt;Пробуем работать над большим проектом большой командой с несколькими репозиториями и ветками.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;И вот такой постепенный подход стараюсь применять при изучении тем. Иногда темы заканчиваются быстрее, чем успеем перейти к большому или маленькому проекту. Но это несильно страшно. По изучении нескольких тем мы можем полученные знания объединить в один большой проект.&lt;/p&gt;

&lt;p&gt;Не все студенты сразу всё понимают и принимают. Но тем интереснее и приятнее когда они "доходят". Ещё люблю подход: учимся на своих ошибках. Во время обучения есть возможность ошибаться и понять к чему это приводит.&lt;/p&gt;

&lt;p&gt;Что мне нравится в GitHub при обучении?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Поддержка аккаунтов для организаций, а в аккаунтах возможность создания команд с гибкими настройками доступов&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---AxXVidg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n686z8dxourekvsfauia.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---AxXVidg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n686z8dxourekvsfauia.png" alt="github organizations" width="880" height="368"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PoPf5Jt2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oowirgqfgv7a9c6bvqvj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PoPf5Jt2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oowirgqfgv7a9c6bvqvj.png" alt="github organizations teams" width="880" height="406"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7ALHpVXW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2yq53v0c027wr81g33z3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7ALHpVXW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2yq53v0c027wr81g33z3.png" alt="github organizations teams role" width="880" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Поддержка Markdown-разметки. Можно более "красиво" оформлять задания.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SkE-4w0A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2n9ki7zmm54o47wbh960.png" alt="github markdown" width="880" height="625"&gt;
&lt;/li&gt;
&lt;li&gt;Система форков. Может любой человек сделать форк, а потом предложить запрос на слияние. Не всегда нужно всех студентов добавлять в команду.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pd7NhZx4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sq039vqmvffhqlua326h.png" alt="github forks" width="441" height="780"&gt;
&lt;/li&gt;
&lt;li&gt;Возможность комментировать участки кода при проведении ревью. Очень удобно указывать на сильные и слабые моменты в программах.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--o7KfqdFt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lb71ka611xptgnubzmu4.png" alt="github codereview" width="880" height="299"&gt;
&lt;/li&gt;
&lt;li&gt;Возможность назначать ревьюером любого члена команды. Студенты должны уметь не только хорошо писать программы, но и проверять чужой код.&lt;/li&gt;
&lt;li&gt;Система issues. Можно давать другим командам студентов задание на проверку кода и выявления багов, с занесением всего в issues.
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Q4ft0lcO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xv10tamkp6ffh6ub8fqs.png" alt="github issues" width="880" height="261"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Для чего я приучаю студентов к GitHub'у?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Создание своего портфолио уже с самого начала обучения, а не только под конец.&lt;/li&gt;
&lt;li&gt;Понимание принципов написания кода. Когда начинают чужой код проверять - многое понимают&lt;/li&gt;
&lt;li&gt;Понимание "соглашения об именовании". Пока не наступят на грабли разного именования в одной команде - не понимают. Ну или не все понимают&lt;/li&gt;
&lt;li&gt;Понимание как работать в команде. И как командам между собой взаимодействовать.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Прекрасно понимаю, что мои методы не самые лучшие и далеки от совершенства, да и от реальности далековаты. Но стараюсь их приблизить к реальности.&lt;/p&gt;

&lt;h2&gt;
  
  
  .Вариант с форками.
&lt;/h2&gt;

&lt;p&gt;Начну с варианта, когда не обязательно добавлять студентов в аккаунт организации. Т.е. можно и в своём аккаунте делать репозитории с заданиями.&lt;/p&gt;

&lt;h3&gt;
  
  
  .Примерный порядок действия.
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Создаёте репозиторий с названием задания.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;В &lt;code&gt;README.md&lt;/code&gt; добавляете текст задания и подробную (желательно, но не обязательно) инструкцию что и как должны сделать. Обязательно обращаете внимание на создание форка и после выполнения (читай, наполнения репозитория) создания запроса на слияние (pull request) с вашим исходным репозиторием.&lt;br&gt;
Пример - &lt;a href="https://github.com/college-VIVT/TerminalEmulator"&gt;https://github.com/college-VIVT/TerminalEmulator&lt;/a&gt;&lt;br&gt;
В нужном месте сообщаете студентам задание и ссылку на репозиторий.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--e5HTdSwc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zteunf760hbfq3u5gnoo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--e5HTdSwc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zteunf760hbfq3u5gnoo.png" alt="readme" width="880" height="669"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ждёте выполнения задания, а точнее создания запроса на слияние.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ypXeZgYy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5gjm0of4dtyhvgpj7qut.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ypXeZgYy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5gjm0of4dtyhvgpj7qut.png" alt="pull requests" width="880" height="376"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Проверяете. Оставляете комментарии либо ко всему заданию целиком, либо к его отдельным частям.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--51nQt39J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tol67uks83t0ic90z5w9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--51nQt39J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tol67uks83t0ic90z5w9.png" alt="code review" width="880" height="299"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BTISxrOo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xmbsdhkvaccr5lmo9mwb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BTISxrOo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xmbsdhkvaccr5lmo9mwb.png" alt="code review" width="880" height="485"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Принимать (мерджить) запрос на слияние в данной ситуации не нужно. Если всё хорошо - то можно просто оставить комментарий в ревью кода. Если всё плохо - то не принимаете.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  .Плюсы и минусы.
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Плюсы:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Не нужен аккаунт организации&lt;/li&gt;
&lt;li&gt;Можно рассылать любому количеству студентов, даже из разных групп или учебных заведений&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Минусы:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Нужно следить, чтобы не сделали мердж&lt;/li&gt;
&lt;li&gt;Нужно объяснять что такое форк и запрос на слияние (у некоторых моих студентов это вызвало дополнительные затруднения)&lt;/li&gt;
&lt;li&gt;Сложности с принятием запросов Approve . Мне хочется, чтобы в репозитории было только задание и не было кода решения от студентов.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Какие можно внести дополнения:&lt;/strong&gt; добавить под каждого студента свою ветку, но это лишние действия при создании и дальнейшем наполнении репозитория.&lt;/p&gt;

&lt;h2&gt;
  
  
  .Вариант командной работы.
&lt;/h2&gt;

&lt;p&gt;Продолжу вариантом про командную работу. Но рассмотрю ту его версию, когда нет большого числа репозиториев и веток. Про работу большой команды расскажу, наверное, в отдельном посте.&lt;/p&gt;

&lt;h3&gt;
  
  
  .Примерный порядок действия.
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Создаёте аккаунт организации&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZIkT84sE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zv45pq08uicoo5yz8nrl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZIkT84sE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zv45pq08uicoo5yz8nrl.png" alt="account organization" width="880" height="368"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Добавляете в него студентов.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Rl8_4v84--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ucar8sfyie4069hjdu87.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Rl8_4v84--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ucar8sfyie4069hjdu87.png" alt="add students to organization" width="880" height="650"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Создаёте репозиторий. В README.md добавляете текст задания. Также наполняете репозиторий предварительно необходимым минимумом (нужными файлами для выполнения задания). Создаёте необходимые ветви. Обычно создаю ветвь dev или develop&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---JZzViAt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/31zd140lkangowm0y2ii.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---JZzViAt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/31zd140lkangowm0y2ii.png" alt="create repo" width="880" height="451"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Студенты получив задания, делают ответвления от последнего коммита. Выполняют задания, коммитят. Задания можно выдавать как через issues, так и какой-нибудь сервис с Kanban или Scrum&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nsVH4CRL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dqdur6fuoqwkagbjoqlq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nsVH4CRL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dqdur6fuoqwkagbjoqlq.png" alt="create issues" width="880" height="482"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Создают запрос на слияние&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jwK3MyqO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/620q9adscoif6c5y92jc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jwK3MyqO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/620q9adscoif6c5y92jc.png" alt="create pull request" width="880" height="456"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Проверяете. Оставляете комментарии либо ко всему заданию целиком, либо к его отдельным частям.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jAGtzpRa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l5bh9gkfer1hy1g3f9x4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jAGtzpRa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l5bh9gkfer1hy1g3f9x4.png" alt="code review" width="880" height="462"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4yx2v4Yd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ziws90tfe8b30i7roa1b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4yx2v4Yd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ziws90tfe8b30i7roa1b.png" alt="code review" width="880" height="486"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Плюсы и минусы
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Плюсы:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Более приближенный к реальности вариант моделирования&lt;/li&gt;
&lt;li&gt;Можно назначать студентов в качестве ревьюеров кода. Даже преподавательского. Я люблю делать в коде специально ошибки как явные, так и неявные, чтобы студенты их находили и исправляли.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Минусы:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Нужно создавать отдельный аккаунт для организации&lt;/li&gt;
&lt;li&gt;Нужно объяснить как работать с ветками и следить, чтобы пушили в нужную ветку.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Какие можно внести дополнения:&lt;/strong&gt; связать репозиторий с Kanban- или Scrum-сервисом, чтобы выдача заданий фиксировалась в карточках на досках.&lt;/p&gt;

&lt;h2&gt;
  
  
  .Вариант командной работы с несколькими репозиториями.
&lt;/h2&gt;

&lt;p&gt;Расскажу про "самый приближённый" к реалиям вариант, когда в рамках реализации одной программы возникают подпроекты и над ними трудятся разные команды в разных репозиториях.&lt;/p&gt;

&lt;h3&gt;
  
  
  .Примерный порядок действия.
&lt;/h3&gt;

&lt;p&gt;Часть действий повторяются из предыдущего примера.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Создаёте аккаунт организации&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--z6XRFNpT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uoiyvn85enq05vej2jjd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--z6XRFNpT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uoiyvn85enq05vej2jjd.png" alt="account organization" width="880" height="368"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Добавляете в него студентов.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yAj9RNEw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/524diqt8o75msll92ydq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yAj9RNEw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/524diqt8o75msll92ydq.png" alt="add students to organization" width="880" height="650"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Создаёте репозиторий. В README.md добавляете текст задания. Также наполняете репозиторий предварительно необходимым минимумом (нужными файлами для выполнения задания). Создаёте необходимые ветви. Обычно создаю ветвь dev или develop&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CGZS56CS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bu2ip1bq5kcronn4zqk5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CGZS56CS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bu2ip1bq5kcronn4zqk5.png" alt="create repo" width="880" height="451"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Студенты получив задания, клонируют репозиторий себе на локальные машины.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ptvzBp3h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ewjdykawxk9cneuwkxrm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ptvzBp3h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ewjdykawxk9cneuwkxrm.png" alt="clone repo" width="880" height="530"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--blIzN0U0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yin9j5pdmmvhnyz5l96r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--blIzN0U0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yin9j5pdmmvhnyz5l96r.png" alt="clone repo" width="880" height="472"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;По мере обсуждения решения выявляются подпроекты. Создаются команды под каждый подпроект. Для каждого подпроекта создаётся свой репозиторий с предварительным наполнением.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XfAxPFLW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i7mwwk4d5b2mgtkumja3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XfAxPFLW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i7mwwk4d5b2mgtkumja3.png" alt="teams" width="880" height="398"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wsQtjZZ6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/olyc44iqpz0jtifznekl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wsQtjZZ6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/olyc44iqpz0jtifznekl.png" alt="teams" width="880" height="439"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Команды выполняют задания, коммитят, пушат. Задания можно выдавать как через issues, так и какой-нибудь сервис с Kanban или Scrum&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rZ6sWWgP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/er66t56fi06usmjxtetk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rZ6sWWgP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/er66t56fi06usmjxtetk.png" alt="github projects" width="880" height="368"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Создают запрос на слияние&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bnzUVnEW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m1d2x2ee798qr9bnk872.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bnzUVnEW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m1d2x2ee798qr9bnk872.png" alt="create pull request" width="880" height="456"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Проверяете. Оставляете комментарии либо ко всему заданию целиком, либо к его отдельным частям.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tirCrjxE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rsxi53u1d3awekrmntwk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tirCrjxE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rsxi53u1d3awekrmntwk.png" alt="code review" width="880" height="462"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PEk0BVvV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7w1p8fxw5zqhwlww8968.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PEk0BVvV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7w1p8fxw5zqhwlww8968.png" alt="code review" width="880" height="486"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Создаются релизы. Готовые DLL или ещё что берётся из релизов и подключается в основной проект.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2nxcoTZ2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hzydena4l48npmjir17a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2nxcoTZ2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hzydena4l48npmjir17a.png" alt="realese" width="880" height="535"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;В каждой команде ведётся техдокументация.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NgoDnJtN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0sggujdvog8bdxwtp0dv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NgoDnJtN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0sggujdvog8bdxwtp0dv.png" alt="documentation" width="880" height="627"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Плюсы и минусы
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Плюсы:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Более приближенный к реальности вариант моделирования&lt;/li&gt;
&lt;li&gt;Можно назначать студентов в качестве ревьюеров кода. Даже преподавательского. Я люблю делать в коде специально ошибки как явные, так и неявные, чтобы студенты их находили и исправляли.&lt;/li&gt;
&lt;li&gt;Каждая команда работает над своим подпроектом&lt;/li&gt;
&lt;li&gt;Студенты пробуют межкомандное взаимодействие при разработке одного большого проекта.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Минусы:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Нужно создавать отдельный аккаунт для организации&lt;/li&gt;
&lt;li&gt;Нужно объяснить как работать с ветками и следить, чтобы пушили в нужную ветку.&lt;/li&gt;
&lt;li&gt;Нужно объяснять что такое релиз, как происходит версионирование.&lt;/li&gt;
&lt;li&gt;Нужно объяснять как пишется и для чего нужна техдокументация.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Какие можно внести дополнения:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;связать репозиторий с Kanban- или Scrum-сервисом, чтобы выдача заданий фиксировалась в карточках на досках&lt;/li&gt;
&lt;li&gt;создавать не отдельные репозитории для каждого подпроекта, а использовать git submodules&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>github</category>
      <category>education</category>
      <category>learning</category>
      <category>team</category>
    </item>
  </channel>
</rss>
