Да поможет нам Go. Базовые ценности и основы философии языка Go по мотивам курса Билла Кеннеди

May 12, 2018
go William Kennedy о разработке главное

Аннотация

Заметка строится вокруг первой лекции курса Билла Кеннеди (William Kennedy) “Ultimate Go Programming” доступного на safaribook (https://www.safaribooksonline.com/library/view/ultimate-go-programming/9780134757476/). Меня настолько воодушевил данный курс, что показалось интересным сделать некую выжимку своего конспекта по этим лекциям.

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

Everything comes with the cost nothing is free

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

О выборе названия

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

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

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

Пара слов о личности Билла

Билл Кеннеди - известный американский разработчик и лектор, с более чем 25 летним стажем, автор книги “Go In Action” и основной контрибьютер блога GoingGo.net. В 2013 он стал одним из пионеров Go и за это время, как пишут на сайте https://www.ardanlabs.com/, успел обучить свыше 2000 инженеров, работающих в компаниях списка Fortune 100.

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

Введение

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

мы можем начать разрабатывать ПО правильно уже сегодня и Go нам в этом поможет

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

Изменение собственного сознания

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

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

Сегодня технологии и в частности IT устроены таким образом, что “въехать” в них и начать использовать не составит особого труда любому человеку со средними умственными способностями. Так устроен рынок: либо технология доступна для масс, либо она отмирает. В этой постоянной гонке за освоением нового и конкуренцией со “средними людьми” мы часто забываем подумать о том что важно, подумать о том что лежит в основе конкретной технологии, и в конце концов подумать о том что мы делаем.

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

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

Цена решений

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

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

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

Продуктивность против Производительности

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

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

Мультипроцессорность стала популярна на рынке в 2004 г. Cейчас 2018 г., а мейнстримом все так же продолжает быть мультипроцессорность. Однако большинство языков создавалось еще до эпохи мультипроцессорности и поддержка мультипроцессорности у них реализована в виде “примочек”. Так как Go молодой язык, поддержка concurrency заложена в нем при создании. Язык Go дает лучший баланс между производительностью и продуктивностью.

Правильность против Производительности

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

Главная базовая идея хорошего стиля - написание чистого и простого кода. Сейчас это так же важно как 35 лет назад. Go построен на основе этой идеи.

Ответственность

Мы должны брать на себя ответственность, ответственность начинается с нас. (Здесь Билл приводит один очень наглядный пример с телефоном.) Взять, например, такую обычную вещь как телефон. Вообразите, что если сейчас телефоны отключатся во всей стране на один час, то сколько ЧЕЛОВЕК УМРЕТ?

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

Мы должны воспринимать нашу ответственность серьезно. Мы должны всегда помнить насколько серьезно то ПО которое мы пишем.

Целостность

В нашем первом приоритете при написании кода должна быть целостность. В Go целостность встроена глубоко в язык. Целостность можно рассматривать на двух уровнях микро и макро.

На микроуровне целостность - это каждое чтение, каждая запись, каждое выделение памяти что мы осуществляем. Оно должно быть точным, консистентным и эффективным.

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

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

Мы должны писать меньше кода - меньше кода меньше багов. Обработка всех ошибок (исключительных ситуаций) - очень критична. 92% багов можно было избежать при правильной обработке. Обработка ошибок должны быть неотъемлемой частью того кода что вы пишете.

Простота и спрятанная стоимость кода

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

Понятие “Простота” само по сеьье очень интересно. Код может выглядеть простым, но по факту все что в нем происходит просто скрыто, а то что открыто не дает нам никакого понимания о его сложности. Спрятанная стоимость кода - это на самом деле просто нечитабельный код. Создатели Go решили не позволять разработчикам делать такое, поэтому в нем нет таких вещей.

Не прятать стоимость кода; обеспечить легкость чтения и понятность - то чего вы должны придерживаться при написании программ и Go сам направляет нас в этом.