3 наиболее распространённых подводных камня в Go


Оглавление (нажмите, чтобы открыть):

3 наиболее распространённых подводных камня в Go

4’266 подписчиков
1’743 просмотров на пост

Полезные материалы по всему, что может быть полезно разработчику на Go.

Детальная рекламная статистика будет доступна после прохождения простой процедуры регистрации

  • Детальная аналитика 70’046 каналов
  • Доступ к 28’004’146 рекламных постов
  • Поиск по 112’332’059 постам
  • Отдача с каждой купленной рекламы
  • Графики динамики изменения показателей канала
  • Где и как размещался канал
  • Детальная статистика по подпискам и отпискам

Найдено 638 постов

#book #beginner #sql

Книга Мартина Грубера «Понимание SQL» является самой что ни на есть классикой в мире баз данных. Хотя любая классика переживает несколько изданий, этому руководству хватило один раз появиться, чтобы навсегда стать неумирающим самоучителем по SQL и базам данных. Руководство относительно небольшое и научит вас не только основам SQL, но и достаточно сложным темам, призванным увеличить эффективность запросов.

Структуры — один из основных типов данных в Golang. Они используются практически повсеместно (пользовательские типы, конфиги и т.д.). Более того к полям структур через теги могут быть добавлены метаданные, которые нужны для маппинга данных через encoding/json или encoding/xml, валидации, ORM и др. Эта статья подробно рассказывает о применении тегов в Go:

Если вам не требуется мощные СУБД по типу Postgres или MySQL, а что-то попроще, советуем простую низкоуровневую СУБД ключ-значение bolt.

Создаем бота для Slack на языке Go.

Учимся распознавать изображения с помощью библиотеки TensorFlow и Golang.

Валидатор структур и полей в Golang.

Онлайн-туториал с многочисленными примерами решения популярных задач на Golang.

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

Библиотека для работы с Elasticsearch.

Простая библиотека для обработки и отправки сообщений на Go.

В этом туториале автор расскажет, как решал проблемы с потреблением памяти в Golang.

В Go 1.9 появились лейблы профайлера. Что это такое, можно узнать тут, а как ими пользоваться — тут.

В этой статье автор расскажет, как использовать инструмент Go Kit для создания микросервисов.

Создаем RESTful приложение на Golang.

Тестируем работу с базами данных различными способами на Go.

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

Библиотека для создания ботов Vk.

Удобная библитека по работе с json и yaml данными.

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

Как реализовать ООП в Go без наследования? Узнаем из следующей статьи.

�� Подборка материалов по языку Go

�� Подборка материалов по языку Go

��Плюсы и минусы изучения языка Go
https://prglb.ru/5m2ya

��Большой список полезных ссылок на ресурсы по изучению Go с нуля
https://prglb.ru/49eyf


��3 наиболее распространённых подводных камня в Go
https://prglb.ru/la5k

��Онлайн-книга по языку Go с примерами
https://prglb.ru/qe2l

��Учимся языку Go через игры
https://prglb.ru/3s0k4

Не забудьте подписаться на наш telegram-канал для разработчиков на Go: �� t-do.ru/goproglib

Эта статья была автоматически добавлена из сообщества Библиотека программиста

5 «подводных камней» при онлайн-бронировании отелей и как их избежать

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

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

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

Ловушка №1: ваш потенциальные клиент о вас забыл

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

Решение:
В тех случаях, когда пользователь заходил на сайт или даже задал параметры бронирования, а затем отвлекся, не хватило времени или сменил устройство, инструмент ремаркетинга способен напоминать ему о просмотренной странице в Интернете. Платформы социальных сетей, по типу Facebook, и инструменты интернет-рекламы вроде Google AdWords и РСЯ, помогают в создании небольшого фрагмента кода, который веб-разработчик может легко добавить на сайт. Пользователи с сайта, где установлен код, добавляются в контактный лист страницы, вот теперь у вас появится возможность выбрать, какую конкретную информацию сайта показать заказчику или вернуть его к этапу бронирования.

Ловушка №2: Люди не уверены в том, что они приобретают

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

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

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

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

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

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

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

Ловушка №3: процесс бронирования слишком сложен

Согласно исследованию Phocuswright 2020 года, основная причина, по которой люди отдают предпочтение OTAs (онлайн-туристические агентства), заключается в том, что веб-сайты просты в использовании. OTAs действительно прост и имеет четкий маршрут бронирования (без отвлекающих факторов), уже проанализированный и оптимизированный для обывателя.

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

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

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

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

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

Ловушка №4 форма бронирования без мобильной версии

Согласно исследованиям Google, 54% процента отпускников и 69% деловых путешественников отмечают несовершенство мобильных версии сайта и существенные ограничения их использования. Поэтому 80% резерваций осуществляются с персональных компьютеров.

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

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

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

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

Ловушка №5: сложный или не безопасный модуль оплаты

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

Решение:
Если у вас нет возможности внедрить собственную систему безопасных онлайн-платежей, а использование сторонних приложений Google Pay, PayPal или Apple Pay не всегда целесообразно, то наилучший способ — дать возможность оплатить номер при заселении. По большому счету вы ничего не теряете, на этапе бронирования вам гость ничего не должен. Он сделал свой выбор, подтвердил свои намерения приехать и сообщил о них вам.

egorsmkv / metrials-go.md

Материалы по Go (golang)

На русском языке

Мануалы и туториалы

  • Введение в программирование на Go

  • Маленькая книга о Go
  • Эффективный Go
    • Есть еще Краткий пересказ Effective Go на русском языке, но 2009 года
  • Go в примерах
  • Разработка Web-приложений на языке Go (не полный перевод)
  • Алан А. А. Донован, Брайан У. Керниган: Язык программирования Go
  • Марк Саммерфильд — Программирование на Go. Разработка приложений XXI века
  • Golang Moscow: Go 1.8 release party (4 доклада)
  • Meetup в офисе Badoo (3 доклада)
  • Весенний Go в Badoo (3 доклада)
  • Golang Meetup Novosibirk, Февраль 2020 (4 доклада)
  • Golang Meetup Novosibirsk, May (2 доклада)
  • Golang Meetup Novosibirsk, August 2020 (2 доклада)
  • Доклады конференции Golang Moscow в Digital October (3 доклада)
  • Небольшая серия «Пишем веб-приложение на Go» авторстом Сергея Гаврука
  • Серия из 26 видео на тему «Погружение в Google Go» авторством Романа Левищенко
  • Форум в группах Google
  • Группа «Golang RU» в Telegram’e #1
  • Группа «pro.go» в Telegram’e #2
  • Чат в Slack’e, инвайт получить можно здесь
  • Вопросы по языку на русскоязычном StackOverflow
  • 4gophers — самый старый русскоязычный проект посвящённый Go. Публикуются статьи, новости, видео о Go.
  • Ежедневный дайджест новостей языка Go и всего вокруг него в Telegram

На украинском языке

Мануалы и туториалы

  • Чат в Slack’e, инвайт получить можно написав на gleb.kolesnikof[dot]gmail.com

  • Чат в Gitter’e

