Впечатления о книге — Постигая Agile — Дженнифер Грин

Книга Постигая Agile — Дженнифер Грин

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

Лично мне, книга интересна тем, что на ее страницах раскрываются тайны таких модных понятий как Agile, Scrum, XP, Lean, Kanban как обособленно, так и в сравнении, а, точнее, в гармоничных комбинациях. Другими словами эти методологии и философии дополняют друг друга или лучше раскрывают…

Основные понятия, которые для себя отметил описываются ниже.

Agile

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

Манифест гибкой разработки программного обеспечения:

Люди и взаимодействия важнее процессов и инструментов
Работающий программный продукт важнее исчерпывающей документации
Сотрудничество с заказчиками важнее согласования условий контракта
Готовность к изменениям важнее следования первоначальному плану 

12 принципов гибкой разработки программного обеспечения 

  1. Наш наивысший приоритет — это удовлетворение заказчика при помощи частых и непрерывных поставок ценного для него программного обеспечения.

Agile-команды удовлетворяют своих клиентов, получая обратную связь на ранних этапах проекта, и непрерывно поставляют программное обеспечение, чтобы сохранить эту связь актуальной

  1. Мы принимаем изменения в требованиях даже на поздних этапах реализации проекта. Agile-процессы позволяют использовать изменения для повышения конкурентоспособности продукта.

Agile-команды одобряют изменения, рассматривая их как положительные и полезные события для проекта

  1. Мы стремимся поставлять полностью рабочее программное обеспечение каждые несколько недель, в крайнем случае — каждые несколько месяцев. Чем чаще, тем лучше.

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

  1. Наиболее эффективный и действенный способ передачи информации — это встреча членов команды разработки ПО.

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

  1. Представители бизнеса и команда разработки должны работать над проектом вместе.

Для достижения наибольшей ценности программного продукта разработчики ежедневно общаются с бизнес-пользователями

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

Каждый член agile-команды чувствует свою ответственность за проект и отвечает за успех

  1. Рабочее программное обеспечение — это главная мера прогресса проекта.

Наиболее эффективный способ коммуникации в ходе реализации проекта — поставка рабочего программного обеспечения и передача его в руки пользователя

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

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

  1. Постоянное внимание к техническому совершенству и качественной архитектуре способствует гибкости.

Хорошо разработанное и реализованное программное обеспечение намного быстрее поставляется клиенту, потому что в него проще вносить изменения

  1. Простота — это искусство не делать лишней работы.

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

  1. Лучшая архитектура, требования и дизайн создаются в самоорганизующихся командах.

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

  1. Команда постоянно ищет способы стать более эффективной путем настройки и коррекции своих действий

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

Scrum 

Правила Scrum 

— В scrum-проекте существует три основные роли: владелец продукта, scrum-мастер и член команды.

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

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

— Ежедневно все члены команды участвуют в короткой встрече (Daily Scrum — ежедневный scrum-митинг), чтобы рассказать друг другу о достижениях и обсудить то, что препятствует дальнейшей работе. Каждый человек отвечает на три вопроса: что я сделал с момента последнего ежедневного совещания? Что буду делать вплоть до следующего ежедневного совещания? Какие препятствия есть на моем пути?

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

Чтобы работать по Scrum, команда должна глубоко и на интуитивном уровне понимать коллективную ответственность и самоорганизацию 

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

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

Экстремальное программирование 

Две основные практики XP — разработка через тестирование и парное программирование    

Lean (бережливое мышление)

Lean — это мышление, а не методология

Команды при помощи бережливого мышления ведут работу по ликвидации потерь, находя любые виды деятельности, которые напрямую не способствуют построению ценных продуктов, и устраняя их

Любая деятельность, которая явно не добавляет ценности проекту, считается потерями. Lean-команды стремятся увидеть их и исключить из проектов, насколько это возможно.    

Канбан 

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

Канбан отличается от гибких методологий, таких как Scrum и ХР.

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

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

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

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

