Умных людей на этом свете всегда было, и, к сожалению, всегда будет, гораздо меньше, чем представителей серой массы. Множество людей просто не способно на стремление к постоянному самосовершенствованию и познанию нового. И в этих условиях, среди всего изобилия программистов, найти хорошего профессионала – трудная задача. Дабы попытаться помочь людям, решившим заняться этой нелегкой профессией, я в своем блоге постараюсь поделиться своими мыслями о том, каким должен быть хороший программист.
Я буду возвращаться к этой теме время от времени. Так что читайте мой блог и подписывайтесь на RSS-ленту. Советуйте его своим друзьям и знакомым. Я буду рад читателям.
Начну, пожалуй, с наболевшего
Не будьте эгоистами
Пишите код аккуратно. Наверняка кроме вас над этим же кодом будут работать другие люди. В некоторых проектах число людей, пишущих общий код, может достигать нескольких десятков. Представьте, что было бы, если в таких проектах каждый писал код так, как угодно ему. Это был бы полнейший хаос. Общайтесь с коллегами по работе, читайте их код. Если видите в нем что-либо трудное для понимания, обсудите это.
Есть множество общепринятых вещей, относительно программирования в каждой отдельной среде комьюнити программистов. Но каждый решает сам для себя – принимать эти принципы или нет. Для нахождения этих “правил” далеко ходить не нужно, достаточно лишь зайти на один из форумов по нужной технологии, и посмотреть несколько примеров решений, которые предлагают участники. Как правило, в таких местах все пишут код так, чтобы любой, кто займется его чтением, мог интуитивно понять смысл и последовательность операций.
Обязательно ставьте отступы. Это вообще бич многих программистов. Код без отступов превращает процесс его чтения в очень трудоемкое занятие, а иногда даже хочется все бросить и переписать заново самому.
Вот пара примеров. Посмотрите на этот код:
...
...
<?php foreach($pages as $k => $page) {
if ($page->getTree()->getType_Id() != intval($tpHomepage)) {
$lev_2 = $page->getChildren();
?>
<td class="bord">
<?php foreach($lev_2 as $k => $page2) { ?>
<h3><a href="<?php echo $page2->getUrl()?>" title="<?php echo $page2->getName()?>"><?php echo $page2->getName()?></a></h3>
<?php
if ($page2->getTree()->getType_Id() == intval($tpClosed))
$lev_3 = Doctrine::getTable('Page')->getPageByType($tpClosedShop,$lang->getId());
else if ($page_node2->getTree()->getType_Id() == intval($tpOpened))
$lev_3 = Doctrine::getTable('Page')->getPageByType($tpOpenedShop,$lang->getId());
else
$lev_3 = $page2->getChildren(); ?>
<div class="map_lev_1">
<?php if (sizeof($lev_3)>0) { ?>
<?php foreach($lev_3 as $k => $page3) { ?>
<a href="<?php echo $page3->getUrl()?>" class="plus" title="<?php echo $page3->getName()?>"><?php echo $page3->getName()?></a>
<?php $lev_4 = $page3->getChildren();
if (sizeof($lev_4)>0
&& $page3->getTree()->getType_Id() != intval($tpShop)
&& $page3->getTree()->getType_Id() != intval($tpClosedShop)
&& $page3->getTree()->getType_Id() != intval($tpOpenedShop)
)
{ ?>
<div class="map_lev_2">
<?php foreach($lev_4 as $k => $page4) { ?>
<a href="<?php echo $page4->getUrl()?>" title="<?php echo $page4->getName()?>"><?php echo $page4->getName()?></a>
<?php } ?>
</div>
<?php } ?>
<?php } ?>
<?php } ?>
</div>
<?php } ?>
</td>
<?php } } ?>
...
...
(если вдруг автор данного кода читает эту статью, надеюсь, он возьмет на заметку свои ошибки
)
И на этот:
...
...
<?php foreach($pages as $k => $page): ?>
<?php if ($page->getTree()->getTypeId() != intval($tpHomepage)): ?>
<?php $pagesLevel2 = $page->getChildren(); ?>
<td class="bord">
<?php foreach($pagesLevel2 as $k => $pageLevel2): ?>
<h3><a href="<?php echo $pageLevel2->getUrl()?>" title="<?php echo $pageLevel2->getName()?>"><?php echo $pageLevel2->getName()?></a></h3>
<?php
if ($pageLevel2->getTree()->getTypeId() == intval($tpClosed)) {
$pagesLevel3 = Doctrine::getTable('Page')->getPageByType($tpClosedShop,$lang->getId());
} elseif ($pageLevel2->getTree()->getTypeId() == intval($tpOpened)) {
$pagesLevel3 = Doctrine::getTable('Page')->getPageByType($tpOpenedShop,$lang->getId());
} else {
$pagesLevel3 = $pageLevel2->getChildren();
}
?>
<div class="map_lev_1">
<?php if (sizeof($pagesLevel3)>0): ?>
<?php foreach($pagesLevel3 as $k => $pageLevel3): ?>
<a href="<?php echo $pageLevel3->getUrl()?>" class="plus" title="<?php echo $pageLevel3->getName()?>"><?php echo $pageLevel3->getName()?></a>
<?php $pagesLevel4 = $page3->getChildren(); ?>
<?php if (sizeof($lev_4)>0 && !in_array($pageLevel3->getTree()->getTypeId(), array($tpShop, $tpClosedShop, $tpOpenedShop))): ?>
<div class="map_lev_2">
<?php foreach($pagesLevel4 as $k => $pageLevel4): ?>
<a href="<?php echo $pageLevel4->getUrl()?>" title="<?php echo $pageLevel4->getName()?>"><?php echo $pageLevel4->getName()?></a>
<?php endforeach; ?>
</div>
<?php endif; ?>
<?php endforeach; ?>
<?php endif; ?>
</div>
<?php endforeach; ?>
</td>
<?php endif; ?>
<?php endforeach; ?>
...
...
По-моему разница ощутима.
Подумайте сами, программист пишущий код аккуратно, как правило, имеет авторитет в команде, к нему прислушиваются и понимают. В общем, аккуратность – роскошь, которую не каждый может себе позволить.
Ищите информацию, общайтесь с комьюнити
Это один из наиболее действенных способов находить актуальную информацию об интересующих вас технологиях. Читайте блоги, форумы, подписывайтесь на RSS.
Безусловно, общение полезно, но, с моей точки зрения, только тогда, когда оно продуктивно. Не вступайте в глупый флуд, не засоряйте сеть. Поверьте, людей делающих это и так достаточно. Ваши актуальные и серьезные суждения, куда важнее пустых необоснованных высказываний. Лично я оставляю свой редкий комментарий или пост на форуме лишь тогда, когда вижу, что это действие принесет пользу окружающим. В противном случае, я предпочту потратить свое время более продуктивно.
Купите себе хороший компьютер
Это не шутка. Многие могут думать, что для программирования сильная машина не нужна. Это глубочайшее заблуждение. Для кроссбраузерного программирования вам понадобится много ресурсов для всех открытых окон браузеров и окна среды разработки. Один только firefox ест от 150 МБ до 1 ГБ памяти (я привел данные своих личных наблюдений). Представьте, что иногда происходит с системой, когда в параллели с фаерфоксом, ни капли не стесняясь, ресурсы начинает поглощать java-машина, ведь среда разработки с пятью открытыми проектами пытается пропарсить файл в 30к строк.
Так что, я советую вам с полной серьезностью подойти к вопросу покупки ПК, или, еще лучше, ноутбука с высокими показателями производительности и хорошим теплоотводом – сэкономите кучу нервов.
Практикуйтесь
Это не значит, что вы должны уйти в монастырь, очистить свой разум, и думать только о практике. Но существенное время уделять этому занятию придется. Это нужно не только новичкам, но и гуру, для того чтобы поддерживать свои навыки в актуальном состоянии. Если речь идет о symfony – создайте проект для экспериментов, подключите туда все javascript фреймворки, с которыми вы работаете, и, по возможности, решайте интересные задачи еще не имеющие решения, которые встречаете в сети, и не забывайте делиться своими результатами.
Заключение
На эту тему можно говорить еще много, в рамках одной статьи сказать все не удастся. Но если вы дочитали эту статью до конца, и она показалась вам полезной, значит, вы хотите развиваться – а это самое главное, что бы начать двигаться по верному пути.


