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