Затем принимайтесь за основные практики:
— визуализацию;
— ограничение числа задач в работе (WIP);
— управление потоком;
— сделайте правила явными;
— введите петли обратной связи;
— развивайтесь совместно и экспериментируйте (используя моделирование или научный подход).

Типичная канбан-доска показывает крупные рабочие элементы, а не отдельные задачи

Впечатление о книге — Грокаем алгоритмы — Адитьи Бхаргавы

Книга Грокаем алгоритмы Адитьи Бхаргавы

Сразу хочу поделиться мыслями:

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

Ниже приведены, освещенные в этом труде, понятия, алгоритмы и технологии

  • Бинарный поиск (в том числе в сравнении с обычным поиском перебором) и массивы. Хотя массив поиска должен быть отсортированным чтобы им пользоваться
  • О-большое — порядок времени работы алгоритма. Важное понятие для оценки эффективности (скорости работы) алгоритмов или сравнения разных алгоритмов
  • Задача о коммивояжере (как пример задачи, которую очень тяжело выполнить точно)
  • Связанные списки, как альтернативный массивам тип данных
  • Сортировка выбором
  • Рекурсия и стек (стек вызовов)
  • Быстрая сортировка (используется понятие алгоритма «Разделяй и властвуй» и рекурсия)
  • Хеши, Хеш-таблицы, Хеш-функции
  • Графы, Поиск в ширину для описка кратчайшего пути по графу (когда весов у ребер нету)
  • Алгоритм Дейкстры для поиска наиболее выгодного (быстрого) пути по графу (когда весы у ребер появляются)
  • Жадные алгоритмы, как быстрые, но приближенного решения сверх-сложных задач (NP-полных)
  • Множества
  • Динамическое программирование, как метод решения сложных задач с помощью разбиения на более простые
  • Шутливый Алгоритм Фейнмана (1 — сформулировать задачу, 2 — хорошенько подумать, 3 — записать решение)
  • Алгоритм k-ближайших соседей, как распостраненный метод решения многих задач классификации (распределение по категориям) и регрессии (прогнозирование ответа)
  • Извлечение признаков
  • Машинное обучение на примерах OCR, спам-фильтра, прогноза биржевых торгов

В последней главе книги вскользь (тезисно) касаются следующих тем

  • Возвращаемся к деревьям
  • Инвертированные индексы
  • Преобразование Фурье
  • Параллельные алгоритмы
  • MapRecude и распределенные алгоритмы
  • Фильтры Блума и HyperLogLog
  • Алгоритмы SHA и сравнение файлов
  • Алгоритм Диффи-Хеллмана
  • Линейное программирование

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

Впечатления о книге — Искусство объяснять — Ли Лефевер

Книга Искусство объяснять Ли Лефевера

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

