жрецы программирования
Совсем недавно я понял, отчего многие программисты, использующие PHP, отличаются от программистов «в целом». Основой для моего понимания стали слова Руслана Косолапова: «Это PHP. Понять невозможно, только запомнить». А ведь действительно, это так. Объясню, почему.
Практически все, кто плотно работает с PHP, соглашаются, что язык вовсе не прост в изучении: если в большинстве языков надо понять принципы, заложенные в язык, а потом обращаться к документации по необходимости, то тут фокус не прокатывает: в документацию придётся смотреть практически всё время — потому, что логика не работает. Дело в том, что PHP имеет огромное, неимоверное количество функций, размазанных в глобальной области видимости. Функции эти писались в разное время, разными людьми, без чётких соглашений о том, как их называть, как организовывать приём параметров, как возвращать результаты. Очень и очень многое сложилось стихийно, исторически, а раз так сложилось, то переделке уже не подлежит. В рамках каждого расширения — свой стиль и своя логика. Область видимости, в которую импортируются функции из расширений, — глобальная, а глобального стандарта не было, нет, и уже очевидно, что не будет: слишком велик объём необходимой для этого работы.
PHP — это язык с историей, у него слоёв — как у древнего города. Он начался с набора скриптов на Perl для создания домашней странички, потом был переписан на C (несколько раз). Движок переписывался, а стихийно добавляющиеся функции оставались из соображений обратной совместимости почти неизменными, разве что увеличивали количество параметров. Но так, чтобы список параметров сократился, или, скажем, функция пропала — такого не было на моей памяти (это с 1998-го года). Кстати, порядок аргументов функций надо запоминать. Простой пример: если функциям поиска preg_match() и ereg() необходимо передавать сначала «что ищем», затем «в чём», а третьим, опциональным, параметром можно передать переменную для сохранения найденного, то функции strpos() — наоборот; оцените, кстати, разнородность и нелогичность названий функций как таковых). Что функция возвращает, и в какой ситуации — тоже надо запоминать. Та же strpos() вернёт false в случае, если ничего не найдено, и в документации особо подчёркнуто, что функция может вернуть и 0, то есть сравнивать возвращаемое значение и false надо с учётом типа, так как при проверке без типов целочисленный ноль сконвертируется в false.
Это всё была присказка для тех, кто не слишком в теме. А теперь пристегните ремни: начинается сказка.
Всё вышеописанное требует от программиста наряду с прочими навыками наличия ещё одного парадоксального умения: не пытаться обобщать накопленные знания. Лично мне всегда было проще понять или придумать правило, чем запомнить великое множество случаев, к которым оно подходит. В данном случае исключений из правила будет больше, чем случаев, в которых оно сработает.
Начать работать с PHP можно очень быстро (аккурат засчёт простого и местами удобного синтаксиса). Именно поэтому его и начинают учить новички, да ещё, как правило, параллельно с изучением какого-нибудь проекта. И начинается абсурд: люди изначально привыкают к работе с низкосортным кодом, доставшимся в наследство; а объём кода проектов чаще всего таков, что переписать правильно, по идее, можно, но… только при наличии большого опыта работы, наличии свободного времени, ну и так далее, — сиречь нереально. И плодят, делая свои первые шаги к мало-мальскому мастерству, очередные тонны кода, который будет приводить в ужас всех, пришедших следом.
Такова настройка Windows — там тоже нужно помнить многое. Правил мало, каждая менюшка — частный случай. Хотя вроде бы всё просто и наглядно, но вот лично мне проще прочитать толковую документацию без картинок и настроить нужный функционал в одном месте, чем с умным видом втыкать в книжку-раскраску для самых маленьких. Хотя начать можно просто и быстро, да.
Недавно я читал пост в ЖЖ, где в комментариях прошла идея сравнения эникейщиков Windows и жрецов из D&D. Процитирую: «В игровой системе D&D придумано такое интересное деление для характеристик мыслительных способностей пресонажа: на INT (интеллект) и WIS (мудрость). Для мага более существенен INT, для священника – WIS, хотя игровая суть примерно одна и та же – использование волшебства (что это, как не проекция работы “компьютерщика” с точки зрения среднего обывателя). Впрочем, игровая механика нам тут несущественна, но интересна сама классификация способов постижения мира — путем самостоятельного построения логических конструкций (INT) или путем накопления знаний (WIS)».
Это я к чему: в целом для программиста важнее развитые, «прокачанные» механизмы мышления, чем запоминания разнородных, не связанных друг с другом фактов. Но вот для программиста на PHP ситуация меняется с точностью до наоборот: важно помнить факты, не пытаясь понять. А я-то всё думаю, отчего святая война в проекте между программистами может разгореться из-за того, что один помнит, что кавычки разных типов обрабатываются с разной скоростью (разница ничтожна, но на огромнейших циклах, невозможных в реальной жизни, становится заметной), а второй указывает на то, что на самом деле такого цикла не нужно делать практически нигде и никогда. Для первого это факт, и это следует постоянно учитывать. При этом он же не понимает, что проверять неопределённую переменную в том же цикле — это многократно большая трата ресурсов; что ошибку можно заэкранировать, но ошибка от этого не пропадёт; не понимает, зачем нужна независимость транзакций. Дело не в том, что один из них умнее, а другой глупее, нет. Это просто другой тип мышления, ориентированный на запоминание, а не на стремление собрать данные и проанализировать ситуацию с разных сторон. А сам PHP — как инструмент, как средство, как тема общения, — привлекает к себе людей в первую очередь «запоминательного», а не аналитического типа.
Жрецов программирования.

