Задание из вступительного курса «Введение в информатику» на платформе Code Studio

Сайт для обучения программированию Code.org попал в неловкую ситуацию. Из-за «технических проблем» на платформе Code Studio утром 20 января с 9:19 до 10:33 PST работы школьников по программированию — весь написанный код и другие действия на сайте — не удалось сохранить.

Технический директор образовательного сайта Джереми Стоун (Jeremy Stone) оперативно опубликовал объяснение произошедшего: «До нынешнего времени мы хранили работы по программированию учеников в таблице с 32-битным индексом, — написал он. — Эта база данных может хранить только 4 млрд строк информации об активности. Мы не осознавали, что приближаемся к этому лимиту, и таблица заполнилась».

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

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

Администрация пояснила, что код, созданный между 9:19 до 10:33 PST, сохранить не получилось, он потерян безвозвратно. Кроме того, на время переноса данных из старой таблицы в новую некоторый сохранённый ранее код был временно недоступен. Но в течение суток программисты Code.org закончили перенос данных, и вся сохранённая информация пользователей снова появилась в их аккаунтах.

Code.org — некоммерческая организация и сайт, который помогает школьникам и другим начинающим ученикам освоить основы программирования. На сайте размещена бесплатные уроки программирования. Сайт открылся в январе 2013 года с первоначальной целью составить каталог компьютерных курсов в школах США. Основатель проекта Хади Партови (Hadi Partovi) тогда заметил, что в 90% американских школ вообще не преподаётся программирование, хотя это «фундаментальная дисциплина». Инициатива получила всеобщую поддержку. В феврале 2013 года в рекламе Code.org снялись Билл Гейтс, Марк Цукерберг, Джек Дорси и другие программисты и предприниматели — все они говорили, как важно научиться программировать.

В декабре 2013 года Code.org запустил общенациональный конкурс Hour of Code Challenge, в котором предлагалось принять участие всем студентам и школьникам страны. Участники решали простые задачки на программирование: нужно было написать небольшой фрагмент кода на визуальном «детском» языке программирования Blocky, чтобы достичь поставленной цели. После запуска конкурса в нём поучаствовал даже тогдашний президент США Барак Обама, а также руководители крупнейших ИТ-компаний, в том числе Microsoft и Apple. В общей сложности около 20 млн участников написали более 600 млн строк кода.

Поскольку в большинстве школ отсутствовали уроки программирования, организаторы Code.org начали решать эту проблему. С 2014 года там открылись курсы программирования, в которых могла участвовать любая школа. К 2017 году обучение на Code.org прошли более 51 тыс. учителей информатики. Были заключены партнёрские соглашения со 120 учебными округами и множеством школ на обучение школьников на сайте Code.org. По опросу учителей, 99% из них рекомендуют вступительный курс «Введение в информатику» (20-часовые курсы по основам информатики для всех возрастов, доступны на русском языке).

По текущей статистике, на учебной платформе Code Studio зарегистрированы 506 546 учителей информатики и 16 472 129 учеников.

Сейчас организаторы национальной американской программы ставят перед собой цель устранить неравенство в информатике: привлечь в программирование девочек и меньшинства (афроамериканцев и латиноамериканцев), добавить информатику во все 12-е классы американских школ и заставить власти всех 50 штатов признать информатику базовым учебным предметом (20 штатов уже сделали это). Code.org теперь вышел за пределы Америки: сейчас курсы программирования доступны на 45 языках мира, в том числе на русском.


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

Если посмотреть на эту проблему философски, то 20 января 2017 года ученики на курсах программирования получили по-настоящему ценный практический урок из реального мира. Изначальный выбор архитектуры проекта может иметь непредвиденные последствия для внедрения, управляемости и жизнеспособности проекта в долговременной перспективе. К тому же, этот случай поощрит детей к размышлениям, как избежать рисков, вызванных надзором некоторых взрослых. И что облаку нельзя доверять на 100%.
Поделиться с друзьями
-->