Чем то, концепция произведения напоминает таковую из книги «В работу с головой«, где рассматривается углубленная работа, на первый взгляд, элементарное понятие.

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

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

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

  • Объяснения требуют умения поставить себя на место собеседника. Это перекликается с умением слушать из очень полезной книги — 7 навыков высокоэффективных людей . Другими словами, процесс объяснения основан на эмпатии — важной способности понимать и разделять чувства другого человека
  • Формулирование объяснения помогает на лучше понимать идею
  • Основная причина множества неудачных объяснений — «проклятие знания», так как оно снижает нашу способность правильно оценивать аудиторию или собеседника
  • Хорошие объяснения повышают уверенность в себе, плохие — снижают или полностью уничтожают
  • Контекст — важная часть объяснения, которая делает идею, факт или историю понятнее и полезнее. И если аудитория разношерстная, другими словами, присутствуют и эксперты и новички, необходимо формировать контекст с уровня начинающим, а затем покрывать экспертов
  • Основной вопрос любого объяснения: почему это должно меня интересовать? При эффективном использовании, контекст помогает ответить на этот вопрос, создавая ощущение согласия по поводу предмета в целом
  • История. Цель истории в объяснении — добавить к изложению фактов человеческие переживания. Не нужно быть профессиональным рассказчиком, чтобы использовать истории. Истории используются, чтобы заинтересовать предметом объяснения
  • Истории чаще подходят для объяснений, где главная тема связана с действиями человека или с его опытом
  • Связи, как аналогии. Связи со старым способом, представленные в виде отчаяния или проблемы, делают необходимость новых решений ясной и понятной. Пример связи нового и старого: Google Docs это как Word но удобнее для совместной работы с файлом.
  • Использование связей — это еще один способ укрепить уверенность людей и снизить цену понимания определенного вопроса
  • При объяснении, Историю или Связь можно использовать, как совместно, так и отдельно, т.е. не обязательно применять их обоих для объяснения одного предмета
  • Описание — новая ступень объяснения. Применяется когда необходимо ответить на вопрос «как я могу это использовать?» вместо «почему меня это должно интересовать?» (о котором уже позаботились Контекст, История и Связь)
  • Упрощение используется, когда необходимо сложную идею сделать простой. С любой сложной идеей можно так поступить. Правила упрощения:
    • Не делать предположений о том, что люди уже знают
    • Использовать самые простые слова
    • Мысленно уменьшить масштаб предмета объяснения
    • Забыть о подробностях и исключениях
    • Жертвовать точностью ради понимания
    • Связать базовые идеи с тем, что понимает аудитория
  • Ограничения с которыми мы сталкиваемся, когда формируем объяснения. Хотя они и ограничивают, на самом деле, они и освобождают. Мы намеренно создаем «контейнер», который позволяет быстро решить, что положить внутрь, а что оставить снаружи и выкинуть из головы, чтобы сосредоточиться на других вопросах
  • Сценарий объединяет все части объяснения: контекст, связь, историю, описание, и в сценарии они принимают форму. Краткий обзор элементов сценария по порядку:
    • соглашение
    • контекст — проблема/отчаяние и нахождение решения
    • история
    • связь
    • описание
    • реализация решения — как
    • призыв к действию
  • Некоторые идеи трудно понять без иллюстрации, т.е. слов не всегда бывает достаточно. Такие идеи становятся понятными после того, как мы включаем визуализацию:
    • графики и временные графики
    • диаграммы
    • карты
    • блок-схемы
    • портреты пользователей

PHP foreach — как легко переполнить память даже с крошечным массивом

PHP foreach пример

Рассмотрим простой пример перебора элементов одномерного массива с 4мя элементами

<?php
$elements = [1,2,3,4];
echo PHP_EOL;
foreach ($elements as $element) {
    echo $element;
}
echo PHP_EOL;
echo json_encode($elements);

при выполнении все ожидаемо:

1234
[1,2,3,4]

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

<?php
$elements = [1,2,3,4];
echo PHP_EOL;
foreach ($elements as $element) {
    if ($element === 3) {
        $copy = $element;
        $elements[] = $copy;
    }
    echo $element;
}
echo PHP_EOL;
echo json_encode($elements);

В результате получаем:

1234
[1,2,3,4,3]

А теперь, рассмотрим вполне реальную ситуацию, когда в цикле с элементами массива нужно что то сделать и сохранить это:

<?php
$elements = [1,2,3,4];
echo PHP_EOL;
foreach ($elements as &$element) {
    // do something with every element
    if ($element === 3) {
        $copy = $element;
        $elements[] = $copy;
    }
    echo $element;
}
echo PHP_EOL;
echo json_encode($elements);

И вот тут мы сталкиваемся с проблемой похлеще рекурсии без предусмотренного выхода из нее:

123.....333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 134217736 bytes) in /php on line 7
PHP Stack trace:
PHP   1. {main}() /php:0

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 134217736 bytes) in /php on line 7

Call Stack:
    0.0025     392288   1. {main}() /php:0

Это последствия передачи массива по ссылке

И лучше обойти это с помощью временного массива:

<?php
$elements = [1,2,3,4];
echo PHP_EOL;
$additionalElements = [];
foreach ($elements as &$element) {
    // do something with every element
    if ($element === 3) {
        $additionalElements[] = $element;
    }
    echo $element;
}
echo PHP_EOL;
echo json_encode(array_merge($elements, $additionalElements));

И, необходимый нам результат:

1234
[1,2,3,4,3]

