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

в 8:25, , рубрики: php, обучение, Программирование, Учебный процесс в IT

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

Помните свой первый код на PHP?

Нет, не этот:

<?
    echo "Hello world"; // и в браузере у нас скачивается index.php :)
?>

А вот этот:

<?
    include "db.php";
    if ($_GET['id'] > 0){
        mysql_query("SELECT * FROM `posts` WHERE id = {$_GET['id']}");
    }else{
        mysql_query("SELECT * FROM `posts` ORDER BY `id` DESC");
    }
?>

Со временем мы росли, у нас закладывалось понимание ООП (ха-ха) и мы начали выдавать что-то похожее на это:

<?php
    require "db.php";
    if ($_GET['id'] > 0){
        $db->query("SELECT * FROM `posts` WHERE id = {$_GET['id']}");
    }else{
        $db->query("SELECT * FROM `posts` ORDER BY `id` DESC");
    }
?>

Затем мы где-то услышали, что mysql_* использовать нельзя и все используют mysqli_*, так как это более круто. Мы переписали свой код на использование mysqli. Еще через какое-то время мы узнали про PDO.

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

// PSR? Не, не слышали.
class User {
    public function changeUserProfile($userId, array $userData){
        global $db; // ну вы поняли
        $db->query("UPDATE `user` SET ....");
    }

    public function login($userId){

    }

    public function logout(){
        // и на сайте писали <a href="/logout.php">Выйти</a> :)
    }
}

А еще у меня были классы Db, Post и Comment.

Мы на собственной шкуре познакомились с SQL-инъекциями, XSS атаками и:

 DROP TABLE `posts` 

SOLID, PSR, MVC и паттерны это не просто слова

Мы прошли сами этот путь, узнали про SOLID, PSR, MVC. Для нас это не просто слова, а выстраданная необходимость, особенно после страшных легаси и кучи кода, каждый из классов которого написан в своем стиле. Мы наступили на тысячи грабель, написали столько же велосипедов и в итоге начали писать более/менее адекватный код.

Мы больше не используем глобальные и суперглобальные переменные в своих классах, для SQL используем подготовленные запросы и не помещаем SQL в контроллеры (UserModel::login() у нас тоже больше нет). Нужные объекты внедряем с помощью DI, а не создаем их внутри класса. Мы гоняем Request/Response, а не echo "hello world" и знаем зачем это делаем. Мы тестируем свой код не только с помощью браузера, но и пишем синтетические тесты. Какая цена этому? У меня детство с компьютером, десятки бессонных ночей, столько же факапов и сломанная база данных.

А еще я рано понял, почему $_POST в моделях это плохо.

Вы не были таким человеком? Я был.

Так было раньше. Но не сейчас

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

Сейчас предлагают десятки курсов. Всего за несколько часов вы научитесь писать на Laravel, Yii2 или на любом другом фреймворке. Не знаете основ PHP и ООП? PSR для вас Prosto Sdelay Raboty? Не беда, мы научим вас, всего за 19 990 рублей. Человек платит и думает, что его научат писать сразу правильно. Вы писали сразу правильно?

Я стал замечать, что по какой-то причине люди перестали разбираться в базе (работа с бд, функции, ООП, автозагрузка, рефлексия, работа с файлами, сетью и так далее), а переходят сразу к фреймворкам. Они не знают, как он работает изнутри, они просто пишут на фреймворке, а не с помощью. Их не беспокоит, что делает File::save(), в этом же сила инкапсуляции. Да и не интересно это. А если чего-то в этом фреймворке нет, то эту функцию сделать невозможно.

Но я не согласен с таким подходом к обучению. Велосепедостроение — лучший способ понять любую технологию (ну сейчас начнется). Как-то общаясь за чашкой кофе, я сказал глупую мысль: хочешь разобраться в PHP, напиши свою CMS с плагинами, правами, доп. полями и админкой. А потом подумал. А может быть мысль вовсе не глупая?

Как происходит обучение через фреймворки?

Так, используем composer create-project ...., затем заходим в .env, правим доступы для бд, далее классы контроллеров кладем сюда, классы моделей сюда, классы шаблонов сюда. Мы вроде бы и обучились, а как оно работает изнутри так и не поняли. Немного утрированно, но так оно и есть.

Я встречал нескольких людей, которые говорили, что они пишут на фреймворках. Но при этом они не знают основ. Один человек на полном серьезе мне говорил, что не знает функцию array_map.

Окей, а что нам даст свой велосипед?

Как минимум мы познакомимся с автозагрузкой файлов и классов. Узнаем, что сделать это можно с помощью composer, а не писать свой spl_autoload_… Мы научимся создавать соединения с базой данных, с помощью рефлексии научимся строить свою систему плагинов и поймем, почему $_GET и $_POST в бизнес логике это плохо. Мы пройдем весь путь от Request до Response. Фреймворки этот путь проходят за нас.

Да, почти все фреймворки написаны отлично. В процессе обучения обязательно нужно смотреть, как те или иные вещи у них сделаны. Если вы будете писать свой "мега фреймворк", вам придется проводить реверс-инжиниринг и разбираться, как устроен тот же Yii2 или Laravel. И возможно вы придете в ступор, когда узнаете, что Laravel это просто куча компонентов. Побочный эффект от этого — глубокое понимание фреймворка и его внутренней архитектуры. И в таком режиме, как мне кажется, понимание приходит гораздо быстрее. По крайней мере, лично у меня.

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

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

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

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

Мне близка по духу статья от mail.ru: Современный PHP без фреймворков, в которой автор хотел показать устройство всех фреймворков и что они представляют из себя на самом деле.

В последнее время, в моей жизни стало очень много легаси кода из 2000-х. Проект старый, но интересный. Который к тому же нужно перевести на новые рельсы (если будет интересно, я обязательно расскажу). Выглядит он примерно также, как и код в начале статьи: верстка, sql и логика в одном файле. Но у меня есть прививка от легаси. Я знаю как с ним работать и как его рефакторить. Но что будет делать человек, который умеет писать только на фреймворках?

Он просто не столкнется с таким проектом :)

Автор: dimsog

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js