• Какие хорошие книги вы знаете по системному мышлению (на русском)?

    @Gregory
    Посоветую книги Элияху Голдратта по теории ограничения систем (ТОС) - "Цель", "Цель 2". Великая вещь
    Ответ написан
    Комментировать
  • Какие хорошие книги вы знаете по системному мышлению (на русском)?

    @thenno
    Проектирую, разрабатываю, преподаю.
    Самое лучшее, что я видел на русском о мышлении - это книги по ТРИЗ от Альтшуллера. Сами книги легко гуглятся.
    Ответ написан
    Комментировать
  • Попросили проверить код, на что смотреть нужно?

    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 комментариев
  • Из чего состоит окружение продвинутого php разработчика?

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

    1. docker-окружение
    (в 90% случаев для веб-разработки достаточно php -S 0.0.0.0:8000)
    виртуальные машину становятся нужны:
    - когда надоест переустанавливать хост-систему из-за обилия хлама
    - когда работаешь с несколькими проектами имеющие специфические (разные) настройки окружения(php, web-сервер, база)
    - когда надоест решать проблемы в команде из-за того что по разному настроено окружение

    2. git - система контроля версий
    Помнить что ты и когда изменял, должен не человек, а машина.
    Это необходимо:
    - чтобы не испортить всю работы за прошедший год нажав del
    - чтобы определить кто из команды злодей и все испортил
    - чтобы не думать как перенести свежую версию проекта с одной машины на другую

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

    4. behat + phpspec
    Тесты нужны:
    - когда хочется почувствовать себя безопасности и для сладко спать ночь, забыв о кошмарах о сломанном коде
    - когда в production все снова сломалось
    - когда ты написал одну новую фичу, а сломал три

    5. zsh
    Хорошей консолью приятно пользоваться, работа идет быстрее.
    Консоль есть жизнь, жизнь есть shell.

    6. tmux
    Мало одно окошка в консоли, тогда tmux идет к вам.
    В качестве бонуса получите возможность парного программирования совершенно бесплатно

    7. tmuxinator
    Надоело каждый раз открывать кучу окон для tmux, попробуйте его )
    8. vim
    - Потянуло на что-нибудь необычное?
    - Хочется эффективнее писать код ?
    Ну что открыли vim? В первый раз? Поздравляю закрыть вы его не сможете )
    Вызывает зависимость при частом потреблении


    9. continuous integration сервер
    Вообще ci сервер это одушевленная машина. Это твой тамагочи, ты кормишь его хорошим кодом, он радуется и ты видишь приятный зеленый огонек. Если ты дал с код от скажет что не вкусно. Ну а если ты ему, что гнилое он будет долго на тебя орать плохими словами. Со временем он растет и учится делать более серьезные вещи, и начнет помогать тебе:
    Его скилы:
    - он может сам выполнить 10 минутные тесты
    - подготовить и опубликовать проект
    - рассказать о твоем коде, даже то что ты не знаешь
    Он легко обучается и ты легко сможешь научить его удивительным вещам.

    10. куча линтеров на pre commit hook
    Чтобы ci не кормить плохими продуктами, хорошо бы проверять что ты сделал до отправки на сервер. Что бы не забыть это сделать git сам работу.

    11. gulp
    gulp - это еще один твой помощник.
    как если использовать, как watcher файлов + livepreview, можно забыть о F5 в браузере

    12. bower
    Тоже что и composer но для управления ассетами. Это я о всяких jQuery и Bootstrap

    666. Линукс
    Даже если не хочется ставить как хост-систему, его все равно надо знать. Ваш код будет работать на нем )
    Ответ написан
    16 комментариев
  • Насколько "быдлокодерским" подходом является хранение сериализованных массивов в SQL?

    laska
    @laska
    PHP/JS разработчик
    В идеальном мире, где пони какают бабочками, так делать конечно нельзя.
    В нашем мире, такое есть, к примеру, в Wordpress - самой популярной CMS в мире.
    Разумеется, у вордпресса весьма уродливый код, но это не мешает им быть сверхуспешными.

    Давайте по чесноку. Нормализированная таблица это круто, но зачастую очень дорого. Кинуть данные сериализированного массива в ячейку и потом ее достать - 10 минут работы программиста.
    Проектировать хорошую БД - на порядки сложнее (и требует программистов более высокой квалификации).
    И самое печальное, второй вариант на 1500 записей не нужен. Можно и в файлах хранить, в общем то. Но с БД будет несколько прикольных фич из коробки. Если хранить в файлах, нужно писать ORDER или SELECT самим, что занимает некоторое время.

    Поэтому, с точки зрения бизнеса, подход "и так сойдет" более выгоден по деньгам, хоть и оскорбляет ваше чувство прекрасного.
    Ответ написан
    5 комментариев
  • Как вы организовываете валидации в flux/react.js?

    @roman01la
    В идеале у вас должен быть компонент типа <InputValidator /> который оборачивает поле ввода и имеет в себе логику валидации. В этот компонент можно передать правила валидации (pattern, length, и т.д.), а на onChange уже делать dispatch и обновлять глобальное состояние.
    Статус валидности можно передавать прямо в onChange, вторым параметром, после события, или добавлять в объект события.

    Компонент с валидацией поля не должен быть привязан изнутри к вашему коду, он должен быть черным ящиком.
    Ответ написан
    3 комментария
  • Как побороть свою лень?

    @Mintormo
    Сколько людей столько и способов сладить с ленью. Лень - понятие обширное. Под этим словом может скрываться и желание поспать, и голод, и нехватка витаминов, и болезнь, и просто отсутствие интереса. Важно найти причину. Я вот спустя какое-то время понял, что сам процесс программирования мне неинтересен. Мне больше интересно понимать как работают технологии. Меня может увлечь интересная идея какой-то программы, интересная мне задача, но не сам процесс. А это значит что я обречен лениться. Вот теперь и думаю: стоит ли становиться программистом если нужно каждый день по 8-10 часов программировать?
    Ответ написан
    4 комментария
  • Как побороть свою лень?

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

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

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

    redfieldone
    @redfieldone
    Старый , лысый и без денег.
    Я отработал год с минимумом выходных, где то 5 в общей сложности. Частенько не спал, а бывало и по 2.5 суток, результатов в денежном эквиваленте не много, еще и кинули 1 раз, причем те от кого точно не ожидал.
    Теперь работаю скрипя зубами и не то что бы с ленью, а даже с ненавистью, учусь так же .

    Мораль:
    1. Что бы не было лень, нужно отдыхать от работы , да подальше от компьютера.
    2. Что бы любить свое дело , нужно работать прежде всего головой , а не рваться в бой выписывая тонны кода , пускай качественного . Но ваш личный результат зависит не от количества строк, а от вашего личного плана действий и от желания (Пункт 1).
    3. Заказчики подождут, не спешите рваться в бой , обдумайте сначала не только план работы, но и выход из ситуаций на случай того если заказчик откажется платить или оплатит не полную цену.
    Ответ написан
    Комментировать
  • Как побороть свою лень?

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

    Я заметил, что когда лень, а ты пытаешься её побороть, она на дольше только остается.

    ps// А может лень - это подсказки свыше: "еще не время, отдохни..."
    Ответ написан
    Комментировать
  • Как побороть свою лень?

    Bandicoot
    @Bandicoot
    Вась-программист
    Я просто сразу начинаю писать код, не думая о результате. Настраиваю себя на рабочий процесс. Потом, когда уже пойдет-поедет и я войду в состояние "потока", начинаю работать с умом. Просматриваю, что уже написал. При необходимости переписываю и решаю, что делать дальше.
    Сначала нужно вообще что-то сделать, затем сделать это правильно и потом сделать как следует.
    Ответ написан
    1 комментарий
  • Как обновлять CMS с открытым исходным кодом с помощью GitHub?

    vshemarov
    @vshemarov
    Я так понимаю, что выше Вам советовали самому не ковырять ядро CMS, тогда и обновления проще выполнять.

    При правильном подходе это делается так: есть сама CMS, которая регулярно обновляется, а есть расширения, которые пишутся под конкретный сайт, и которые обновляет разработчик сайта. И эти две сферы, в общем-то, не должны пересекаться. Тогда обновление самой CMS никоим образом не затрагивают вашего кода. Хотя, конечно, иногда приходится и код расширений менять, если меняется API работы с ядром, или структура БД и т.д.

    Если же без вмешательства в ядро CMS никак не получается, то вариант только один - делать форк этой CMS, и при выходе новой ее версии руками аккуратно мержить изменения, а потом уже на сайт заливать
    Ответ написан
    Комментировать
  • В чём понт SAS?

    alexzeynikov
    @alexzeynikov
    Ох, сигейта нет на вас ;). Я видел отличную презентацию про отличия SAS и SATA у Игоря Макарова из Seagate. По стараюсь кратко и по существу.

    Ответов несколько и с разных сторон.
    1. С точки зрения протоколов, SAS — это протокол, направленный на максимальную гибкость, надежность, функциональность. Я бы сравнил SAS с технологией ECC для памяти. SAS — это с ECC, SATA — без. Примером могут служить следующие уникальные фичи (по сравнению с SATA).
    — 2 полнодуплексных порта на устройствах SAS в отличие от одного полудуплексного у SATA. Это дает возможность строить отказоустойчивые много дисковые топологии в системах хранения данных.
    — end-to-end data protection T.10. — набор алгоритмов SAS, позволяющий с помощью чексумм быть уверенным в том, что данные, подготовленные на запись без искажений записаны на устройство. И прочитаны и переданы на хост без ошибок. Эта уникальная функция позволяет избавиться от так называемых silent errors, то есть когда на диск пишутся ошибочные данные, но никто об этом не знает. Ошибки могут появиться на любом уровне. Чаще всего в буферах в оперативной памяти при приеме-передаче. Silent errors — бич SATA. Некоторые компании утверждают что на диске SATA объемом боле 500 ГБ вероятность повреждения данных хотя бы в одном секторе близка к единице.
    — про мультипасинг говорили в предыдущих ответах.
    — зонинг T.10 — позволяет разбить домен SAS на зоны (типа VLAN, если такая аналогия ближе).
    — и многое-многое другое. Я привел только самые общеизвестные фичи. Кому интересно — читайте спецификации SAS/SATA

    2. Не все SAS диски одинаковы. Есть несколько категорий SAS и SATA.
    — т.н. Enterprise SAS — обычно 10K или 15K оборотов в минуту. Объемы до 1 ТБ. Используются для СУБД и критичных к скорости приложений.
    — Nearline SAS — обычно 7.2K, объемы от 1 ТБ. Механика таких устройств похожа на Enterprise SATA. Но все равно два порта и другие прелести SAS. Используются в enterprise, где нужны большие объемы.
    — Enterprise SATA, иногда RAID edition SATA — почти то же самое что и NL SAS, только однопортовый SATA. Чуть дешевле NL SAS. Объемы от 1 TB
    — Desktop SATA — то что ставится в PC. Самые дешевые и самые низкокачественные диски.
    Первые три категории можно ставить в массивы на контроллерах от LSI и Adaptec. Последний — нельзя категорически. Проблем не оберетесь потом. И не потому, что у нас картельный сговор, а потому, что диски проектируются под разные задачи. То есть 8x5 или 24x7, например. Есть также такое понятие как максимальная допустимая задержка, после которой контроллер считает диск умершим. Для десктопных дисков она в разы больше. Это значит, что под нагрузкой рабочие Desktop SATA будут «вываливаться» из массива.
    Короче, ориентируйтесь на конкретные линейки под конкретные задачи. Лучше всего смотреть на сайтах производителей. Есть например специальные мало шумящие и мало греющиеся винты для домашней электроники.

    Те же подходы и к SSD, но область еще на сформировавшаяся, поэтому много тонкостей. Здесь мы ориентируемся по параметрам. Хотя все, что сказано в п., справедливо и для SSD.
    Ответ написан
    1 комментарий
  • В чём понт SAS?

    merlin-vrn
    @merlin-vrn
    Плюс SAS — вовсе не в скорости. В этом вопросе они не отличаются от SATA. Вплоть до того, что диски практически идентичны по «железу», а отличаются только прошивкой. А то иногда SATA и быстрее, если это SSD ;)

    На сегодня главное отличие SAS — multipath. Вы можете подключить корзину (ну или экспандер) с дисками не одним, а, скажем, четырьмя линиям, и нагрузка будет на них распределяться, и отказа линии (контакт в разъёме плохой, например, или при каких-то работах с сервером «на горячую» провод зацепили) на работоспособности системы не скажется — ОС может даже и не заметить сбоя, только снизится производительность.
    На SATA такое невозможно.
    Ответ написан
    5 комментариев