Впечатления о книге — Remote. Офис не обязателен — Джейсона Фрайда

Обложка книги Remote. Офис не обязателен

Книга от основателей компании 37signals, Джейсона Фрайда и Дэвида Хайнемайера Хенссона (так же известен как создатель известного фреймворка Ruby on rails). Личности достаточно известные, отчего их, кристаллизированные в книге, мысли, идеи, подходы имеют высокую ценность.

Данное произведение написано в 2013-2014 годах и тогда тренд на удаленную работу только начинал зарождаться. От этого, в том числе, значительная часть книги описывает преимущества удаленной работы (которые в 2021 году уже кажутся очевидными) и приемы разговоров с начальниками, чтобы склонить их к рассмотрению перспективы перехода на «удаленку».

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

Отмечу некоторые ключевые моменты книги, которые заинтересовали меня лично…

  • Типичный офис стал «зоной прерываний», в которой каждый сегмент времени наполнен телеконференциями, созвонами, синхронизациями, встречами, совещаниями и прочими стандартными, но необязательными с точки зрения работы прерываниями. Осмысленная, творческая, сложная и важная работа требует длительных периодов концентрации, когда ничто не отвлекает и можно с головой погрузиться в то, чем занимаешься. Кстати, это посвящена целая исследовательская работа, описанная в предыдущей статье о книге «В работу с головой. Паттерны успеха от IT-специалиста».
  • Для успешной удаленной работы необходимо разработать подходящий распорядок дня и придерживаться его. Для этого нужно выйти на новый уровень личной ответственности. Это более высокий уровень, чем может показаться вначале, особенно для тех, кто от природы склонен откладывать дела на потом.
  • Большинство страхов, связанных с к удаленной работе возникают из-за недоверия к людям. А люди обладают поразительной особенностью отвечать вашим ожиданиям. Вот такой замкнутый круг, из которого жизненно-важно выходить. Так же можно резюмировать, что не стоит брать на работу того, кому не сможешь доверять и работать на босса, который не доверяет тебе.
  • Есть мнение, что дома люди чаще отвлекаются. Если и так, то лучший способ бороться с отвлекающими факторами — интересное, захватывающее дело. Большинство людей хотят работать, поскольку это тонизирует их и приносит удовольствие.
  • Время от времени — например, когда ситуация на работе становится напряженной — могут портиться даже отношения между добро-желательно настроенными людьми. Лучший способ не допустить этого — иметь на борту как можно больше оптимистов, тех, кто делает все возможное, чтобы у всех было отличное настроение.
  • Важно не только учитывать характер нанимаемых сотрудников, но и постоянно следить за атмосферой в коллективе. Не стоит позволять неприятным людям отравлять жизнь другим. В случае удаленной работы это смертельно опасно.
  • При подборе удаленных работников нужно особенно внимательно относиться к поощрению культурного разнообразия и личного развития. А так же поддерживать развитие команды.
  • Если рассматривать принятую разницу зарплат между столицей, крупными городами и провинцией, не стоит позволять относиться к себе как к второсортному работнику лишь из-за того, что живешь не в мегаполисе, вы можете спровоцировать аналогичное пренебрежительное отношение к себе и в остальных вопросах. Так же и с нанимающей стороны, не стоит поощрять такую дифференциацию вознаграждений для своих работников.
  • Удаленная работа ускоряет процесс «высадки» неправильных людей и появлении «на борту» людей правильных
  • Умение хорошо писать является важной чертой эффективного удаленного сотрудника. Чтобы получать такой навык (и многие другие) нужно много читать и изучать методы работы хороших писателей.
  • Самый точный способ оценить человека, при соискании на должность, — нанять его для выполнения небольшого задания, прежде чем решиться доверить большой проект.
  • При приеме на работу, личная встреча помогает понять последнее: нравится ли нам кандидат как человек. Необходимо пригласить человека на обед или же в офис, в результате, можно будет понять, комфортно ли ему с нами, и, комфортно ли нам с ним.
  • Вам, как руководителю, придется принять как данность, что ваши подчиненные будут ошибаться — конечно, непреднамеренно — и что эти ошибки — обычная плата за их обучение и независимость.
  • На самом деле, главным врагом удаленной работы является не «недо-«, а переработка. Это могло бы выглядеть как мечта работодателя: сотрудники во всю трудятся сверхурочно, не требуя за это компенсацию. Однако, если работа поглощает целиком, повышается вероятность «выгорания«. Это случается, даже когда человек любит свое дело.
  • Культура переработки легче складывается в компаниях, где суперменов-трудоголиков постоянно играют «наверху».
  • Попытки подстегнуть мотивацию угрозами или наградами абсолютно неэффективны. На самом деле они приводят к противоположному эффекту. Есть только один надежный способ поднять мотивацию — поощрять людей работать на тем, что им нравится, и только с теми людьми, которые не оставляют их равнодушными.
  • Смена декораций может способствовать появлению множества различных плодотворных идей.

