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

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

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

Существует много, много API, и некоторые из них лучше подходят для начинающих, чем другие. Когда я искал данные для анализа в своем первом проекте на Ruby, многие интригующие API либо стоили денег, либо требовали длительного процесса утверждения, либо организовывали свои данные таким образом, что это не позволяло мне запустить мой проект менее чем за день или два. К счастью, я наткнулся на TheCocktailDB, базу данных рецептов напитков, которая предоставляла бесплатный доступ в очень удобном формате JSON — ключ API не требовался. С набором реальных данных, с которыми я мог взаимодействовать, используя несколько основных команд (и незаменимые драгоценные камни json и rest-client), я внезапно смог отточить свои новые навыки Ruby на захватывающем наборе данных.

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

Одна важная вещь, которую я узнал в ходе своего проекта, заключалась в том, как укротить непослушный набор данных. Большинство рецептов API коктейлей были достаточно последовательными, но были и дыры: в рецептах напитков иногда перечислялись ингредиенты без указания количества; рецепты некоторых напитков дублировались из-за несоответствия заглавных букв (например, «Tequila Sunrise» и «Tequila Sunrise»); у некоторых ингредиентов были описания, а у других - нет. Я обнаружил одну из самых непонятных проблем, когда тестировал свою функцию .recipe, которая собирает и выводит в командную строку название напитка, категорию, ингредиенты и инструкции. Вот карточка рецепта, которую я создал для чего-то, что я наскреб под названием «Арктическая жидкость для полоскания рта»:

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

{
  "drinks": [
    {
      "idDrink": "17118",
      "strDrink": "Arctic Mouthwash",
      "strDrinkES": null,
      "strDrinkDE": null,
      "strDrinkFR": null,
      "strDrinkZH-HANS": null,
      "strDrinkZH-HANT": null,
      "strVideo": null,
      "strCategory": "Punch / Party Drink",
      "strIBA": null,
      "strAlcoholic": "Alcoholic",
      "strGlass": "Cocktail glass",
      "strInstructions": "Blend all ingredients in a blender on high until ice is finely crushed. It should be of a slushy consistency. Pour immediately and serve.",
      "strInstructionsES": null,
      "strInstructionsDE": null,
      "strInstructionsFR": null,
      "strInstructionsZH-HANS": null,
      "strInstructionsZH-HANT": null,
      "strDrinkThumb": "https://www.thecocktaildb.com/images/media/drink/wqstwv1478963735.jpg",
      "strIngredient1": "Maui",
      "strIngredient2": "Mountain Dew",
      "strIngredient3": "Ice",
      "strIngredient4": "",
      "strIngredient5": "",
      "strIngredient6": "",
      "strIngredient7": "",
      "strIngredient8": "",
      "strIngredient9": "",
      "strIngredient10": "",
      "strIngredient11": "",
      "strIngredient12": "",
      "strIngredient13": "",
      "strIngredient14": "",
      "strIngredient15": "",
      "strMeasure1": "5 oz blue ",
      "strMeasure2": "5 oz ",
      "strMeasure3": " cubes\n",
      "strMeasure4": "\n",
      "strMeasure5": "\n",
      "strMeasure6": "\n",
      "strMeasure7": "\n",
      "strMeasure8": "\n",
      "strMeasure9": "",
      "strMeasure10": "",
      "strMeasure11": "",
      "strMeasure12": "",
      "strMeasure13": "",
      "strMeasure14": "",
      "strMeasure15": "",
      "dateModified": "2016-11-12 15:15:35"
    }
  ]
}

«Кубики» были указаны как измерение! Или " cubes\n", если быть точнее. То, как я интерполировал ингредиенты в строку, явно не сработало: "#{ingredient_amounts[i]} #{ingredient_names[i]}". В итоге мне пришлось проверить, была ли заданная сумма просто «кубами», а затем соответствующим образом переформатировать эту строку.

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

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