on 27/12/2010 at 4:19 PM
· Permalink
Бред. Предложите альтернативу PHP.
on 27/12/2010 at 5:18 PM
· Permalink
RoR. Django. Catalyst. Альтернатив полно.
on 27/12/2010 at 4:31 PM
· Permalink
Всё так. Есть такая штука – соционика, в её терминах – одно есть структурная логика, а второе – абсолютная. Это разные аспекты материи, если в одном случае – психика заточена под восприятие связей частиц, а в другом – под счётность. Это нормально – дифференцивция психики. По роже вижу что ты скорее логико-интуитивный интроверт. То есть белая логика, чёрная интуиция. Чёрных логиков больше
on 27/12/2010 at 4:50 PM
· Permalink
Поясни, пожалуйста, что есть первое, а что второе? Я совсем недавно смирился с тем, что интроверт из меня неважнецкий. То есть я экстраверт.
on 29/12/2010 at 5:00 PM
· Permalink
Белая aka относительная aka интровертная она же первая в моих упоминаниях, соответственно, вторая есть чёрная aka абсолютная aka экстравертная логики.
http psychotype ru article a-4 html
Что важно – не надо одних загонять в рамки других, им там плохо, а также использовать разные психотипы там где нужно.
По моим наблюдениям – чёрные логики могут с первых дней проекта начинать колбасить и молотить, демонстрируя производительность, но в глубь понимания системы двигаются мало, меделнно и неохотно. Белые же мало что могут пока не поймут системы (архитектуры, например), но потом, освоившись, могут успешнее и быстрее ей манипулировать делая её гораздо более красивой, эффективной и здоровой.
on 29/12/2010 at 7:42 PM
· Permalink
Ага, ты абсолютно прав. Пока я концепцию не пойму, что-то глобальное менять не полезу. А если вижу, что концепции практически нет, то только меня в этом проекте и видели. Кстати, а что такое “интуиция возможностей”?
on 06/01/2011 at 6:57 PM
Permalink
“интуиция возможностей” по ссылке описана, у меня она болевая (ака точка наименьшего сопротивления) поэтому вряд ли скажу что-то особенно полезное
Чёрные интуиты искренне не понимают вопроса типа “как оценить человека – чего ожидать, кто он, на что способен”, потому что им это просто ясно видно, а мне надо чтобы человек или ситуация подвигалась немного, чтобы я разглядел. А люди которые ЧИ игнорируют они начинают херь нести типа – если человек кофе много налил из автомата то он жадный.
on 29/12/2010 at 8:15 PM
· Permalink
Вообще дело начинает пахнуть более информативной заметкой, не чета этому доморощенному вбросу.
on 06/01/2011 at 7:03 PM
Permalink
Главное не разжигать ненависти, потому что дифференциация психики она врождённая и тупо делать человека неправым неконструктивно. Хотя меня тошнит от этой чёрной логики – где колбасят ради конкретного сиюминутного результата, потому что надо всё в дело, сейчас же в дело. Но это оправданно если посмотреть для чего и для кого это делается – для бизнес приложений, где заказчики такие же члогики и у них есть свои ограничения и требования. Когда они увлекаются то наступает жопа ибо правда в балансе и гармонии.
on 27/12/2010 at 4:38 PM
· Permalink
А что же делать аналитикам? Вот я аналитик и мне этот пхп труден…
on 27/12/2010 at 4:51 PM
· Permalink
Ну я, когда писал на PHP, держал мануал открытым. И не стремился запоминать функции.
on 27/12/2010 at 4:53 PM
· Permalink
Да, я с PHP знаком на вы, и никогда это знакомство на ТЫ не состоялось, я не понимал этого языка, но думал я один такой.
on 27/12/2010 at 4:56 PM
· Permalink
Я с ним знаком на “твою, сука, мать”, но все 12 лет его жутко не любил, хотя сдаю на типа эксперта.
on 27/12/2010 at 9:31 PM
· Permalink
А зачем ВП делает 244 запроса?
244 queries. 1.144 seconds.
on 27/12/2010 at 9:34 PM
· Permalink
Понятия не знаю. Страница закэширована.
on 27/12/2010 at 9:39 PM
· Permalink
будь яэкспертом в PHP, меня бы заинтересовало, почему мой блог генерируется за секунду и делает 240+ запросов. Цифры меняются, значит, они не из кэша.
on 27/12/2010 at 10:29 PM
· Permalink
При обновлениях страницы — меняются. А поскольку в этот блог ходит людей, прям скажем, полтора в год, то лезть в код мне лень.
on 27/12/2010 at 10:35 PM
· Permalink
Ну и кстати, да: напрягаться я начну после 2 секунд.
on 27/12/2010 at 9:40 PM
· Permalink
Можете поделиться ссылками на тесты?
on 27/12/2010 at 10:28 PM
· Permalink
На картинку, gild и на профиль oDesk.
http://picasaweb.google.com/stanislav.shramko/cMpBYB#5379063944944078946
http://www.gild.com/profile/skills
http://www.odesk.com/users/PHP-expert-Linux-system-administrator_~~1041c6102fc2fa38
on 27/12/2010 at 10:15 PM
· Permalink
PHP это результат надстройки над Perl (почти эволюция), в то время как Perl (1987) результат скрещивания AWK(1977)/SH(1977)/tr/grep, которые (языки) наследуют синтаксис C (Си), а C(1972) сам по себе ничего не стоит без POSIX и STD LIBC, отсюда и имеем зоопарк функций и разную логику передачи параметров. А за счет удобного связывания со сторонними библиотеками есть еще куча модулей, которые имеют свою собственную логику именования и передачи параметров.
Так что логика во всех методах есть, если знать откуда ноги растут. И нельзя всех под одну гребенку уравнивать.
Явные примеры: str* и str_* разные наборы API, первый из POSIX, второй свой.
on 27/12/2010 at 10:32 PM
· Permalink
Эволюция, говорите?
“PHP began life as a simple little cgi wrapper written in Perl. I wrote it in an afternoon during a period between contracts when I needed a quick tool to get an idea of who was reading my online resume. It was never intended to go beyond my own private use. The web server where I had my resume was extremely overloaded and had constant problems forking processes. I rewrote the Perl wrapper in C to get rid of the considerable overhead of having to fork Perl each time my resume was accessed.
Eventually other people on the same web server came across my wrapper and asked if they could use it. Then, as inevitably happens, they started asking for more features. I added more features and finally put together a semi-complete distribution along with documentation, a mailing-list and a FAQ. The name of this first package was Personal Home Page Tools, which later became Personal Home Page Construction Kit.
At the same time I started playing with databases and wrote a tool to easily embed SQL queries into web pages. It was basically another CGI wrapper that parsed SQL queries and made it easy to create forms and tables based on these queries. This tool was named FI (Form Interpreter)”.
on 27/12/2010 at 10:31 PM
· Permalink
Спасибо!
Но я интересовался не из-за сомнений в Вашей квалификации, а ради собственной проверки =)
on 27/12/2010 at 10:34 PM
· Permalink
Так проверяйтесь! Там всё просто. Правда, у Zend’ов надо платить (не помню, сколько, но сумма чисто символическая). А на odesk.com и gild всё вообще мило, хотя на мой вкус на gild тесты по PHP слишком лёгкие.
on 28/12/2010 at 2:26 AM
· Permalink
> Бред. Предложите альтернативу PHP.
>> RoR. Django. Catalyst. Альтернатив полно.
Довольно странно предлагать в виде альтернативы языку – фреймворк.
Тогда уж сравнивать ror и django с symfony, yii и zf
Кстати, я не представляю сложность этого процесса, ибо чтобы сделать это толком – надо изучить фреймворк, а тут надо угробить уйму сил.. Да и кому это надо? А потом еще и выяснится, что возможности примерно равны.
Конечно, хотя бы для расширения кругозора было бы полезно разобраться хотя бы в паре фреймворков.
А Вам не кажется, что умение писать хороший код не так уж сильно связано с средствами используемого языка?
А с последовательностью параметров функций помогает подсказка эклипса.
on 28/12/2010 at 12:29 PM
· Permalink
> Довольно странно предлагать в виде альтернативы языку – фреймворк.
Да, согласен, прошу пардону. Но на чистом PHP сейчас мало кто пишет. Из написанных на PHP фреймворков мне нравятся Symfony и Yii, не слишком нравится ZF, ну и если Prado ещё не умер, то, пользуясь случаем, хочу передать ему пожелание быстрой и мучительной смерти.
> Кстати, я не представляю сложность этого процесса, ибо чтобы сделать это толком – надо изучить фреймворк, а тут надо угробить уйму сил.. Да и кому это надо? А потом еще и выяснится, что возможности примерно равны.
Я, когда оценивал фреймы, руководствовался в основном их сложностью (у ZF очень длинные зависимости), лёгкостью расширябельности, гибкостью настройки (ну, например, в самом-самом начале погляда в сторону CakePHP, прочёл, что “модуль” привязывается к таблице в БД; удивился, заранее испугался и убежал), и в общем-то всё.
> А Вам не кажется, что умение писать хороший код не так уж сильно связано с средствами используемого языка?
Хороший код можно писать на чём угодно, но в данном случае я не про умение программировать.
Не знаю, может, по-Вашему, у меня плохой код. Ну, гляньте:
http://www.phpclasses.org/browse/author/752928.html
> А с последовательностью параметров функций помогает подсказка эклипса.
А представьте, что надо фиксить что-то без IDE. Такое бывает. Редко, но случается.
on 28/12/2010 at 5:14 PM
· Permalink
Досадно, что не отправляется на почту ответ на комментарий.
Можно ли сделать выводы относительно Вас на основе этой статьи, как человека, который очень долго пишет на php (уж не всю ли программистскую жизнь?)
Я не буду смотреть Ваш код и оценивать его, поскольку:
1. Вы много опытнее меня.
2. Хороший код и без этого могу посмотреть
3. Плохой – незачем время тратить.
on 28/12/2010 at 5:20 PM
· Permalink
> Можно ли сделать выводы относительно Вас на основе этой статьи, как человека, который очень долго пишет на php (уж не всю ли программистскую жизнь?)
Профессионально программировать начал на Pascal, потом PHP3/Perl, потом J2EE, потом очень долго в основном как раз PHP.
Нет, не всю. Начал я в 13 лет, тогда никакого PHP ещё не было.
on 28/12/2010 at 8:24 PM
· Permalink
Скучно у Вас.
Вас напомнило http://blogs.byte-force.com/xor/archive/2010/09/15/do-you-love-programming.aspx
on 29/12/2010 at 4:45 AM
· Permalink
Конечно, скучно. В 99-м я написал “Программирование как высшая форма творчества”. А сейчас спасти меня может только запил какого-нибудь проекта для себя.