Впечатления о книге — В работу с головой. Паттерны успеха от IT-специалиста Кэла Ньюпорта

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

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

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

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

Хотя, реально, первые 40% книги автор, хоть и различными способами, но, просто, убеждает в том, что углубленная работа о-о-очень важна.

Материал изобилует историями и примерами очень знаменитых личностей и чуть менее известных. На страницах вы найдете подходы от Билла Гейтса, Чарльза Дарвина, Карла Юнга, Теодор Рузвельт, Дж. К. Роулинг, Джека Дорси, Энди Гроува, Уолтера Айзексона, Джерри Сайнфелда, Рика Фаррера, Михая Чиксентмихайи, Сантьяго Гонсалеса, Дэвида Девэйна, Брайана Чаппелла, Нила Стивенсона, Дональда Кнута и многих других.

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

Выделяется 4 способа погружения в работу:

  • «Монашеская» система. Эта система пытается увеличить объем углубленного труда посредством исключения или радикального уменьшения поверхностных обязанностей. Применима для людей, чей профессиональный спех в первую очередь зависит от выполнения этой единственной задачи на высочайшем уровне. Примерами могут быть ученые, работающие над важной научной работой, или писатели, сидящие над книгой.
  • Двухрежимная система. При этом, происходит распределение времени: какие то четко определенные отрезки (дни, недели, месяца) посвящаются углубленной работе, а оставшееся время открыты для всего прочего. Если, например, уделять такой работе лишь несколько часов по утрам, это время окажется слишком коротким, чтобы считать его периодом углубленной работы.
  • Ритмическая система. Цель здесь — задать в работе определенный ритм, который освободит вас от необходимости тратить энергию на решения, надо ли вам погружаться в работу, и если надо, то когда. Ритмическая система чрезвычайно широко распространена среди офисных работников.
  • Журналистская система. Подход, при котором вы вставляете углубленную работу в свое расписание в любой подходящий момент.

Какие еще моменты из книги я отметил для себя:

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

Впечатления о книге Программист-фанатик Чеда Фаулера

Программист-фанатик — видимо так его видят в издательстве книги

Одна из самых полезных книг по, так называемым, софт-скиллам для инженеров по разработке программного обеспечения.

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

Делает он это на собственных примерах или же примерах хороших знакомых.

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

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

Найдите свой рынок

  • В любое время, на рынке разработки, есть множество языков программирования и технологий. Какие то более удачные, какие то — менее. Какие то предназначены для решения одних задач, какие то — для других. Мысль в том, что не все технологии одинаково востребованы, и специалисты, соответсвенно, оплачиваются по разному. С этой точки зрения необходимо использовать дисбаланс рынка и смотреть в сторону инструментов, пользующихся большим спросом, либо же приглядываться с более высоко-оплачиваемым, но более рискованным
  • Для супер-героя в мире разработки, умение хорошо писать код мало. Чтобы стать незаменимым, нужно детально разбираться в особенностях бизнеса, с которым связана текущая деятельность. Проще всего считать, то мы специалисты в таком то языке и именно за это нам платят. Однако, знание специфики работы в определенной отрасли может стать определяющим фактором, способным серьезно повлиять на возможность трудоустройства или же повышение.
  • Тут же, наводит на мысль, что и бизнес, с которым будет связана работа, нужно выбирать осознано, чтобы разбираться с ним было не в тягость.
  • Будь худшим. Не в плане, быть ленивым и безответственным, а ответственно подходить к своему окружению. Речь о коллективе, так как окружающие люди влияют и на ваш результат. Попадая в коллектив сильных ребят, вы будете улучшать свои навыки очень быстро
  • Очень важный совет — инвестировать в себя, свои знания время; изучать новые технологии и методологии. Это, не только создает образ правильно мотивированного и увлеченного своим ремеслом человека, но и делают вас глубже, лучше, умнее и изобретательнее, увеличивают вариативность решения задач