На английском языке

Мануалы и туториалы

  • Fucking Go Date Format — форматирование даты в Go отличается от других Си-подобных языков, этот сервис поможет вам написать его.

Эти два сервиса позволяют сгенерировать Go-структуру из уже имеющегося JSON-кода:

  • Miek Gieben: Learning Go (Attribution-NonCommercial-ShareAlike 3.0 Unported License)
  • Matt Aimonetti: Go Bootcamp (Creative Commons Attribution 3.0 license.)
  • Practical Cryptography With Go
  • Подкаст «Go Time» (Ведущие: Erik St. Martin, Carlisia Pinto, and Brian Ketelsen)
  • . здесь еще некоторые есть
  • Канал на YouTube авторства Todd McLeod, много видео о разработке на Go, включая разработку веб-приложений
  • Канал «Failing Forward» на YouTube, есть серия «Introduction to Go», а также некоторые видео по разработке веб-приложений

This comment has been minimized.

Copy link Quote reply

egorsmkv commented Feb 26, 2020

This comment has been minimized.

Copy link Quote reply

egorsmkv commented Apr 11, 2020

This comment has been minimized.

Copy link Quote reply

Fluffy28 commented May 21, 2020

Спасибо большое. Очень познавательно!

This comment has been minimized.

Copy link Quote reply

Antonboom commented Jul 24, 2020

  • © 2020 GitHub , Inc.
  • Terms
  • Privacy

  • Security
  • Status
  • Help

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

«Подводный камень» в каком-то деле CodyCross

Простая, но захватывающая игра CodyCross — это такая игра, в которой каждый рано или поздно нуждается в дополнительной помощи, потому что по мере прохождения простых уровней новые становятся все сложнее и сложнее. Эта веб-страница с CodyCross «Подводный камень» в каком-то деле ответами — единственный источник, который вам нужен, чтобы быстро пройти сложный уровень. Эта игра была создана командой Fanatee Games, которая придумала много отличных игр для Android и iOS.

Суть этой игры проста и понятна абсолютно любому. В ней вам нужно будет искать и собирать слова из букв свайпом по экрану. Однако вы можете застрять на любом уровне. Поэтому обязательно используйте опубликованные нами CodyCross «Подводный камень» в каком-то деле ответы ниже, а также другие полезные руководства.

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

Если вам нужны ответы на другие уровни, смотрите страницу CodyCross Планета Земля Группа 3 Пазл 4 ответы.

Все 20 наиболее распространенных «подводных камней» для начинающих веб-разработчиков

Russian (Pусский) translation by AlexBioJS (you can also view the original English article)

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

Учитесь на наших ошибках; не повторяйте их!

Советы по JavaScript

1. Ненужные манипуляции с DOM

Модель DOM (* Document Object Model – Объектная модель документа) работает медленно. За счет ограничения взаимодействия с ней производительность вашего кода значительно повысится. Взгляните на нижеприведенный (неудачный) код:

В этом коде, собственно, DOM модифицируется 100 раз и создается 100 излишних объектов jQuery. 100! Более правильно было бы либо воспользоваться фрагментом документа (* интерфейс DocumentFragment представляет собой минимальный объект документа, у которого нет родителя. Используется для хранения сегмента структуры документа, состоящей из узлов. Поскольку он не является частью древовидной структуры активного документа, то изменения, внесенные во фрагмент, не влияют на документ; содержит другое дерево узлов, недоступных для скриптов и стилей) либо собрать строку из 100 элементов
и затем добавить этот HTML-код к элементу, в котором он должен находиться. При этом подходе вы взаимодействуете с DOM только раз. Ниже показан пример:

Как было упомянуто выше, при этом мы взаимодействуем с DOM только раз, что хорошо, однако для создания большой строки здесь используется конкатенации строк (* операция последовательного объединения двух или более элементов данных в один, например нескольких строк символов в одну строку, нескольких текстовых файлов в один файл и т. п. Так, конкатенация строк «ABC» и «DE» даст строку «ABCDE»). Имеется иной подход к решению этой проблемы – при помощи массивов.

При создании больших строк сохранение каждого кусочка строки в качестве элемента массива и вызов join() , вероятно, является более элегантным решением, чем конкатенация строк. Это один из наиболее быстрых и простых способов объединения HTML-элементов в коде JavaScript без использования библиотеки шаблонов или фреймворка.

Мастер Йода рекомендует:  Верстка сайта - шпаргалка для начинающих

2. Непоследовательность при наименовании переменных и функций в JavaScript

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

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

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

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

Иногда вы могли бы наименовать функцию на основе возвращаемого ею значения. Например, вы могли бы наименовать функцию, что возвращает строку с кодом HTML, getTweetHTML() . Также вы могли бы добавить в начале имени функции do , если функция просто выполняет какое-то действие и не возвращает никакого значения, например doFetchTweets() .

При наименовании конструкторов (* функция-член класса с тем же именем, что и сам класс, создающая и инициализирующая объект данного класса; в Javascript конструктором становится любая функция, вызванная через new) обычно придерживаются принципа наименования классов в других языках, набирая первый символ в верхнем регистре.

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

3. Использование hasOwnProperty() в циклах for. in

Массивы JavaScript не являются ассоциативными; попытки использования их в этой роли не одобряются сообществом. С объектами, с другой стороны, можно обращаться как с хэш-таблицами (* таблица (хранящая записи, указатели, пароли и т. д.), для работы с которой используется хэш-кодирование; структура данных, реализующая интерфейс ассоциативного массива, а именно, она позволяет хранить пары (ключ, значение) и выполнять три операции: операцию добавления новой пары, операцию поиска и операцию удаления пары по ключу), и вы можете производить итерацию над свойствами объекта при помощи цикла for. in следующим образом:

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

Вы можете разрешить ее за счет использования метода hasOwnProperty() . Ниже показан пример:

В этой версии кода выводятся только значения свойств, которые непосредственно принадлежат someObject .

4. Сравнение булевых значений

Сравнение булевых значений в условии – пустая трата времени вычислений. Взгляните на следующий пример:

Обратите внимание на условие foo == true . Сравнение foo и true излишне, поскольку foo уже является логическим значением (или значением «истина» / «ложь»). Вместо сравнения foo просто используйте его в качестве условия как показано ниже:


Для проверки, является ли значением условия «ложь» используйте логический оператор NOT как показано ниже:

5. Обработка событий

События – сложный вопрос в JavaScript. Прошли уже дни, когда разработчики пользовались встроенными обработчиками событий onclick (за исключением некоторых редких случаев реализации начальной страницы веб-сайта (* обычно содержит логотип, информацию о версии, об авторских и/или лицензионных правах)). Вместо этого используйте всплытие (* когда события «всплывают» от внутреннего элемента вверх через родителей) и погружение событий (* наоборот).

