Pull to refresh

PHP репетиторство

Reading time9 min
Views3.9K

В комментариях к прошлым статьям мне посоветовали позаниматься репетиторством со студентами, тк возможно это положительно повлияет на мою психику. Поначалу  это казалось таким нереальным, что я не воспринял совет всерьез. Но однажды мне просто подвернулась “студентка”, крайне заинтересованная в позиции junior PHP backend developer, тк процессы верстки ее крайне утомляют. Уровень ее знаний: почти полное непонимание процессов инициализации и модификации в циклах, полное непонимание арреев, в плане алгоритмов - непреодолимые трудности с алгоритмами сложнее пузырьковой сортировки. Уровень ее ожиданий: позиция PHP junior после 3 месяцев регулярных тренировок.

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

Беседа о позиции PHP junior:

В принципе, студентка адекватнее некоторых выпускников вузов, сразу после вуза претендующих на позиции software architect - тк “на зарплату джуниора не прожить”, оценивает свои способности и готова к незначительному падению уровня своих доходов на первых порах - как это случалось со всеми моими знакомыми, идущими в новую профессию. Ее позиция: вначале выучусь - а там посмотрим. Вспоминая гипотезу Данинга-Крюгера: она считает, что основы уже почти выучила и уже занята вопросом: а дальше что?

А дальше нужен будет ментор или ведущих программист, спрашиваю:

Допустим ты написала резюме в приличную контору, где джуниора будут чему-нибудь учить … ты понимаешь, что таких резюме будет штук 20 и кого тогда выберет ведущий программист?

Того у кого больше опыта?

Как сравнить у кого больше опыта: у меня, тебя, твоего брата? … 

Думаю у джуна 20 с небольшим лет, с ИТ образованием шансов будет много  больше.

И что тогда делать?

Учиться?

Все мы учимся …

Дипломный проект?

Без ментора это такое себе занятие

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

Беседа о менторе:

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

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

Беседа о вакансиях:

Сразу прошу ее найти 3 интересных для нее вакансии PHP junior. С одной стороны это сразу отучит безуспешно долбиться в фирму мечты. С другой исключит тот печальный факт: вот выучились вы на джуниора, а без релокации устроиться некуда, а к релокации вы совершенно не готовы. Конечно, фанаты удаленки скажут: зачем работать в офисе, когда можно из дома? Но мои практические наблюдения показывают: если у вас нет большого таланта, то на удаленку реально пристроиться начиная с позиции сеньора. С третьей стороны по типичным вакансиям можно прикинуть примерный уровень необходимых знаний.

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

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

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

Ну хорошо, не будем пока рассматривать full stack. Перевожу тему на 3ю контору: чтобы туда пристроиться, тебе нужно будут отработать пару лет в конторе типа как у твоей подружки. Хотя странная какая-то дружба - она кодить совершенно не помогает.

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

Беседа об алгоритмах:

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

  • Может вскользь изучить еще один язык, на котором разбираются алгоритмы?

  • Да ну столько всего учить, мне бы к осени куда вначале пристроиться джуниором …

Собственно, закрадывается мысль, если начинающих пхп кодеров совершенно не принято учить алгоритмам, то может им намного важнее вначале изучить MySQL, JS, JQuery и фреймворк какой для работы? Наверное стоит отложить изучение алгоритмов до времен, когда придется писать вставки на С++ для высоконагруженных приложений? Ой … знал бы я к чему это приведет.

Беседа о страхах:

  • Ты знаешь, я теперь себе такой глупенькой кажусь, насколько реально будет мне куда-то пристроиться?

  • Умнейшие нам не конкуренты, их, во-первых, очень мало, во-вторых, они даже не будут рассматривать годные для тебя вакансии … всех кого я встречал - либо устраивались программистом на Яндекс, либо шли торговать “носками”. Тут все будет зависеть от твоей удачи и приложенных тобой усилий.

Собственно практические занятия.

У студентки оказался маленько странный для меня подход: практически не зная языка и алгоритмов сразу врубиться в решение задачек. Все таки немного времени до осени есть - и я настоятельно советую параллельно с решением задачек почитывать O'Reilly: Learning PHP. Не то чтобы я сильно разбирался в том, по какому изданию лучше изучать PHP, но в молодости у меня просто сложился такой подход: если заинтересовался каким-то новым языком после С++, то серия O'Reilly: Learning … это лучшая отправная точка для начала его изучения. 

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

Первая задачка:

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