Инвестируйте в себя

  • Работа в стабильной компании создает чувство и зону комфорта. Негативными последствиями этого может стать закостенелость, застои в развитии. Для противодействия этому, автор предлагает рассмотреть альтернативы, например разработку своего проекта. Выход из зоны комфорта будет полезен для дальнейшего развития
  • Старайтесь быть универсальным. Это увеличивает вероятность остаться в выбранной вами компании, несмотря на встряски и штормы, в которые бросают вашу шлюпку различные кризисы. Ваши навыки не должны ограничиваться одной технологической платформой или стеком технологий
  • При этом, в текущем стеке стремитесь быть специалистом, интересуясь процессами, которые могут быть инкапсулированы. Необходимо быть любознательным, экспериментатором. Иногда тяжело сразу же в чем то разобраться, тут поможет правильная постановка вопроса (Зачем это нужно? Почему происходит именно так?..). Через какое то время ваш ум приведется в новое состояние и появится ответ
  • Сложно быть посредственным специалистом, правильно выбрав бизнес, работу, технологию. И наоборот, какое то время можно притворяться, но недостаток энтузиазма обязательно скажется как на вас, так и на вашей работе
  • На начальном этапе карьеры, большой рывок вперед может помочь сделать хороший наставник. Важно, чтобы рядом с вами был такой человек, которому ты доверяешь и которым восхищаешься, помогающий правильно сориентироваться в плане профессионального роста. Однако, на практике, это далеко не всегда реализуемо. В таком случае — воспитывай себя сам
  • Если хочешь по-настоящему что-то изучить, попробуй научить этому кого-то другого. Передача опыта не только поможет другому специалисту, но и закрепит ваши знания. Параллельно, нужно тренироваться самому, на пределе своих возможностей
  • Хороший способ увеличения производительности — автоматизация своей работы

Исполнительность и качество

  • Даже монотонные и неинтересные задачи не стоит воспринимать как тюремную каторгу. Взгляните на такую рутину, как на соревнование, таким образом, можно выполнить их куда быстрее. Становитесь тем, кто толкает вперед, а не показывает себя жертвой
  • Люди, обеспечивающие бесперебойную работу над проектом без многочисленных указаний сверху, высоко ценятся постоянно занятыми начальниками и заказчиками. Кстати, это один из критерием, когда разработчика причисляют к миддлам или сеньорам, в противопоставлении джуниорам
  • Очень хороший подход в собственном развитии — это улучшать компанию изнутри, буть неравнодушным к ее судьбе, что, в любом случае, будет иметь хорошие последствия и для работника. Превышение ожиданий работодателя является вполне достойно целью
  • Успех вашего начальника — это и ваш успех. Думайте не о том, на какое место ты хочешь попасть после повышения, а о задачах, которыми придется заняться, завершив текущие дела. Что выдающегося вы можете сделать на текущей должности
  • Избегайте бесед о продвижении по службе и офисной политике. Так же избегайте сплетен. Сплетни и интриги вредят компании и, в последствии, вредят каждому ее члену
  • Чувство незаменимости является плохим симптомом, особенно у разработчиков программного обеспечения. Заменить нельзя только того, кто справляется со своей работой особым, недоступным другим способом. Вы нигде не должны чувствовать себя слишком комфортно
  • Так как все мы делаем ошибки, мы даем право на ошибку другим. И в разумных пределах не судим друг друга
  • Озвучивайте проблему сразу же, как только о ней узнали, не пытайтесь ее скрыть
  • Предлагайте решение. Если вы его не знаете, предлагайте план поиска решения
  • Просите помощи. Даже если вина за возникновение проблемы лежит целиком на вас, не позволяйте собственной гордости усугубить ситуацию, отказываясь от помощи
  • Имейте смелость говорить «нет» на нереальные просьбы или требования. Имейте смелость быть честным