Давайте представим, что у вас имеется контейнер с изображениями, при нажатии по которым должно запускаться модальное окно (* блокирует взаимодействие пользователя с приложением, инициирующим диалог; в графическом интерфейсе пользователя (GUI) — дочернее окно (child window) для взаимодействия пользователя с приложением: оно служит для получения информации от приложения или для ввода запрашиваемых данных и выбора опций; поэтому модальное окно часто называется диалоговым. Если открывается модальное окно, то возврат управления приложению может произойти только после реакции пользователя. B Windows могут открываться только модальные окна, относящиеся к одному и тому же приложению; модальное окно). Ниже показано то, чего вам не следует делать. Обратите внимание: мы используем в этом примере jQuery, предполагая, что вы тоже используете подобную библиотеку. Если нет, то знайте, что тот же самый принцип всплытия справедлив и для нативного JavaScript.

Соответствующий код HTML:

Неудачный код JavaScript:

Согласно этому коду перед вызовом модульного окна происходит передача якорного элемента, что является ссылкой на полноразмерное изображение. Вместо того чтобы привязывать обработчик события к каждому якорному элементу, добавляйте его к элементу с идентификатором #grid-container .

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

6. Избегайте избыточного использования тернарных выражений

Излишнее использование тернарных выражений довольно распространено при использовании JavaScript и PHP.

Условное выражение всегда возвращает значение true или false , так что вам нет необходимости явно добавлять true / false в качестве значений тернарного выражения. Вместо этого вы могли бы просто вернуть условное выражение:

Советы по PHP

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

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

Этот код можно сократить до одной строчки при помощи тернарного оператора, при этом сберегая читабельность, следующим образом:

Этот код четкий, лаконичный и выполняет то, что вам нужно.

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

8. Выбрасывайте исключения вместо вложений в стиле фильма «Начало»