<?php 
$str = 'Посчитать сколько в строке слов начинается на одну букву и сколько заканчивается на другую. Единственная сложность: в условии сказано: решение должно быть быстрым … а как подключать профайлер к PHP для меня большая загадка.';
        function fuSersA ($text) {
            $arr = explode(' ', $text);

            $count_a = 0;
            $count_o = 0;
            foreach($arr as $elem) {
                if( mb_substr($elem, 0, 1) === 'а' || mb_substr($elem, 0, 1) === 'A') {
                    $count_a++; 
                };

                if(mb_substr($elem, -1, 1) === 'о' || mb_substr($elem, -1, 1) === 'О') {
                    $count_o++;
                };
            }
            
        }
        function fuSersA1 ($text) {
            $arr = explode(' ', $text);

            $count_a = 0;
            $count_o = 0;
            foreach($arr as $elem) {
								$a1 = mb_substr($elem, 0, 1);
                if( $a1  === 'а' || $a1 === 'A') {
                    $count_a++; 
                };
								$a1 = mb_substr($elem, -1, 1);
                if( $a1 === 'о' || $a1 === 'О') {
                    $count_o++;
                };
            }
         
        }
$t1 = microtime(true); 
for($i=0; $i<10000; $i++){
        echo fuSersA ($str);
}
$t2 = microtime(true); 
$t1=$t2-$t1;
echo $t1 . '<br>';
$t1 = microtime(true); 
for($i=0; $i<10000; $i++){
        echo fuSersA1 ($str);
}
$t2 = microtime(true); 
$t1=$t2-$t1;
echo $t1 . '<br>';
?>

Вторая задачка:

Была уже чуть интереснее: повернуть матрицу на 90 градусов по часовой стрелке. Конечно проще всего такую формулу загуглить … но мы не ищем легких путей. 

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

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

Единственная ее ошибка в коде: $new Matrix[$y][$length-$x-1] = $k, где $k сгенерированое значение. Тут прочитал ей короткую лекцию: Незрелая оптимизация это корень всех бед, в первую очередь код должен быть читабельным, а уже потом быстрым.

Единственное дополнительное неудобство тут: сложно воспринимать состояние матрицы через  print r.

<?php
$oldMatrix = [
	[1,2,3],
	[4,5,6],
	[7,8,9]
	];
$len = count($oldMatrix);
$newMatrix = [];
for($x=0;$x<$len;$x++){
	for($y=0;$y<$len;$y++){
		$newMatrix[$y][$len-$x-1] = $oldMatrix[$x][$y];
	}
}
function printMatrix($matrix){
$len = count($matrix);
for($x=0;$x<$len;$x++){
	for($y=0;$y<$len;$y++){
		echo $matrix[$x][$y];
	}
	echo PHP_EOL;
}
}
printMatrix($oldMatrix);
echo PHP_EOL;
printMatrix($newMatrix);
?>

Третья задачка:

Удалить из строки все дубли и вернуть строку.

Формализация задачи:

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

Первый наводящий вопрос студентке: что такое дубль? 

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

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

Второй наводящий вопрос: Основная часть описания алгоритма готова, какое одно слово можно добавить, чтобы описать весь алгоритм целиком? 

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

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

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

Оценка технических рисков:

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

  1. Вложенный цикл уже делали в прошлой задачке … ох как я тут ошибался.

  2. Взять по индексу символ из строки - умеет.

  3. Вернуть строку - умеет

  4. Удалить символ по индексу - 5 минут на раздумье и понимание, что не умеет.

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

О преждевременности усилий:

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

<?php
$str = "hello there";
$str_arr = str_split($str);
$len = count($str_arr);
for( $i=0; $i<$len; $i++) {
	if (!isset($str_arr[$i])) continue;
	for( $j=$i+1; $j<$len; $j++) {
		if (!isset($str_arr[$j])) continue;
		if ($str_arr[$i] == $str_arr[$j]) {
			echo $i.$j.PHP_EOL;
			unset($str_arr[$i]);
			unset($str_arr[$j]);
			break;
		}
	}
}
print_r( $str_arr);
echo implode($str_arr);
?>

Во-первых, вложенный цикл для нее это for(x=0;..) { for(y=0;...) с такими условиями она решала 10ки задачек, но конструкция for(x=0;..) { for(y=x+1;...) явно далеко за пределами ее понимания, далее она сплошь и рядом путается с инициацией и выполнением тела цикла.

Во-вторых, control flow в циклах она еще не проходила, и задачку для их усвоения нужна явно попроще.

В-третьих, она так и не разобралась во влиянии unset на массив.

В общем даю ей ссылку на O'Reilly: Learning PHP -> Control Flow -> Looping -> for Loops … и ищу задачки попроще.

Выводы:

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

Учите английский хотя бы до уровня чтения-понимания технической документации. Во-первых, не придется ждать пару тройку лет пока современную версию издания переведут на русский язык … если вообще такой момент когда-нибудь наступит. Во-вторых, практически все проблемные места с вероятностью 99.9% во всех студенческих задачках уже разобраны на stack overflow.

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

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

Tags:
Hubs:
Total votes 15: ↑3 and ↓12-8
Comments32

Articles