18 августа 2010 г.

Каменный век пора бы оставить

Еще когда я только изучал программирование и игрался с Borland Pascal 7.0 я научился пользоваться встроенным дебаггером. Гениальная фича, позволяющая увидеть значение любой переменной во время выполнения, остановить выполнение программы в любой удобной точке и многое другое.
Но суть не в паскале. Суть в том что PHP это все тоже есть, а народ с завидной упертостью тратит часы на var_dump() и print_r();die(); вместо того что бы потратить пять минут на настройку xdebug и любимого ide (netbeans или PDT|Zend Studio) и наслаждаться процессом дебагинга.
Особенно удивляют люди который "вардампят" внутри Zend Studio. За что платили, то? Аналогично и с Zend Framework, вед Zend_Debug + Zend_Log просто не оставляют шансов var_dump.

В чем причина?

Я думаю в том-самом "легком старте" PHP. Люди научившись находить проблемы одним способом считают что лучше быть не может и останавливаются на этом. Еще народ не хочет учится, хотя для программиста этот процесс должен быть перманентным. Мало внимания уделяют этому и книги, в тоже время вовсю прославляя var_dump.

Что делать?

Лично я решил в ближайшее время написать мини-статью о "правильном" environment разработчика и основе дебагинга, а также в следующих своих записях использовать debug скрины (правда не знаю как, скорее в виде скриншотов) кода вместо простого var_dump и отображения результатов.

16 августа 2010 г.

Получил сертификат PHP5 Zend Certified Engineer

Недели подготовки позади, сомнения и страхи тоже. Очередная поставленная цель достигнута и наконец строчка в Zend Yellow Pages с моим профилем украшает их сайт :)
Вот и решил немного рассказать о тестинге, стараясь не особо повторять то, что уже написано сотни раз.

Подготовка

Zend предлагает помимо самого теста, так называемый Examination Bundle, в который помимо ваучера на экзамен, входит 10 mock exams и книжка по подготовке.
Книжки явно недостаточно, она скорее дает некоторое представление о языке, тем не менее надо повторить все темы самому с помощью справочника на оф сайте php, отдельно повторить RegExp, и разобраться во всех OOD паттернах (Singleton, Adapter, Strategy, Factory и т.д.)
Насчет mock exam - вещь очень хорошая и приятная. Эти тесты помогут очень хорошо представить себе интефрейс ПО используемое в Pearson VUE (программа для сдачи тестов). Но 10 тестов ИМХО перебор, хватило бы 5. Так как вопросы в mock exam не пересекаются с реальными, то просто "натаскиваться" на вопросы не стоит, как и искать правды в интернете. Лучше при сомнении в правильности ответа повторить тематику вопроса еще раз.
Обязательно проверяйте весь предлагаемый код в работе. Даже если ответ для вас очевиден. Код может быть обманчив :). Например вам может показаться что код проверяет ваши знания на передачу по ссылке, а на самом деле код может проверять вашу внимательность на наличие return внутри метода. Ведь mock exam именно для этого и сделан. В конце mock exam вы увидите в какой категории ваши знания отличны, а в какой стоит подтянуться (fail, pass, excellent). С пятого mock я выбивал все Excellent, но тест все равно был очень сложен. Стоит заметить, что времени 90 минут это достаточно много (я прошел екзамен и успел еще два раза полностью перепроверить свои ответы).
После подготовки, на сайте Pearson VUE, можно назначить дату и место сдачи теста. Я сдавал в BMS Consulting, хотя разницы никакой нет. Pearson предъявляет одинаковые требования ко всем тестинг-центрам, поэтому как обстановка так и процесс тестирования будет везде примерно одинаков. Главное прийти вовремя и не забыть паспорт.

Ощущения

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

Выводы

На вопрос "стоит или нет" сдавать тест - ответ однозначно стоит.
После сдачи теста многое изменяется.
Во-первых, сразу выделяешься из серой массы PHP программеров и тех кто считает, что сертификация бесполезна.
Из-за низкого входного порога PHP кодеров развелось довольно много, но их уровень оставляет желать лучшего. Да и при прохождении собеседований приходится все время отвечать на примитивные вопросы. Сертификация призвана отсеять как первую, так и вторую проблему.
Во-вторых, более четко понимаешь то как работает PHP, его идеологию, на что он ориентирован и как лучше использовать его возможности.
В-третьих, практически не остается "белых пятин" в знаниях. 9 из 10 PHP специалистов (не сдававших тест), тонут при затрагивании темы потоков, а сдавшиее тест - плавают в них, как рыба в воде. А потоки, между прочим одна из сильнейших фич в PHP. Процесс подготовки очень сильно структурирован и покрывает практически все возможности и основные модули PHP. Да и вообще, самым полезным в сертификации является подготовка к тесту.
Недостатки в основном общие для всех тестов, который сводится к тому, что тест не заменяет реальный опыт. Поэтому начинающим программистам оптимальным будет набраться опыта 3+ года, а потом сдавать тест.

2 августа 2010 г.

English version

http://websmithen.blogspot.com/ - английская версия этого блога. Фактически этот сайт оригинал, а на английском сайте будут находится только переводы самых интересных на мой взгляд статей.

Думаете вы все знаете про Public vs. Private ?

Давно заметил, что обычно вопросы про модификаторы доступа в ООП заканчиваются на перечислении public, private, protected и что куда наследуется. Но как показывает практика, большинство людей (включая PHP и C++ ) не задумывается как эти модифиакторы влияют на объекты, считая что оно полностью идентично классам. Но это не так.

Ответе на вопрос: Имеем класс A, у класса есть private свойство $pr. Есть метод, который принимает два значения: int и другого экземпляра класса A. Этот метод изменяет свойство pr переданного экземпляра. Допустит ли это компилятор/транслятор?

Давайте попробуем:
PHP
1
2
3
4
56
7
8
9
1011
12
13
14
1516
17
<?php
class A {
    private $pr = "test";
    public function change($val, A $a) {
        $a->pr = $val;    }
    public function __toString() {
        return (string)$this->pr;
    }
} 
$objOne = new A();
$objTwo = new A();
 
$objOne->change("passed", $objTwo);echo $objTwo;
?>

Каков будет результат выполнения кода? Реакция большинства людей весьма предсказуема: fatal error. Объяснением служит то что мы пытаемся изменить private свойство другого объекта. На самом деле. Необходимо помнить что: модифиакторы доступа (в том числе private) ограничивает доступ по отношению к другим классам, но не объектам. Код выполнится, и пользователь увидит "passed". Поскольку объект работает с одним и тем-же классом. Это основы ООП, поэтому такое поведение должно быть идентично в PHP, C++ и других языках.

Поиск