Комментарии (43)


  1. Areso
    23.01.2017 19:42
    -7

    Задним числом все умны, но неужели нельзя было сделать триггер на 90% для оповещения DBA/SA?


    1. Scf
      23.01.2017 19:51
      +22

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


      1. IRI
        23.01.2017 23:22
        -10

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


        1. saboteur_kiev
          25.01.2017 20:11

          Предварительный рефакторинг не нужен.

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


      1. staticlab
        24.01.2017 09:49

        Но неужели никто из админов не заметил, что в одной из таблиц стало 4 млрд строк?


        1. vlivyur
          24.01.2017 09:56

          В ней могло быть и меньше 4. Но для этого всё равно надо иногда смотреть внутрь базы.


    1. mayorovp
      24.01.2017 06:06
      +15

      Такой триггер не имеет смысла. Тот, кто знает о возможной проблеме — он сразу закладывает 64 бита. А тот кто не знает — он и про триггер не догадается.


  1. saboteur_kiev
    23.01.2017 19:51
    +4

    Нигде нет информации, сколько конкретно из 16 млн школьников хотя бы залогинилось 20 января?

    Баг конечно забавный и поучительный, но «потеря домашней работы» явно не критичная…


    1. Ommonick
      23.01.2017 22:19
      +1

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


      1. pewpew
        24.01.2017 01:17
        -1

        Кажется продукт некоммерческий. С чего бы им вообще кому либо что либо обещать? Они делают проект из альтруистических побуждений. А вы с них ещё чего-то требуете.


        1. Ommonick
          24.01.2017 19:50

          Если я альтруистически делаю автомобиль — у него не должны на 100т.км пробега отваливаться колеса. Особенно когда им пользуются другие. И продукт для пользователей != коммерческий продукт.


          1. pewpew
            24.01.2017 19:56

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


  1. Doverchiviy_kot
    23.01.2017 20:23
    -7

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

    Думаю что некоторые поняли то, что нужно в программках просто для каждой переменной давать float/строку.


    1. savostin
      23.01.2017 21:05
      +1

      А лучше BLOB


    1. daiver19
      23.01.2017 21:07
      +17

      И потом получать оценку в 4.9999999997 балла.


      1. General_Failure
        24.01.2017 05:15
        +5

        С отбрасыванием дробной части вместо округления в формировании ведомостей и других учебных документов


    1. vlivyur
      24.01.2017 09:33

      А зарплату надо считать на PHP и JS, с переменными типа float/строка, желательно ещё и чередуя типы на разных этапах вычислений.


  1. Delics
    23.01.2017 21:27

    Золотое правило:

    «индексы таблиц должны быть bigint».


    1. Sioln
      23.01.2017 22:36
      +8

      Такое же золотое, как золотой унитаз.

      Всё зависит от конкретной ситуации.


      1. Delics
        24.01.2017 02:41
        +6

        В сабже примерно также думали.


      1. uterr
        24.01.2017 11:38
        +1

        Конечно зависит, любое «золотое правило» имеет исключения. Вот только проблема с 32-битным ключом возникает намного чаще, чем проблема из-за того, что ключ был bigint, даже сложно представить, когда это будет иметь существенное отрицательное влияние.


        1. Sioln
          24.01.2017 15:28
          +1

          На моей практике и 32-битный PK далеко не везде нужен. Много где обхожусь (MS SQL) tinyint(byte), smallint (short).
          И в этом есть выгода. Место, скорость чтения (когда на страницу больше полезных данных поместится), объёмы индексов.

          UPD: Когда объём одной базы (а их несколько) приближается к половине терабайта, как-то начинаешь думать о таких вещах.


    1. mayorovp
      24.01.2017 06:07
      +1

      Только не индексы, а суррогатные ключи.


      1. Delics
        24.01.2017 06:50

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


        1. mayorovp
          24.01.2017 06:55

          Что такое, по-вашему, "тип индекса"? В моем мире у индексов нет типов...


          1. Delics
            24.01.2017 07:52

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

            А значит тип у индекса есть и равен типу индексируемого поля.

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


            1. mayorovp
              24.01.2017 08:24
              +1

              Это называется "внешний ключ", а не "внешний индекс".


    1. GerrAlt
      24.01.2017 09:24

      вроде бы UUID тоже хорошо работает, и от подобных проблем неплохо застрахован


      1. mayorovp
        24.01.2017 15:39

        Там свои приколы. Например, куча утилит для ORM для генерации модели по базе или базы по модели не понимает как это UUID может генерироваться на стороне СУБД. А это обычно требуется если его надо сделать последовательным.


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


  1. aamonster
    23.01.2017 21:33
    +8

    "Я сделал домашку, но 32-битный индекс переполнился" :-)


    1. Areso
      23.01.2017 21:42
      +7

      Тебе все равно никто не поверит.jpg


    1. Delics
      24.01.2017 09:30

      Гик-версия:

      «Я сделал домашнюю страницу, но 32-битный индекс переполнился»


  1. xilix
    23.01.2017 23:27
    -1


  1. tartarelin
    24.01.2017 01:53
    +4

    Дааа, вот также помню в X-COM: UFO Defense, качаешь солдат качаешь, качаешь-качаешь, а потом у них характеристики становятся больше 255 и их приходится отправлять в отставку


    1. instalator
      24.01.2017 08:07

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


      1. ripatti
        24.01.2017 10:01
        +3

        Ну тогда уж вспомним еще Цивилизацию, где когда ИИ играл за Индию и прокачивал максимальный пацифизм, переменная агрессии переполнялась через ноль до максимального значения, у Ганди сносило крышу, и он шел всех кромсать в капусту…


    1. Mad__Max
      30.01.2017 20:08

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


  1. hdfan2
    24.01.2017 07:18

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


  1. is7beta
    24.01.2017 11:27

    Подскажите пожалуйста на скрине Code.org русскоязычный интерфейс, но зарегался/зашел все англ.
    Я правильно понял, что скрин получили транслейтом сайта?
    Есть какой-нибудь подобный ресурс на русском (чтобы ре мог все сам, самостоятельно)?


    1. alizar
      24.01.2017 11:29

      На Code.org внизу справа выбирается язык.


  1. simple-simple
    24.01.2017 11:31
    +2

    Так кто должен извлечь урок?
    Взрослый: Агаа! Так-так. Буду аккуратнее и сделаю бэкапы.
    Ребенок: Моё творчество пропало. Прграммировання полно факапов и это урок. Ок. Пойду пока поиграю в мяч.


    1. Areso
      24.01.2017 15:32

      в контру


  1. amarao
    24.01.2017 23:01
    -1

    Yet another code bite the 32-bits indexes.

    Уж сколько лет твердили свету — не использовать 32-битные id'шники… Но воз и ныне там.