• Попросили проверить код, на что смотреть нужно?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Смотря зачем)). Я когда делаю Code Review критерии следующие:

    * Безопасность:
    - Каждый аргумент метода простого типа должен проверяться на тип в случае его проксирования и на граничные значения в случае обработки. Чуть что не так - бросается исключение. Если метод с кучкой аргументов на 80% состоит из поверки из аргументов - это вполне норм))
    - Никаких trigger_error, только исключения.
    - Исключения ДОЛЖНЫ быть человеко-понятны, всякие "Something went wrong" можно отдавать пользователю, но в лог должно попасть исключение со стектрейсом и человеко-понятным описанием, что же там пошло не так.
    - Каждый аргумент (объект) метода должен быть с тайпхинтингом на этот его класс, или интерфейс.
    - За eval как правило шлю на **й.
    - @ допускается только в безвыходных ситуациях, например проверка json_last_error.
    - Перед работой с БД - обязательная проверка данных.
    - Никаких == и !=. Со swtich - единственное исключение, по ситуации.
    - Если метод возвращает не только bool, а еще что-то - жесткая проверка с ===, или !== обязательна.
    - Никаких условий с присваиваниями внутри. while($row = ...) - тоже идет лесом.
    - Магические геттеры/сеттеры разрешаются только в безвыходных ситуациях, в остальном - запрещены.
    - Конкатенации в sql - только в безвыходных ситуациях.
    - Параметры в sql - ТОЛЬКО через плейсхолдеры.
    - Никаких глобальных переменных.
    - Даты в виде строки разрешаются только в шаблонах и в БД, в пхп коде сразу преобразуется в \DateTimeImmutable (в безвыходных ситуациях разрешено \DateTime)
    - Конечно зависит от проекта, но как приавло должно быть всего две точки входа: index.php для web и console(или как-то по другому назваться) - для консоли.

    * Кодстайл PSR-2 + PSR-5 как минимум, + еще куча более жестких требований (для начала все то что в PSR помечено как SHOULD - становится MUST)
    - В PhpStorm ни одна строчка не должна подсвечиваться (исключением является typo ошибки, например словарик не знает какой-то из аббревиатур, принятых в вашем проекте). При этом разрешается использовать /** @noinspection *** */ для безвыходных ситуаций.
    - Если кто-то говорит, что пишет в другом редакторе и у него не подсвечивается, на эти отговорки кладется ВОТ ТАКЕЕЕНЫЙ мужской половой **й и отправляется на доработку)).

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

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

    * Принципы MVC:
    - Никаких обработок пользовательского ввода в моделях, от слова совсем.
    - Никаких ***ть запросов в БД из шаблонов.
    - Никаких верстки/js/css/sql-ин в контроллерах.
    - В моделях НИКАКОЙ МАГИИ, только приватные свойства + геттеры с сеттерами.
    - В моделях разрешено использовать метод save(при наличии такого разумеется) только в исключительных ситуациях. Во всех остальных - либо insert, либо update.

    * Принципы SOLD:
    - Никаких божественных объектов умеющих во все.
    - Если метод для внутреннего пользования - private, никаких public.
    - Статические методы разрешаются только в случае безвыходности.

    * Принцип DRY разрешено нарушать в случаях:
    - Явного разделения обязанностей
    - В тестах (каждый тест должен быть независимым, на сколько это возможно)

    * Работа с БД:
    - Запрос в цикле должен быть РЕАЛЬНО обоснован.
    - За ORDER BY RAND() - шлю на***й.
    - Поиск не по ключам (конечно если таблица НЕ на 5 строк) запрещен.
    - Поиск без LIMIT (опять же если таблица НЕ на 5 строк) запрещен.
    - SELECT * - запрещен.
    - Денормализация БД должна быть обоснована.
    - MyISAM не используется (так уж)) )
    - Множественные операции обязательно в транзакции, с откатом если чо пошло не так.
    - БД не должна содержать бизнес логики, только данные в целостном виде.
    - Не должно быть нецелесообразного дерганья БД там, где без этого можно обойтись.

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

    * О людях:
    - "Я привык писать так и буду дальше" - не вопрос, ревью пройдешь только когда поменяешь свое мнение.
    - "Я пишу в vim-е и мне так удобно" - здорово, код консолью я тоже в нем пишу)) но есть требования к коду, если в них не сможешь - не пройдешь ревью.
    - "Я скопировал этот страшный метод и поменял 2 строчки" - это конечно замечательно, но по блейму автор всего этого метода ты, так что давай без говняшек, хорошо?
    - "Оно же работает!" - вот эта фраза переводится примерно так: "да, я понимаю, что пишу полную хрень, но не могу писать нормально потому, что руки из жо", я правильно тебя понял?))
    - "У меня все работает!" - рад за тебя, а как на счет продакшна?
    - "Там все просто" - не используй слово "просто", от слова "совсем". Вот тебе кусок кода (первого попавшегося с сложной бизнес логикой), где там ошибка (не важно есть она, или нет)? Ты смотришь его уже 2 минуты, в чем проблема, там же все "просто"))

    * Всякое:
    ActiveRecord (это я вам как в прошлом фанат Yii говорю) - полное говно, примите за исходную. По факту у вас бесконтрольно по проекту гуляют модельки с подключением к БД. Не раз натыкался на то, что в тех же шаблонах вызывают save, или update (за такое надо сжигать).
    То, что используется Laravel - это печально((. Что бы выполнить требования приведенные выше, приходится "воевать" с фреймворком.

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

    UPD

    Формализировал данные критерии по ссылочке: https://github.com/index0h/php-conventions
    Ответ написан
    55 комментариев
  • Найти работу web-программистом в Америке/Майами/NY?

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

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

    У меня есть пара знакомых, которые уехали в начале 2000-х по программе "ворк-енд-тревел" от универа и не вернулись - оставались там нелегалами какое-то время, легализовались через браки.

    Есть еще вариант попробовать уехать через учебу в Школе Портнова. У него на ютуб-канале много роликов на эту тему.
    Ответ написан
    9 комментариев
  • Можно ли уменьшить эффект "наложения" WI-FI сигналов от двух роутеров?

    kotomyava
    @kotomyava
    Системный администратор
    Если у вас wifi n, и полоса выбрана 40MHz, то вам надо разнести частоты дальше чем 6 и 11 каналы, например на 1 и 11 каналы, или переключиться на 20MHz полосу.
    А ещё лучше поставить какой-нибудь inSSIDer, и посмотреть, что в эфире творится и выбрать наименее загруженные каналы.
    Ответ написан
    3 комментария
  • Можно ли уменьшить эффект "наложения" WI-FI сигналов от двух роутеров?

    Jump
    @Jump
    Системный администратор со стажем.
    Есть две точки wi-fi. Находятся в полуметре друг от друга.
    Печальная ситуация.

    при работе двух одновременно, сигнал от одной из них ухудшается, как на растоянии, так и в близи.
    Разумеется, так и должно быть. Только сигнал не ухудшается - ухудшается соотношение сигнал/шум.

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

    Пробовал менять каналы на 6 у одного, 11 у другого - эффекта нет
    . А откуда ему взяться?
    Ответ написан
    8 комментариев
  • В чем суть интерфейсов в программировании?

    @ZzZero
    Я делаю систему контроля яркости.
    Я хочу настраивать яркость всего (гирлянды, люстры, фонарика, экрана телефона).
    В коде выглядит примерно так
    class BrightControl
       public void setDefaultBright(Object obj){
             obj.setBright(10);
       }
    }

    Метод setDefaultBright принимает любой объект. Ведь мне всё равно яркость чего настраивать.
    Мой код используют другие разработчики, я не могу контролировать их.
    Как мне убедиться, что у объекта, который мне пришел в качестве аргумента, есть метод setBright?
    Я пишу интерфейс, и говорю, что метод setDefaultBright принимает только объекты, которые реализуют этот интерфейс.

    Если кроме меня самого никто не будет использовать эту систему контроля яркости. То я просто буду держать у себя в голове, что в метод setDefaultBright можно отправлять только объекты, у которых есть метод setBright, но поддержка кода усложняется, через год и не вспомнишь...
    Ответ написан
    3 комментария
  • Зачем нужны исключения?

    crmMaster
    @crmMaster
    Вместо ожидаемого массива вы получите строку. Поведение функции не определено.

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

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

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

    Вообще, вопрос очень странный, джуниорам за такие вопросы надо проводить профилактическую беседу про ООП и обработку ошибок, а за подобный код - бить по рукам палкой.
    Ответ написан
  • Что использовать в качестве логгера на php?

    @D3lphi
    Ответ написан
    Комментировать
  • Объясните как работает php-fpm?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Для начала почитайте что такое SAPI. Затем представьте что apache + mod_php разделили на web-сервер, который проксирует запросы на php-fpm и отдает статику, и собственно отдельный web-сервер который имплементит SAPI и выполняет запросы связанные только с php. То есть статику отдавать мы можем только через php. Суть примерно та же что и у apache2 + prefork + mod_php но оптимизированный только для работы с php. Так же можно поставить на фронт более быстрый и легковесный сервер который умеет проксировать запросы.

    То есть php-fpm это эдакий fast-cgi сервер который постоянно держит готовые для работы пул-процессов (сколько в пуле процессов настраивается, так же как и от какого пользователя их запускать и все такое прочее). Каждый новый запрос уходит в какой-либо процесс из пула, запрос отрабатывает, возвращаем результат тому кто попросил (web-серверу обычно). Если процесс падает (fatal допустим) - поднимаем новый.

    Принципиальной разницы между apache2+mod_php нету, просто упрощается инфраструктура. Наш web-сервер должен только уметь проксировать запросы и отдавать статику, а php-frpm вообще может быть на разных машинах (балансировщиком можно раскидывать запросы). Ну и сами понимаете, nginx + php-fpm будет быстрее обрабатывать запросы чем apache2+mod_php какой бы мы менеджер процессов не использовали в апаче. Минусов по сравнению с apache+mod_php я даже не могу предложить.

    А php-runtime не зависит от этого. Он один на всех, CLI, FPM, mod_php...
    Ответ написан
    7 комментариев
  • Как создавать action's без ExtraPatterns в Yii2 REST API?

    Danakishi
    @Danakishi
    Full stack web dev
    Все же есть из коробки, если речь идет о rest api. В правила обработки запросов, нужно указать класс yii\rest\UrlRule для нужного контроллера, а там уже если потребуется, можно расширять с помощью patterns и extraPatterns.

    Для примера конфигурация на одном из моих проектов:
    'urlManager' => [
                'enablePrettyUrl' => true,
                'enableStrictParsing' => true,
                'showScriptName' => false,
                'rules' => [
                    [
                        'class' => 'yii\rest\UrlRule',
                        'pluralize' => false,
                        'controller' => [
                            'v1/product',
                            'v1/user',
                        ],
                    ],
                 ],
              ],
    Ответ написан
    4 комментария
  • Есть ли учебный материал по паттернам на основе пошагового создания веб-приложения?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    та еще зажигалка...
    Читайте про паттерны, но используйте только те что понимаете и кажутся удобными. Сейчас в области стандартов творится полный ахтунг, взять хотя бы psr-6..
    Ответ написан
    Комментировать
  • Как работать с Git на двух компьютерах с одного аккаунта?

    MagnetonBora
    @MagnetonBora
    Без разницы на скольки компьютерах ты работаешь. На одном пишешь код, делаешь коммит, потом делаешь пуш.
    git add my_file.txt
    git commit -m 'Updates'
    git push origin <branch_name>

    На другом компьютере:
    git fetch -p
    git pull origin <branch_name>

    Либо если не делал еще изменений на домашнем компе, то можно так:
    git fetch -p
    git reset --hard origin <branch_name>

    или так
    git fetch -p
    git rebase origin <branch_name>

    Потом после того как на этом компе написал код, то делаешь коммит и пуш.
    Ответ написан
    4 комментария
  • Какой паттерн применить в данной ситуации?

    LeEnot
    @LeEnot
    Енот-андроид
    ИМХО, вы заморачиваетесь. Тут достаточно паттерна "стратегия". Фабрики и строители нужны для крупных проектов, которые планируется долго поддерживать и расширять, прототип вообще не в тему тут - он нужен, когда копировать существующий объект проще, чем конструировать новый (например, при наличии множества вычисляемых полей).
    Ответ написан
    Комментировать
  • Бекэнд - что надо, а что нет?

    woonem
    @woonem
    Apache/lighttpd + htaccess / NGINX
    Протоколы: HTTP, HTTPS, Сокеты, RTMP
    Туннелирование, Прокси, Модель OSI
    HTTP-заголовки, в том числе Cookies
    PHP/RoR, HTML, CSS, JS
    long polling, AJAX, JSON - для JS
    IRC (семафоры, PCNTL, LOCK_EX, Mutex, Shared Memory) - для PHP
    Фреймворки: Yii2/Laravel/CodeIgniter/Symfony/Composer - PHP, Angular/React+Redux/Vue/Node - JS
    ООП, Паттерны проектирования (MVC/MVVM/Singleton...)
    SQL (MySQL + PHP, Поисковые технологии (индексирование, выборка)
    Пользоваться: Linux, JSBin, Git/SVN, SSH, VNC, RDP
    Ответ написан
    2 комментария
  • Yii2 - как правильно организовать структуру?

    В common - модели, во фронтенд - контроллеры для фронтенда, в бекенде - наоборот.
    Т.е. делаете модуль в common и от него наследуете все остальные в бекенд и фронтенд
    Ответ написан
    7 комментариев
  • Как правильно учиться PHP / mySQL?

    @Ig_or
    я использую курсы "Специалист"
    new-rutor.org/torrent/154641/specialist-videokursy...
    там есть все ответы на твои вопросы...
    Специалист - Видеокурсы по Интернет-технологиям:
    - Web,
    - HTML,
    - CSS,
    - PHP,
    - JavaScript,
    - AJAX

    если антивирус не пустит на (new-rutor.org) тогда на ex.ua заглени, материал можно и там скачать...
    очень полезная вещь хоть и старенькая версия,
    кстати апач не настраивай как в первом видео написано, там какая то ошибка, или со временем поменялось что то в настройках..
    удачи..
    Ответ написан
    1 комментарий
  • С чего начать обучение для фриланса?

    kumaxim
    @kumaxim
    Web-программист
    И так, с чего начать обучение:
    1.Самый низкий порог вхождения у языка PHP. Начинайте именно с него
    2.Изучите популярные CMS: WP, DLE, Joomla и т.д. Очень много заказов есть типа "Создать сайт", причем экзотики в 2 из 3 проектах не нужно. Здесь минус в том, что школоты тут полно и цену они сбивают весьма сильно...
    3.Далее категория заказов "А можно ли сделать вот так". Сводится все это к разработке/переработке модулей на все тех же CMS. Нужно учить PHP + API этих самых CMS. Возьмите один движок и копайте по нему в эту область, не рвитесь сразу за всеми. Порог вхождения тут тоже не велик, но здесь больше голодные студенты обитают
    4.Когда перерастете уровень дополнений/модулей, переходите к фреймворкам. Сейчас самый популярный Yii. Фреймворк позволяет Вам делать какие-то уникальные приложения, которые достаточно тяжело реализовать на готовых системах. Здесь ценник по существеннее, чем в первых двух, т.к. школота в силу своих умственных способностей сюда влезть не может.

    Теперь расскажу как вообще этому обучаться на своем примере. Я делаю так:
    1.Открываю тоненькую книжечку по языку(листов 100, не более), смотрю на основы
    2.Делаю примеры из этой книжке в IDE/блокноте. Это дает мне определенную базу
    3.Далее у меня есть список из примерно 20 задач(любую методичку по программированию откройте), которые я всегда делаю на новом языке. Это позволяет мне "привыкнуть" к новому коду и начать изучать стандартную библиотеку языка
    4.Затем я начинаю брать низкобюджетные заказы на фрилансе по этому языку
    5.После этого начинаю учить самый популярный фреймворк языка, опять же на низкобюджетных проектах.
    6.Сделать с 12-15 проектов я могу уже браться за что-то более менее серьезное с почасовой оплатой на фултайме.

    Вот это мой путь. По срокам - базу я себе нарабатываю за 1,5-2 месяца, на это время у Вас должна быть какая-то "подушка".

    P.S. надеюсь помог. ))
    Ответ написан
    7 комментариев
  • Программисты какой специализации самые высокооплачиваемые сейчас?

    IgorO2
    @IgorO2
    73
    Программист-сантехник =))))
    Ответ написан
    Комментировать
  • Изучаю python для последующего освоения django. Где искать скринкасты?

    makol
    @makol
    Посмотрите, возможно пригодиться,
    python-3.ru
    yellow-duck.net
    Что почитать бы по python?
    Ответ написан
    Комментировать
  • Во что превратилась javascript и что представляет из себя node.js?

    @kxyu
    Почитайте: github.com/maxogden/art-of-node. В частности, такой момент:

    Like any good tool, node is best suited for a certain set of use cases. For example: Rails, the popular web framework, is great for modeling complex business logic, e.g. using code to represent real life business objects like accounts, loan, itineraries, and inventories. While it is technically possible to do the same type of thing using node, there would be definite drawbacks since node is designed for solving I/O problems and it doesn't know much about 'business logic'.


    То есть, node.js для энтерпрайза не очень хорошо подходит. В теории, можно сделать все тоже самое, что и на джаве, но ценой больших усилий — придется постоянно следить, как бы не заблокировать процесс длительной операцией, придумывать схему для надежного деплоя и т. д. Node.js ориентирован на производительность за счет усложнения разработки, а энтерпрайз решения (в том числи и JavaEE) — на ускорение разработки и надежность за счет производительности.
    Ответ написан
    Комментировать