Маркетинг — не только для бизнесменов

  • Вам придется много писать. Поэтому, лучше научиться делать это хорошо. А, ведь, если уделять тексту сообщений недостаточно внимания — можно передать информацию искаженно и потом разбираться, почему же вас не так поняли
  • Необходимо четко понимать, какую пользу для бизнеса приносит ваша деятельность, в понятных бизнесу терминах
  • Сделать свои имя известным и заставить о себе говорить проще всего с помощью публикаций и выступлений. Читайте блоги. Затем заведите свой блог. Отрабатывайте навык письменной речи; постепенно он будет улучшаться, что придаст вам дополнительную уверенность. При этом, начинать нужно раньше, чем почувствуете себя готовым — т.е. прямо сейчас
  • Работа над программами с открытым исходным кодом не только дает возможность создать себе имя, но и демонстрирует вашу увлеченность данной областью деятельностью

Сохраняйте конкурентные преимущества

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

Впечатления о книге — Программирование без дураков авторов Пассиг Катрин и Яндер Йоханнес

Отличная книга для инженеров по программному обеспечению начального уровня. 

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

Книга позиционирует себя как руководство для программирования «less wrong», т.е. «менее неверно», другими словами — программировать правильнее с точки зрения опытных программистов, до которых дотянулись авторы книги и их окружение. Я думаю, она выполняет эту цель.

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

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

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

  1. Книга на примерах показывает, что значит плохой программист (и от обратного, мы понимаем, что не нужно делать, чтобы быстрее становиться хорошим)
  2. Дает советы общего (около-программного) плана, которые помогут быть хорошим программистом
  3. Вводим в курс проблемы именования переменных, функций, классов и т.д. Не дает универсальных решений, подчеркивая, что в разных языках и фреймворках правила могут отличаться. Так же не стоит забывать, что нету каких то абсолютно общепринятых правил и, может так статься, что нужно следовать ранее установленным договоренностям
  4. Важность комментариев и документированности кода. Однако, важно не злоупотреблять комментированием и понимать, где они к месту, а где могут даже мешать пониманию кода
  5. Подходы к чтению кода и поиску информации
  6. Важный вопрос, который подымается в книге, и которым грешат разработчик постарше — это попытки оказать помощь в случае, если она (помощь) не требуется или нежелательна (непрошена второй стороной)
  7. Целый раздел посвящен работе над ошибками разнообразнейших типов, поиск багов, составление и проверка гипотез, анализ и отладка кода, потенциально слабые места программ, вопросы рефакторинга и тестирования программного обеспечения
  8. Материал из книги учит не изобретать велосипеды (почему она не попадалась мне в начале карьеры 🙂 ). Как искать эти «велосипеды» и применять в своих условиях
  9. Чуточку, пытается направить читателя в поиске первого или следующего языка программирования (а так же фреймворка, менеджера пакетов и тому подобное)
  10. Вводит в курс важной темы систем контроля версия и работы с ними
  11. Помогает не бояться командной строки
  12. Открывает завесу в понятиях объектно-ориентированного программирования (как преимущества так и недостатки, а так же — альтернативы)
  13. Освещаются вопросы хранения данных (начиная с текстовых форматов и заканчивая графовыми базами данных) 
  14. Уделяется внимание важным вопросам безопасности информации
  15. В финале, рассматриваются не вошедшие, но немаловажные вопросы, с которыми рано или поздно сталкиваются все разработчики. И дает напутствие на дальнейшее развитие в сторону хороших программистов

В итоге получаем много полезной информации, не оторванной от жизни, собранной в одной книге.

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

Цитаты из книги «Думай медленно, решай быстро» Даниэля Канемана

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

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