Комментариев - 8
Это что 4х уровневое дерево каталога так раскручивается???
А если уровней больше потребуется? 228vit(Quote)
Отвечаю только сейчас, т.к. был в отпуске.
Это четырех-уровневая карата сайта. В данном примере нужно было реализовать карту с именно такой глубиной вложенности. Хотя в том случае, когда нужна полная вложенность, нужно использовать рекурсию. catch(Quote)
Омайфакинггад. код который вы привели ужасен. а то что вы написали, расставив табы в нужных местах, еще более ужасно. этот код надо переписывать и рефакторить. Евгений(Quote)
=) ok
Приятно слышать хоть какие-то мысли.
Аргументируйте свою точку зрения. catch(Quote)
Первое, что бросает в глаза – это большая вложенность. неужели нужна вложенность равная семи?
Второе, для задачи «карта сайта» лучше все же использовать рекурсию, как писалось выше. Если нужна какая-то определенная глубина, ее так же можно контролировать рекурсией. getSiteMap($obj, $deep=-1); где параметр $deep используется для контролирования глубины. Рекурсия продолжает до тех пор пока есть чайлды или пока глубина не равна 0. Рекурсия вызывается, уменьшая параметр на 1. getSiteMap($obj, $deep-1);
Третье вытекает из второго. этот код абсолютно непереносим – что если потребуется карта сайта глубиной 3? 4?… 10? Представьте какой будет ужас если вложенность будет равно например семи.
Четвертое, самое главное, на мой взгляд, это смесь представления, модели и контроллера в одном месте. Вы же используете MVC фреймворк, он то как раз диктует правила игры и стуктурирования вашего кода…
Пятое вытекает из четвертого: я не являюсь специалистом в Doctrine, но код Doctrine::getTable… кажется, выполняет запрос к базе. Тогда что произойдет, если на втором уровне будет не три страницы а скажем сто три? Евгений(Quote)
В принципе, я со всем согласен. Все эти суждения верны. Только дело в том, что статья не о написании кода конкретно symfony. Пример приведен для того, чтобы призвать неопытных людей писать читабельный код. Безусловно, с точки зрения подхода к программированию в рамках symfony, оба варианта, мягко говоря, кривоваты и грубы.
По хорошему, в таком случае, нужен рекурсивный компонент, а не просто метод. Вызов отдельного рекурсивного метода ограничивает нас использованием лишь представления, также как и приведенные примеры. Хотя можно запускать 2 рекурсии. Одну для контроллера, для сбора массивов данных. Вторую для обхода этих массивов в представлении. Но этот вариант тоже неоправдан.
Doctrine::getTable() лишь возвращает объект таблицы. Запросов к базе он не делает. Хотя методы этого объекта действительно так или иначе работают с базой. Сто три запроса к базе, конечно, ничего хорошего не принесут. catch(Quote)
Всегда нужно стремиться к лучшему..
Можно упростить и улучшить, но лучше написать заново)) Чёрный список работодателей Казахстана!(Quote)
Я хочу стати ХАКЕРОМ Женя(Quote)
Добавьте свой комментарий!