(* исключение – необычная, непредусмотренная или ошибочная ситуация, которая может возникнуть при выполнении программы и изменить её нормальное функционирование; («Начало» (фильм, 2010) («Inception») – научно-фантастический триллер Кристофера Нолана). Давайте глянем правде в глаза: если вы используете множество уровней вложения, то ваш код выглядит ужасно и его трудно поддерживать. Следующий код – относительно упрощенный пример, однако ситуация ухудшается с течением времени:

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

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

Мнение третьей, незаинтересованной стороны: будьте очень очень осторожны при использовании исключений для управления исполнением программы (* определяет, какие операторы программы исполняются; термин относится к операторам циклов и if-then, for, switch, которые именуются flow-of-control statements (операторы потока управления)). За дополнительной информацией обращайтесь сюда.

9. Методы, в которых в случае ошибки возвращается false

Польза от получения исключения в случае возникновения ошибки значительно больше, чем от получения значения false.

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

В PHP – особенно при использовании старых фреймворков вроде CodeIgniter – у вас получается то, что я называю кодом, в котором при возникновении ошибок возвращается значение false (в противоположность тому, когда в этих случаях выбрасывается исключение). Вместо выбрасывания вам исключения в таком коде просто возвращается значение false , и строка с ошибкой присваивается каком-то другому свойству. В результате вам необходимо достать ее из класса при помощи метода get_error() .

Польза от получения исключения в случае возникновения ошибки значительно больше, чем от получения значения false. При возникновении в вашем коде ошибки (например «не получилось подключиться к S3 (* Amazon Simple Storage Service (Amazon S3) – онлайновая веб-служба, предлагаемая Amazon Web Services, предоставляющая возможность для хранения и получения объёма данных, так называемый файловый хостинг) для закачивания изображения» или «значение отсутствует») выбрасывайте исключение. Вы также можете выбрасывать специальные типы исключений при помощи классов, полученных в результате расширения класса Exception , следующим образом:

За счет выбрасывания пользовательского исключения отладка программы значительно облегчается.

10. Используйте Guard Clauses

(* Guard Clauses – предохранительные выражения; при этом вы выполняете команду возврата на той же строке, сохраняя тот же отступ для последующего кода). Обычно используют оператор if для контроля исполняемой ветви функции или метода. Так и тянет проверить условие и выполнить большое количество кода в случае, если результатом проверки условия является true , и просто выполнить команду возврата в выражении с оператором else . Например:

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

Не более ли он читабелен? Это незначительное изменение значительно улучшает читабельность вашего кода.

11. Используйте цикл while для простых итераций

(* итерация – процесс повторяющегося выполнения последовательности операторов или команд). Цикл for обычно используется, когда вам необходим например счетчик (* переменная в программе или аппаратный регистр, определяющий число повторений какой-либо операции или число событий, например счетчик цикла). Ниже дается пример простого цикла for :

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

Не всегда он подходит для каждого случая, однако это один из альтернативных вариантов.

12. Пишите методы так, чтобы их было удобно сопровождать

Это несомненно одна из наиболее частых ошибок, совершаемых новичками.


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

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

Вот видите – более четкий код, который легче отлаживать!

13. Избегайте многоуровневых вложений

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

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

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

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

В этих случаях оформите вложенные методы в виде отдельных методов:

14. Избегайте использования магических чисел и строк

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

укажите, что те строки и числа обозначают, и присвойте их переменным со значимыми именами, например так:

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

15. Используйте встроенные функции массива

Используйте встроенные функции массива вместо foreach() .

Не самый лучший вариант:

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

16. Не злоупотребляйте переменными

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

В переменной $result нет необходимости. В следующем коде эта переменная опущена:

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

Советы по программированию в целом

17. Полагайтесь на возможности процессора базы данных

(* процессор базы данных – часть СУБД, которая на физическом уровне сохраняет данные и манипулирует ими в соответствии с командами, поступающими от приложений). Если у вас имеются мысли по сокращению кода, то это – чутье кода (* наименование тех инстинктивных мыслей, которые возникают у вас при просмотре кусочка далекого от идеала кода).

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

Например, вы можете избежать избыточных запросов к базе данных во многих случаях. В большинстве скриптов для управления записями пользователей, работающих по принципу «подключи и работай» (* принцип автоматического распознавания и конфигурирования подключённых устройств, реализуемый в компьютерах и отдельных их компонентах и широко поддерживаемый ОС Windows), используются два запроса для выполнения регистрации пользователей: один для проверки, существует ли уже e-mail/username (* адрес электронной почты/имя пользователя), и другой для собственно добавления его в базу. Намного более удачный подход реализуется за счет задания ограничивающего условия UNIQUE для поля, в которое добавляются имена пользователей. Затем вы можете воспользоваться нативными функциями MySQL для проверки, была ли запись добавлена в базу данных.

18. Именуйте ваши переменные надлежащим образом

Прошли дни, когда вы именовали ваши переменные x , y , z (разве что, конечно же, вы работаете с системой координат). Переменная является важной частью логики вашего приложения. Не хотите набирать длинное имя? Обзаведитесь более продвинутой IDE (* интегрированная среда разработки). Современные IDE предоставляют возможность мгновенного автозаполнения (* функциональная возможность, предоставляемая программным обеспечением, благодаря которой части слов или строк добавляются без участия пользователя) имен переменных.

Если вы постоянно программируете, то уверены ли вы, что вспомните назначение тех переменных $sut через год? Вероятно, нет: именуйте переменные в соответствии с их назначением. Если у вас имеются мысли по сокращению кода, то это – чутье кода (* наименование тех инстинктивных мыслей, которые возникают у вас при просмотре кусочка далекого от идеала кода).

19. Именуйте методы в соответствии с выполняемыми ими действиями

Ошибки случаются; главное – учиться на них.

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

Также избегайте использования какого-либо языка за исключением английского при наименовании ваших методов. Досадно, когда вы встречаете имена вроде 做些什麼() или делатьчтото() в вашем проекте. Другие разработчики, вероятно, не поймут ваш код. Возможно это и не легко, но, как бы там ни было, английский – официальный язык для написания кода. Постарайтесь использовать его, если работаете в большой команде.

20. Советы по структурированию кода программы

Наконец, структура кода так же важна для читабельности и удобства сопровождения, как и все остальное, о чем мы говорили в этом руководстве. Вот вам две рекомендации:

  • Используйте отступы шириной в четыре или два пробела. Отступы большей величины, например в восемь пробелов, – слишком много, и из-за этого ваш код будет трудно читать.
  • Установите приемлемую ширина строки и придерживайтесь ее. Сорок символов в строке? Мы больше не в 70-х; установите в качестве предела ширины строки 120 символов, отметьте это на экране и сделайте так, чтобы ваша IDE придерживалась его. При таком лимите вам предоставляется достаточная ширина и нет необходимости прокручивать код.

Заключение


«Я никогда не делал глупой ошибки при программировании» – Никто и никогда.

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

8 подводных камней в работе с Google Analytics

Анна Солдатова

Главное в работе с digital-аналитикой — не стать заложником цифр. Как бы красиво ни выглядели данные на экране, в реальности всё может быть совсем не так. Учимся смотреть в тёмные глубины digital-аналитики вместе.

Анна Солдатова
Получайте новые статьи на e‑mail

Пишем о будущем, технологиях и стартапах

Ещё по теме

Почему digital-аналитики нужны бизнесу

Профессия digital-аналитик в маркетинге и e-commerce

Digital-аналитик: как стать незаменимым для бизнеса

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

Ниже восемь наиболее распространённых подводных камней в работе с Google Analytics (далее GA) и советы, как их обойти и получить верные данные.

Ловушка №1: Рост «Тёмного трафика»

Масштаб этой проблемы связан с прямым трафиком (direct traffic) и увеличивается вместе с размером общего трафика сайта. Прямым трафик считается, если пользователь переходит на сайт, введя URL прямо в строку браузера. Если ваш сайт невелик, и прямых заходов на него не так много — отследить их большого труда не составит. Совсем иначе обстоят дела у популярных порталов.

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

• электронные письма (когда, например, кто-то из друзей присылает вам письмо с — интересной ссылкой на публикацию);

• различные документы (ссылки в файлах PDF, презентациях, Excel, Word и т.д.);

• поисковики (клики на залинкованные картинки);

Насколько велик масштаб бедствия? Компания Groupon провела исследование, в рамках которого смогла добровольно деиндексировать себя. Они обнаружили, что около 60% их прямого трафика на самом деле приходится на обычные поисковые запросы (organic search).

Решение

Распознать правильно 100% тёмного трафика почти невозможно, а вот снизить процент погрешности вполне реально:

• Используйте компоновщик utm-меток Google для маркировки всех ваших ссылок.

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

• Создайте дополнительный сегмент в отчете «Источники трафика» в GA.

Ловушка №2. Упор на «тщеславие метрик»

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

Решение

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

Популярная хостинговая платформа Kinsta говорит, что почти ¾ трафика сайта будут отскакивать, если страница не загружается в течение пяти секунд. Иными словами, если для пользователя ваш сайт «тормозит», большинство людей закроет вкладку. Поэтому стоит обратить внимание на хостинг-провайдера. Иногда совершенно неважно, насколько чист ваш код, сколько изображений вы сжимаете или какую сеть доставки содержимого (CDN) вы используете.

Мастер Йода рекомендует:  Зарабатываем с помощью компьютера

Ловушка №3. Узкий взгляд на источники конверсии

Полагаете, что трафик с платных рекламных объявлений даёт большую конверсию, а выхлоп с Facebook минимален? Такое заблуждение приводит к тому, что вы упускаете из вида тактики, которые «помогают» конверсии. Интересные данные. В 2012 году компания Forrester Research проанализировала более 77 тыс. онлайн-покупок, чтобы определить основные ресурсы, с которых приходят клиенты. Они выяснили, что:

• 33% клиентов имели больше одного отслеживаемого контакта с ресурсами компаний;

• 48% клиентов, которые делают повторную покупку, имели сразу несколько отслеживаемых контактов;

• Среди повторных покупок 30% были совершены после получения e-mail рассылки.

C 2012 года социальные сети как инструмент продаж определённо поднялись. Онлайн-магазину товаров для детей SpearmintLOVE удалось повысить свой доход на 991% за год преимущественно через рекламу на Facebook. На что же опираться в анализе? Обращайте внимание на все каналы в цепочке взаимодействия с пользователем, рисуйте карты их путешествий (customer journey maps), чтобы понять настоящую роль ресурса в продажах. Не заостряйте внимание на канале, который в конечном итоге привёл клиента на сайт для совершения покупки.

Решение


В GA есть несколько вариантов моделирования атрибуции, которые вы можете попробовать в зависимости от вашей бизнес-модели или покупательского поведения пользователей:

По последнему непрямому клику: игнорирует все прямые клики, 100% ценности конверсии идёт на последний канал, через который пришёл клиент до конверсии.

Первое взаимодействие: 100% ценности конверсии идёт на канал, при помощи которого произошло первое взаимодействие клиента и компании.

Линейная: каждому каналу в пути клиента к сделке присваивается одинаковый % ценности конверсии.

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

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

Ловушка №4. Отсутствие отслеживания конверсии с офлайн-каналов

Каков средний коэффициент конверсии веб-сайта? Процент или два? Теперь сравните это с телефонными звонками, которые конвертируют где-то 30-50%. Неплохо, правда? Телефонные звонки являются важной частью интернет-маркетинга. Ожидается, что к 2020 году из мобильных поисковых систем будет осуществляться около 60 млрд звонков в компании, что на 82% больше, чем в 2020 году. Хотите больше конверсий — «отполируйте» свой телефонный номер.

Решение

Самым простым решением будет настройка отслеживания событий. По сути вы будете видеть, когда кто-то с мобильного устройства кликает на сайте на ваш номер. Как сделать? Можно добавить эту строку в заголовок своего сайта:

Ловушка №5. Вводящие в заблуждение A/B тесты

Практика показывает, что в большинстве случаев A/B тесты ничего не дают. Но гораздо хуже, когда они приносят необоснованно красивый результат. Эксперименты в Google Analytics, хотя и не считаются по формату чистыми A/B тестами, по сути почти им идентичны. Конечно, полезно проверять какие-то свои гипотезы по интерфейсу сайта, но не каждое мелкое нововведение. У Blivakker.no, ведущего онлайн-магазина красоты в Норвегии, получилось увеличить конверсию на 11%, просто удалив несколько полей в контактной форме сайта. Пара минут — и необоснованный результат, за который будет драться отдел маркетинга, готов. Другой вопрос, что это вовсе не означает увеличение оплаченных сделок.

Решение

Забудьте о карте целей (goals overview) и посмотрите визуализацию последовательностей (funnel visualization). Проще говоря этапы воронки продаж. Так вы точно поймёте, на каком этапе произошли изменения.

Ловушка №6. Призрачный спам

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

Чем грозит такое спамерство? «Призраки» портят статистику. Особенно сайтов с невысокой посещаемостью. Ещё меньше приятного, когда такие всплески логично ложатся на маркетинговые активности компании. Если видите на графике трафика равномерные волны, никак не коррелирующие с вашей деятельностью, или внезапные пики активности — пришло время проверить источники трафика.

Решение

Ниже два варианта, как проверить источники:

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

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

Пока Google не придумает что-то получше, это оптимальные и простые способы. Осознание существующей проблемы — уже большой шаг, который позволит вам лучше интерпретировать аналитику. И помните: ваш сайт ничем не болен и не заражён. Более того, случайные спамеры о нем ничего не знают. Своих «клиентов» они ищут по номерам счётчиков Яндекс.Метрики и Google Analytics.

Ловушка №7. Ложный всплеск трафика

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

Решение

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

Ловушка №8. Завышенная стоимость конверсии

Поведение пользователя может привести к тому, что GA продемонстрирует вам смехотворно высокую стоимость конверсии в CPC-кампаниях (Cost-Per-Click, оплата за клики). Вот сценарий того, что может произойти. Большое число клиентов увидело ваши платные объявления. На ссылку они не кликнули, но заинтересовались. Возможно, они открыли поисковик, зашли на вашу домашнюю страницу или нашли вас в социальных сетях — итог один: они решили что-то купить. Всё это началось с вашего платного объявления, пусть оно и не получило достойного признания в GA.

Решение

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

Работа в digital-аналитике имеет кучу тонкостей, и приведённые выше примеры — лишь малая часть из них. Хотите знать больше? Приходите на курс «Профессия digital-аналитик в маркетинге и e-commerce».

10 подводных камней, подстерегающих при создании лэндингов

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

1. Время создания сайта может оказаться неприемлемым
Это для Вас время деньги, а для подрядчика это может быть и не так. Знаете сколько в среднем фрилансер создает хороший сайт? Месяц! У Вас есть этот месяц.

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

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

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

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


6. Отсутствие автоматического сбора контактных данных
Вроде бы не большая проблема, но представьте себе ситуацию, когда Вы хотите оповестить своих клиентов о новом продукте. Вы будете перебирать сотни старых писем вручную, чтобы вытащить оттуда их е-мэил?

7. Сложная переносимость сайта
Спросите у тех, кто это уже делал всегда ли перенос сайта является простой задачей? 90% ответят Вам, что при этом возникают какие-то нелепые проблемы

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

9. Сложная система администрирования
Стрельба из пушки по воробьям очень распространенная забава среди разработчиков сайтов. Зачастую заманивая фразой «широкая функциональность», Вас обрекают на много часовое чтение документации и надоедающую игру с настройками сайта

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

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

99 Пожалуйста дождитесь своей очереди, идёт подготовка вашей ссылки для скачивания.

Скачивание начинается. Если скачивание не началось автоматически, пожалуйста нажмите на эту ссылку.

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

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

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

Нил Смит, Патрисия О’Коннелл

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

Nell Smith, Patricia O’Connell

HOW EXCELLENT COMPANIES AVOID DUMB THINGS BREAKING THE 8 HIDDEN BARRIERS THAT PLAGUE EVEN THE BEST BUSINESSES

Published by arrangement with St Martin’s Press, LLC All rights reserved

Text Copyright © NTS, LLC, 2012

© Перевод и издание на русском языке, ЗАО «Издательство Центрполиграф», 2014

© Художественное оформление, ЗАО «Издательство Центрполиграф», 2014

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

Эта книга никогда не была бы написала без чуткого руководства Патрисии О’Коннелл. С первой встречи с Патрисией на днях журнала Business Week я почувствовал в ней родственную душу. Она сразу проявила интерес к моему замыслу и разглядела потенциал в этой книге. После долгих часов, проведенных в горячих спорах, она сделала мои мысли более понятными, и под ее рукой засверкали мои слова. То, что вам понравилось в книге, и то, как она написана, все это заслуги Патрисии; если что-то непонятно, то это, скорее всего, протащил в книгу я, не прислушавшись к ее мнению.

По счастливой случайности я провел вечер в Калифорнии с доктором Ричардом Леваком и его замечательной женой Линдой. Ричард, один из ведущих специалистов в области изучения поведения человека, только что вернувшийся с ток-шоу Larry King Live, с большим интересом слушал о моих занятиях. Я поделился с ним своим видением скрытых барьеров, и он объяснил мне, почему многие из них предсказуемы с точки зрения поведения человека. Для меня большая честь, что он поделился своими знаниями в этой книге.

Мне повезло, что примерно 15 лет назад я встретил Джина Людвига, в то время контролера денежного обращения США, а теперь исполнительного директора Promontory Growth and Innovation. Все, кто знаком с Джином, сразу признают, что он мудрый и проницательный человек. Как в 1990-х годах его инициативы способствовали преобразованию банковской системы, так и его способность проникать в суть вещей оказала влияние на мои попытки усовершенствовать процесс. В конце 1990-х Джин правильно рассудил, что не следует ограничиваться компаниями, столкнувшимися с трудностями. В действительности и некоторые очень успешные компании искали быстрый и безболезненный способ увеличить прибыль. Его проницательность изменила мой способ ведения бизнеса, и именно он нашел первого клиента, который был лидером в своей отрасли, для моей предыдущей фирмы. Сейчас я даже более счастлив, чем был тогда. В течение трех последних лет я с гордостью называю Джина своим партнером.

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

Успех работы с клиентами на самом деле принадлежит не мне, а моим старшим коллегам, с которыми я работал над каждым из заданий. Впервые я встретился с Яной Николсон, когда она возглавляла кадровую службу моего бывшего клиента. Моя работа не была бы возможна без ее острой интуиции и природных способностей. Доктор Фред Велинг сотрудничал со мной в ряде проектов. Этот же процесс с небольшими изменениями использовался как минимум пятью компаниями, которые нанимали меня в эти годы. Мелани Линдси, накопившая большой опыт работы по обе стороны Атлантики, вносит неповторимую особенность в то, что мы делаем. Ее мудрость и знания часто оказывают влияние на наше мнение. Джордж Светлиц, вероятно, один из самых опытных специалистов в искусстве совершенствования организации производства. Как и я, он более 20 лет работает над этим и предыдущими проектами. В 1980-х в Индонезии мы вместе работали с очень примитивной версией процесса совершенствования, описанного в этой книге. Джина Макдоналд, спокойная и уверенная, служит примером, и ее уважают все, с кем она сотрудничает. Я также благодарю Лауру Катона и Кэти Виллела за помощь, оказанную в написании книги.

Ценность книги возросла после первого обсуждения ее с Лори Хартинг в международном научном книжном издательстве Palgrave Macmillan. Было ясно, что она сразу поняла суть скрытых барьеров, и ее энтузиазм и целеустремленность шаг за шагом провели меня и книгу по длинному пути. После Лори я даже не могу представить себе работу с другим редактором. Она лучшая в своем деле. Моя благодарность ей и ее коллегам, которые сделали эту книгу реальностью.

Нил Смит, генеральный директор Promontory Growth and Innovation

Как компании-лидеры избегают бестолковых решений

Моей прекрасной жене Джине – человеку, который помог мне избежать глупостей, – за ее любовь, терпение и понимание. Она – моя скала. Трудно представить, куда бы завела меня жизнь без ее веры и поддержки. Моим дочерям, Брианне, Кэролайн и Шарлотте, и сыну Алексу, которые освещают нашу жизнь, и со своим энтузиазмом, доброжелательностью и юмором служат для нас источником вдохновения. Я нашел истинный смысл жизни. Спасибо, и любви каждому из вас.

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

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

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

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

В среднем тест стоит пять долларов. Мой клиент делал в год более двух миллионов тестов. Ежегодно счет за тестирование на ВИЧ составлял более 10 миллионов долларов.

Одному сотруднику лаборатории пришла идея. «Почему бы нам не объединять пробы крови 20 человек и не делать проверку этого смешанного образца? Если реакция будет отрицательной, значит, среди этих 20 человек нет инфицированных. Если положительная, мы проверим каждого из двух десятков отдельно, чтобы найти зараженного».

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

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

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

[Перевод] 50 оттенков Go: ловушки, подводные камни и распространённые ошибки новичков 09.11.2020 15:03

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

Мастер Йода рекомендует:  Гайдлайны для новичков в Android-разработке что прямо сейчас намотать на ус

Содержание
Уровень: абсолютный новичок

1. Открывающую фигурную скобку нельзя размещать в отдельной строке
2. Неиспользуемые переменные
3. Неиспользуемые импорты
4. Короткие объявления переменных можно использовать только внутри функций
5. Переобъявления переменных с помощью коротких объявлений
6. Нельзя использовать короткие объявления переменных для настройки значений полей
7. Случайное сокрытие переменных
8. Нельзя использовать nil для инициализации переменной без явного указания типа
9. Использование nil-слайсов (slice) и хеш-таблиц (map)
10. Ёмкость хеш-таблиц
11. Строки не могут быть nil
12. Передача массивов в функции
13. Неожиданные значения в выражениях range в слайсах и массивах
14. Одномерность слайсов и массивов
15. Обращение к несуществующим ключам в map
16. Неизменяемость строк
17. Преобразование строк в байт-слайсы (Byte Slices), и наоборот
18. Строки и оператор индекса
19. Строки — не всегда текст в кодировке UTF-8
20. Длина строк
21. Отсутствующая запятая в многострочных литералах slice/array/map
22. log.Fatal и log.Panic не только журналируют
23. Несинхронизированные операции встроенных структур данных
24. Итерационные значения для строк в выражениях range
25. Итерирование хеш-таблиц (map) с помощью выражения for range
26. Сбойное поведение в выражениях switch
27. Инкременты и декременты
28. Побитовый NOT-оператор
29. Различия приоритетов операторов
30. Неэкспортированные поля структур не кодируются
31. Выход из приложений с помощью активных горутин
32. При отправке в небуферизованный канал данные возвращаются по мере готовности получателя
33. Отправка в закрытый канал приводит к panic
34. Использование «nil»-каналов
35. Методы, принимающие параметры по значению, не меняют исходных значений

Уровень: более опытный новичок

36. Закрытие тела HTTP-ответа
37. Закрытие HTTP-соединений
38. Десериализация (unmarshalling) JSON-чисел в интерфейсные значения
39. Сравнение struct, array, slice и map
40. Восстановление после panic
41. Обновление и привязка значений полей в slice, array и map в выражениях for range
42. «Скрытые данные» в слайсах
43. «Повреждение» данных в слайсах
44. «Устаревшие» слайсы
45. Методы и объявления типов
46. Как выбраться из кодовых блоков for switch и for select
47. Итерационные переменные и замыкания в выражениях for
48. Вычисление аргумента блока defer (Deferred Function Call Argument Evaluation)
49. Вызов блока defer
50. Ошибки при приведении типов
51. Блокированные горутины и утечки ресурсов

Уровень: продвинутый новичок

52. Применение методов, принимающих значение по ссылке (pointer receiver), к экземплярам значений
53. Обновление полей значений в хеш-таблице
54. nil-интерфейсы и nil-интерфейсные значения
55. Переменные стека и кучи
56. GOMAXPROCS, согласованность (concurrency) и параллелизм
57. Изменение порядка операций чтения и записи
58. Диспетчеризация по приоритетам (Preemptive Scheduling)

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

Ошибка компилирования:
Правильно:
2. Неиспользуемые переменные
Если у вас есть неиспользуемые переменные, то код не скомпилируется. Исключение: переменные, которые объявляются внутри функций. Это правило не касается глобальных переменных. Также можно иметь неиспользуемые аргументы функций.

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

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

Ошибки компилирования:
Правильно:
Другое решение: удалить или закомментировать неиспользуемые импорты. В этом поможет инструмент goimports.4. Короткие объявления переменных можно использовать только внутри функций
Неправильно:
Ошибка компилирования:
Правильно:
5. Переобъявления переменных с помощью коротких объявлений
В одной области видимости выражения нельзя переобъявлять переменные, но это можно делать в объявлении нескольких переменных (multi-variable declarations), среди которых хотя бы одна — новая. Переобъявляемые переменные должны располагаться в том же блоке, иначе получится скрытая переменная (shadowed variable).
Неправильно:
Ошибка компилирования:
Правильно:
6. Нельзя использовать короткие объявления переменных для настройки значений полей
Неправильно:
Ошибка компилирования:
Хотя разработчикам Go уже предлагали это исправить, не стоит надеяться на перемены: Робу Пайку нравится всё «как есть». Вам помогут временные переменные. Или предварительно объявляйте все свои переменные и используйте стандартный оператор присваивания.

7. Случайное сокрытие переменных
Синтаксис короткого объявления переменных так удобен (особенно для тех, кто пришёл в Go из динамических языков), что его легко принять за регулярную операцию присваивания. Если вы сделаете эту ошибку в новом блоке кода, то компилятор не выдаст ошибку, но приложение будет работать некорректно.
Это очень распространённая ошибка даже среди опытных Go-разработчиков. Её легко совершить и трудно заметить. Для выявления подобных ситуаций можно использовать команду vet. По умолчанию она не выполняет проверку переменных на скрытость. Поэтому используйте флаг -shadow: go tool vet -shadow your_file.go 8. Нельзя использовать nil для инициализации переменной без явного указания типа
Идентификатор nil можно использовать как «нулевое значение» (zero value) для интерфейсов, функций, указателей, хеш-таблиц (map), слайсов (slices) и каналов. Если не задать тип переменной, то компилятор не сможет завершить работу, потому что не сумеет угадать тип.

Ошибка компилирования:
Правильно:
9. Использование nil-слайсов (slice) и хеш-таблиц (map)
Можно добавлять элементы в nil -слайс, но если то же самое сделать с хеш-таблицей, то это приведёт к runtime panic.

Неправильно:
10. Ёмкость хеш-таблиц
Можно устанавливать ёмкость при создании хеш-таблиц, но нельзя применять к ним функцию cap() .

Ошибка компилирования:
11. Строки не могут быть nil
Это подводный камень для начинающих, которые присваивают строковым переменным nil -идентификаторы.

Ошибки компилирования:
Правильно:

12. Передача массивов в функции
Если вы разрабатываете на С/С++, то массивы для вас — указатели. Когда вы передаёте массивы функциям, функции ссылаются на ту же область памяти и поэтому могут обновлять исходные данные. В Go массивы являются значениями, так что, когда мы передаём их функциям, те получают копию исходного массива. Это может стать проблемой, если вы пытаетесь обновлять данные в массиве.
Если нужно обновить исходные данные в массиве, используйте типы указателей массива.
Другое решение: слайсы. Хотя ваша функция получает копию переменной слайса, та всё ещё является ссылкой на исходные данные.
13. Неожиданные значения в выражениях range в слайсах и массивах
Это может произойти, если вы привыкли к выражениям for-in или foreach в других языках. Но в Go выражение range отличается тем, что оно генерирует два значения: первое — это индекс элемента (item index), а второе — данные элемента (item data).

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

Можно создавать динамические многомерные массивы с помощью обычных одномерных массивов, слайсов из «независимых» слайсов, а также слайсов из слайсов «с совместно используемыми данными».

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

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

Создание динамического многомерного массива с помощью слайсов из слайсов «с совместно используемыми данными» состоит из трёх шагов. Сначала нужно создать слайс, выполняющий роль «контейнера» данных, он содержит исходные данные (raw data). Затем — внешний слайс. В конце мы инициализируем каждый из внутренних слайсов, перенарезая слайс с исходными данными.
Предлагается разработать спецификацию на многомерные массивы и слайсы, но сейчас, судя по всему, у этой задачи низкий приоритет.15. Обращение к несуществующим ключам в map
Эту ошибку совершают разработчики, которые при обращении к несуществующему ключу ожидают получить nil -значение (как это происходит в некоторых языках). Возвращаемое значение будет nil , если «нулевое значение» для соответствующего типа данных — nil . Но для других типов возвращаемое значение окажется другим. Определять, существует ли запись в хеш-таблице (map record), можно с помощью проверки на правильное «нулевое значение». Но это не всегда надёжно (например, что вы будете делать, если у вас есть таблица булевых значений, где «нулевое значение» — false). Самый надёжный способ узнать, существует ли запись, — проверить второе значение, возвращаемое операцией доступа к таблице.

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

Ошибка компилирования:
Правильно:
Стоит заметить, что это неправильный способ обновления символов в текстовой строке, потому что символ может состоять из нескольких байтов. В этом случае лучше конвертировать строку в слайс из «рун» (rune). Но даже внутри слайсов из «рун» одиночный символ может быть разбит на несколько рун, например если есть символ апострофа (grave accent). Такая непростая и запутанная природа «символов» является причиной того, что в Go строковые значения представляют собой последовательностей байтов. 17. Преобразование строк в байт-слайсы (Byte Slices), и наоборот
Когда вы преобразуете строку в байт-слайс (и наоборот), вы получаете полную копию исходных данных. Это не операция приведения (cast operation), как в других языках, и не перенарезка (reslicing), когда переменная нового слайса указывает на один и тот же массив, занятый исходным байт-слайсом.

В Go есть несколько оптимизаций для преобразований из []byte в string и из string в []byte , позволяющих избегать дополнительных выделений памяти (ещё больше оптимизаций в списке todo).

Первая оптимизация позволяет избежать дополнительного выделения памяти, когда ключи []byte используются для поиска записей в коллекциях map[string]: m[string(key)] .

Вторая оптимизация позволяет избегать дополнительного выделения в выражениях for range , когда строки преобразуются в []byte: for i,v := range []byte(str) <. >.

18. Строки и оператор индекса
Оператор индекса, применяемый к строке, возвращает байтовое значение (byte value), а не символ (как в других языках).
Если нужно обратиться к конкретным «символам» (кодовым точкам/рунам Unicode), то используйте выражение for range . Также вам будут полезны официальный пакет unicode/utf8 и экспериментальный utf8string (golang.org/x/exp/utf8string). utf8string включает в себя удобный метод At() . Можно также преобразовать строку в слайс рун (slice of runes).19. Строки — не всегда текст в кодировке UTF-8
Строковые значения необязательно должны быть представлены в виде текста в кодировке UTF-8. Здесь возможен произвольный набор байтов. Единственный случай, когда строки должны быть в кодировке UTF-8, — когда они используются как строковые литералы. Но даже они могут включать в себя данные с экранированными последовательностями.

Чтобы узнать кодировку строки, используйте функцию ValidString() из пакета unicode/utf8.

20. Длина строк
Допустим, вы разрабатываете на Python и у вас есть такой код:
Если преобразовать его в аналогичный код на Go, то результат может вас удивить.
Встроенная функция len() возвращает не символ, а количество байт, как это происходит с Unicode-строками в Python.

Чтобы получить такой же результат в Go, используйте функцию RuneCountInString() из пакета unicode/utf8.

Технически функция RuneCountInString() не возвращает количество символов, потому что один символ может занимать несколько рун.
21. Отсутствующая запятая в многострочных литералах slice/array/map
Неправильно:
Ошибки компилирования:
Правильно:
Вы не получите ошибку компилирования, если оставите замыкающую запятую при объявлении в одну строчку.22. log.Fatal и log.Panic не только журналируют
Библиотеки для логирования часто обеспечивают различные уровни для сообщений. В отличие от других языков, пакет логирования в Go делает больше. Если вызвать его функции Fatal*() и Panic*() , то приложение будет закрыто.
23. Несинхронизированные операции встроенных структур данных
Некоторые возможности Go нативно поддерживают многозадачность (concurrency), но в их число не входят потокобезопасные коллекции (concurrency safe). Вы сами отвечаете за атомарность обновления коллекций. Для реализации атомарных операций рекомендуется использовать горутины и каналы, но можно задействовать и пакет sync, если это целесообразно для вашего приложения.24. Итерационные значения для строк в выражениях range
Значение индекса (первое значение, возвращаемое операцией range ) — это индекс первого байта текущего «символа» (кодовая точка/руна Unicode), возвращённый во втором значении. Это не индекс текущего «символа», как в других языках. Обратите внимание, что настоящий символ может быть представлен несколькими рунами. Если вам нужно работать именно с символами, то стоит использовать пакет norm (golang.org/x/text/unicode/norm).

Выражения for range со строковыми переменными пытаются интерпретировать данные как текст в кодировке UTF-8. Если они не распознают какую-либо последовательность байтов, то возвращают руны 0xfffd (символы замены Unicode), а не реальные данные. Если в вашей строке хранятся произвольные данные (не UTF-8), то для сохранения преобразуйте их в байт-слайсы.

25. Итерирование хеш-таблиц (map) с помощью выражения for range
На этот подводный камень натыкаются те, кто ожидают, что элементы будут располагаться в определённом порядке (например, отсортированные по значению ключа). Каждая итерация хеш-таблицы приводит к разным результатам. Среда исполнения (runtime) Go пытается сделать всё возможное, рандомизируя порядок итерирования, но ей это не всегда удаётся, поэтому вы можете получить несколько одинаковых итераций (например, пять) подряд.
А если вы используете Go Playground (https://play.golang.org/), то всегда будете получать одинаковые результаты, потому что код не перекомпилируется, пока вы его не измените.26. Сбойное поведение в выражениях switch
Блоки case в выражениях switch по умолчанию прерываются (break). В других языках поведение по умолчанию другое: переход (fall through) к следующему блоку case .
Можно заставить блоки case переходить принудительно с помощью выражения fallthrough в конце каждого блока. Можно также переписать ваше выражение switch , чтобы в блоках использовались списки выражений.
27. Инкременты и декременты
Во многих языках есть операторы инкрементирования и декрементирования. Но в Go не поддерживаются их префиксные версии. Также нельзя в одном выражении использовать оба этих выражения.

Ошибки компилирования:
Правильно:
28. Побитовый NOT-оператор
Во многих языках символ

используется в качестве унарной NOT-операции (aka побитовое дополнение, bitwise complement), однако в Go для этого применяется XOR-оператор (^).

Ошибка компилирования:
Правильно:
Кого-то может запутать, что ^ в Go — это XOR-оператор. Если хотите, выражайте унарную NOT-операцию (например, NOT 0x02 ) с помощью бинарной XOR-операции (например, 0x02 XOR 0xff ). Это объясняет, почему ^ используется для выражения унарной NOT-операции.

Также в Go есть специальный побитовый оператор AND NOT (&^), который легко принять за оператор NOT. AND NOT выглядит как специальная функция/хак ради поддержки A AND (NOT B) без обязательного использования фигурных скобок.

29. Различия приоритетов операторов
Помимо «довольно понятных» (bit clear) операторов (&^), в Go есть набор стандартных операторов, используемых многими другими языками. Но их приоритеты в данном случае не всегда такие же.
30. Неэкспортированные поля структур не кодируются
Поля структур (struct fields), начинающиеся со строчных букв, не будут кодироваться (JSON, XML, GON и т. д.), так что при декодировании структуры вы получите в этих неэкспортированных полях нулевые значения.
31. Выход из приложений с помощью активных горутин
Приложение не будет ждать завершения ваших горутин. Новички часто об этом забывают. Все когда-то начинают — в таких ошибках нет ничего стыдного.
Вы увидите:
Одно из самых популярных решений — переменная WaitGroup . Это позволит главной горутине ожидать завершения работы всех рабочих горутин. Если ваше приложение использует долго выполняемые рабочие горутины с циклами обработки сообщений, то вам понадобится как-то сигнализировать им о том, что пора выходить. Можно отправлять каждой такой горутине сообщение kill . Или закрывать каналы, из которых рабочие горутины получают данные: это простой способ сигнализировать оптом.
Если запустить это приложение, вы увидите:
Похоже, все горутины закончили работать до выхода главной горутины. Замечательно! Однако вы увидите и это:
Нехорошо! Что происходит? Откуда взялась взаимоблокировка? Ведь все вышли и выполнили wg.Done() . Приложение должно работать.

Блокировка возникает, потому что каждый рабочий получает копию исходной переменной WaitGroup . И когда все они выполняют wg.Done() , это никак не влияет на переменную WaitGroup в главной горутине.

Теперь всё работает правильно.32. При отправке в небуферизованный канал данные возвращаются по мере готовности получателя
Отправитель не будет заблокирован, пока получатель обрабатывает ваше сообщение. В зависимости от машины, на которой выполняется код, получающая горутина может и не иметь достаточно времени на обработку сообщения, прежде чем продолжится выполнение отправителя.
33. Отправка в закрытый канал приводит к panic
Получение из закрытого канала безопасно. Возвращаемое значение ok в получаемом выражении (receive statement) станет false , что говорит о том, что никакие данные не были получены. Если вы получаете из буферизованного канала, то получите сначала буферизованные данные, а когда они закончатся, выражение ok станет false .

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

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

Пример с багом можно исправить, сигнализируя через специальный канал отмены (special cancellation channel) остальным рабочим горутинам, что их результаты больше не нужны.

34. Использование «nil»-каналов
В канале nil операции отправки и приёма блокируются навсегда. Это хорошо задокументированное поведение, но оно может стать сюрпризом для новичков.
При выполнении этого кода вы увидите ошибку runtime наподобие fatal error: all goroutines are asleep — deadlock!

Это поведение можно использовать для динамического включения и отключения блоков case в выражении select .

35. Методы, принимающие параметры по значению, не меняют исходных значений
Параметры методов — это как обычные аргументы функций. Если они объявляются значением, то функция/метод получает копию вашего аргумента (receiver argument). Изменения в принятом значении не повлияют на исходное значение, если значение — переменная хеш-таблицы (map) или слайса и вы обновляете элементы коллекции или если обновляемые поля в значении — это указатели.
36. Закрытие тела HTTP-ответа
Делая запрос с помощью стандартной HTTP-библиотеки, вы получаете переменную HTTP-ответа. Даже если вы не читаете тело ответа, всё равно нужно его закрыть. Обратите внимание: это относится и к пустым ответам. О них очень легко забыть, особенно новичкам.

Некоторые новички пытаются закрывать тело ответа, но в неправильном месте.

Этот код будет работать с успешными HTTP-запросами, но в случае сбоя переменная resp может быть nil , что приведёт к runtime panic.

Самый распространённый способ закрыть тело ответа — с помощью вызова defer после проверки ошибочности HTTP-ответа.

В большинстве случаев, когда возникают сбои HTTP-запросов, переменная resp будет nil , а переменная err — non-nil . Но при сбое переадресации обе переменные будут non-nil . Это означает возникновение утечки.

Её можно предотвратить, добавив вызов для закрытия тел ответов non-nil в блоке обработки ошибок HTTP-запросов. Другое решение: использовать один вызов defer для закрытия тел ответов для всех сбойных и успешных запросов.

Исходная реализация resp.Body.Close() также считывает и отклоняет данные оставшихся тел ответов. Благодаря этому HTTP-соединение может быть повторно использовано для другого запроса, если включено поведение keep alive . Поведение самого последнего HTTP-клиента отличается. Теперь вы ответственны за чтение и отклонение оставшихся данных ответов. Если этого не сделать, то HTTP-соединение вместо повторного использования может быть закрыто. Надеюсь, этот маленький подводный камень будет задокументирован в Go 1.5.

Если для вашего приложения важно повторно использовать HTTP-соединени

Добавить комментарий