Поэтому в данной статье, укажу наиболее полезные для меня цитаты


Система 1 срабатывает автоматически и очень быстро, не требуя или почти не требуя усилий и не давая ощущения намеренного контроля.
Система 2 выделяет внимание, необходимое для сознательных умственных усилий, в том числе для сложных вычислений. Действия Системы 2 часто связаны с субъективным ощущением деятельности, выбора и концентрации

Перед директором по инвестициям стоял трудный вопрос: «Вкладывать ли деньги в акции компании „Форд“?» Но его выбор определил ответ на другой вопрос, более легкий и родственный исходному: «Нравятся ли мне автомобили „Форд“?» В этом и состоит суть интуитивной эвристики: столкнувшись с трудным вопросом, мы отвечаем на более легкий, обычно не замечая подмены

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

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

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

Склонность хорошо (или плохо) воспринимать в человеке все, включая то, чего вы не видели, называется эффектом ореола

Если вы недавно видели или слышали слово «ЕДА», вы дополните слово «М_ _О» до слова «МЯСО» с большей вероятностью, чем до слова «МЫЛО». Конечно, если вы только что видели слово «МЫТЬ», то все произойдет наоборот. Это называется эффектом предшествования или праймингом (формированием установки), иначе говоря, идея «ЕДА» дает установку на «МЯСО», а идея «МЫТЬ» дает установку на «МЫЛО»Находить и называть чужие ошибки намного легче и приятнее, чем признавать свои

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

Частые повторения – надежный способ заставить людей поверить неправде, потому что различить истину и ощущение чего-то знакомого нелегко

Знакомое порождает симпатию. Это – эффект простого предъявления

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

Склонность видеть закономерности в случайном сильнее каких-то там исследований

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

Поощрение за улучшение результатов работает эффективнее, чем наказание за ошибки

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

Установка скомпилированной версии v8js в Ubuntu или CentOS для server-side rendering

  • Скачаем архив со скомпилированной версией расширения v8js.so

Получаем рут права

> sudo su
  • Создаем временную папку для скачивания и заходим в нее
# mkdir -p /opt/google
# cd /opt/google
  • Сохраняем архив с расширением для рендеринга на серверной стороне
# wget https://blog.bayrell.org/media/files/archives/v8-ubuntu-18.04-x64-6.4.388.18-2.1.0.tar.gz
  • Распаковываем архив тут же
# tar xvf v8-ubuntu-18.04-x64-6.4.388.18-2.1.0.tar.gz
  • Далее необходимо скопировать расширение в папку расширений для вашего PHP
    Получить папку с расширениями можно следующей командой
# php -i | grep extension_dir

Ниже можно увидеть результат команды

тогда копируем расширение в эту папку, в нашем случае это:

# cp /opt/google/v8/6.4/v8js.so /usr/lib64/php/modules
  • А теперь нужно добавить это расширение в ini конфиг php
    получаем папку, в которой хранятся дополнительные ini конфиги
# php -i | grep "additional .ini files"

Вывод будет примерно как на скриншоте ниже

Заходим в папку и создаем ini файл для v8js расширения
В нашем случае это:

# cd /etc/php.d
# nano 50-v8js.ini

И вставляем в файл следюущий код:

extension=v8js.so

Сохраняем файл (CTRL+O, CTRL+X)

  • Теперь можем проверить работоспособность установленного расширения
    Переходим в какую то временную папку на сервер и создаем тестовый php файл
# nano test_v8js.php

В который вставляем следующий код:

<?php
$v8js = new V8Js();
$JS = <<< EOT
  var s = 'Hello world';
  s;
EOT;
$r = $v8js->executeString($JS);
var_dump($r);

В случае успеха увидим вывод в консоли:

string(11) "Hello world"

Если, в качестве менеджера процессов вы используете, например, php-fpm — необходимо его перезагрузить

# systemctl restart php-fpm

Если у вас PHP 7.4 или инструкции выше не работают, можно обратиться к процедуре компиляции V8Js из официальных репозиториев для Ubuntu 20 или Ubuntu 22