Перенос(и импорт) почты домена на яндекс-почту для домена.

Достаточно давно Яндекс предоставляет такой сервис как «почта для домена». Если у вас есть сайт mysite.ru, хочется иметь почтовые ящики вида username@mysite.ru и не хочется заниматься настройкой почтового сервера — этот сервис для вас. Тем более, что используя его вы получаете возможность привычным web-интерфейсом почты и защиту от спама на уровне, недоступном для самонастроенных почтовых серверов.

Чтобы выполнять все нижеперечисленные операции, надо зарегистрироваться на яндевсе и войти под своим логином.
Continue reading


Как нам зарегистрировать домен?

Первое что нужно уяснить на счет домена, это то, что ДОМЕН ВЫДАЁТСЯ КОНКРЕТНОМУ ЛИЦУ ИЛИ ОРГАНИЗАЦИИ, ваше право обладания им фиксируется регистратором на основе предъявленных вами удостоверяющих документов: паспорт(для физического лица) или учредительные документы(для юр.лица).

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

Второе что нужно уяснить ДОМЕН НЕ ПОКУПАЕТСЯ, А БЕССРОЧНО БЕРЁТСЯ В АРЕНДУ у организации, занимающейся распределением доменов в той или иной зоне (ru, org и пр.). Аренда домена оформляется(производится регистрация) вами через лицензированных представителей этой организации, коими и являются регистраторыдоменов (http://nic.ruhttp://reg.ru и пр.). При условии соблюдения договора регистрации домена(пример договора) и своевременной оплаты домен может оставаться у вас сколь угодно долго.

Третье — как зарегистрировать домен? Практика показывает, что с помощью сторонней компании регистрировать домены как минимум не проще, так как (см.первое) регистратор очно или заочно работает только с его будущим владельцем, и тут есть три пути.

  1. Самостоятельно заполнить форму договора публичной оферты (например тут или тут или у другого регистратора) и следовать дальнейшим инструкциям
  2. Если домен нужен срочно его может зарегистрировать на себя кто угодно, а потом организовать процедуру передачи домена. Процедура сложнее процедуры регистрации. И все это при условии тёплых и доверительных отношений между вами и тем, кто будет регистрировать.
  3. Отправить компании, которая подрядилась зарегистрировать ваш домен все необходимые учредительные документы, чтобы она могла заполнить договор и анкету(в случае регистрации на основе договора публичной оферты).

Разъяснение прозвучавших ранее терминов

Регистратор Организация, предоставляющая услуги регистрации доменов, лицензированная для этого и предоставляющая все необходимое для этого с юридической и технической точки зрения

Регистрация — процесс оформление аренды доменного имени через регистратора.

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

Делегирование — фактически — это назначение домену обслуживающих его NS-серверов(тех, которые будут выдавать информацию о web-сервере, отдающем контент или почтовом сервере).

Делегирование домена

Делегирование домена

Зарегистрированный, но не делегированный домен не может использоваться для размещения сайта.

Арендная плата — как правило берётся ежегодно. Если она не внесена в срок — домен блокируется, если после месяца блокировки плата не вносится — освобождается и его может зарегистрировать любой желающий и после этого контроль над ним восстановить будет невозможно.


Решение проблем с почтой. Опросный лист

Общее

  1. Напишите почтовый ящик, с которого отправляется/принимается почта
  2. Напишите реквизиты подключения:
    • Имя пользователя
    • smtp-сервер
    • pop-сервер
  3. Укажите время попытки отправить/принять почту
  4. Укажите почтовый адрес, на который вы пытались отправить письмо
  5. Укажите название и версию программного обеспечения, с помощью которого отправляется/принимается почта
  6. Покажите полный текст ошибки отправления/приёма (или скриншот окна сообщения)

Канал связи

Определяется, не является ли причиной неисправности качество internet-канала. Значение в угловых скобках заменить на требуемое. Например <имя smtp-сервера>заменить на smtp.mail.ru

  1. Разрешено ли провайдером использование стандартного smtp-порта? Прислать вывод команды(или скриншот):
    1. Пуск
    2. Выполнить
    3. «cmd»(напечатать)
    4. «telnet <имя smtp-сервера> 25»(напечатать)
  2. Резолвится ли имя smtp-сервера? Прислать вывод команды(или скриншот):
    1. Пуск
    2. Выполнить
    3. «cmd»(напечатать)
    4. «nslookup <имя smtp-сервера>»(напечатать)
  3. Нет ли повреждений на линии до почтового сервера? Прислать вывод команды(или скриншот):
    1. Пуск
    2. Выполнить
    3. «cmd»(напечатать)
    4. «tracert <имя smtp-сервера>»(напечатать)

Как поставить задачу так, чтобы её поняли с 1-го раза.

Ниже приведён список разделов, которые должен содержать документ, претендующий на гордое звание «техническое задание».

Описание решаемой проблемы

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

Пример:

Нам часто необходимо смотреть статистику посещений в панели управления счетчиком liveinternet. Для этого требуется для 
каждого сайта:
  - авторизоваться;
  - перейти на страницу статистики;
  - выбрать интересующую дату;
  - скопировать данные из таблички на сайте в excell.
На это уходит очень много времени. Особенно напрягает необходимость авторизоваться-выходить.

Текущее состояние. Исходные данные

Любое ПО можно представить в виде конвейерной ленты, на вход которой подаётся некое сырьё, а с выхода сходит готовая продукция. И не царское это дело в задачу человека, пишущего ТЗ, не входит выбор технологии, а вот входные и выходные данные и параметры описать надо максимально четко, полно и непротиворечиво.

В данном разделе необходимо описать как решается поставленная проблема в данный момент, откуда берутся исходные данные и что это за данные

Пример:

На данный момент, для составления статистики по ключевым запросам, пользователь проходит следующую процедуру:
  1. Заходит на http://www.liveinternet.ru/.
  2. В правом верхнем углу переходит по ссылке "войти в статистику", где вводит адрес сайта и пароль.
  3. Пароль и адрес сайта берётся из документа расположенного [[тут]].
  4. После авторизации переходим по ссылке по "поисковым фразам" - http://www.liveinternet.ru/stat/perpetum-mobile.ru/queries.html.
  5. Копируется из браузера табличка с ключевыми словами и запросами, а затем вставляется в excell.

Требуемый результат.

Тут описываются требования к результату работы ПО. То есть отвечаем на вопрос: «что в итоге нужно от разрабатываемого ПО»?

Пример:

Для каждого сайта требуется получать статистику на основе исходных данных и представлять её в виде:
  - excel файла следующего формата (далее описание формата, возможно даже с таблицами, картинками, графиками);
  - печатной формы(далее описание печатной формы, а ещё лучше - её макет);
  - интерфейс пользователя, позволяющий в интерактивном режиме изменять входные параметры(список параметров) и получать 
     данные о количестве переходов по ключевым запросам (далее следует описание интерфейса, возможно даже с картинками, таблицами. графиками)

Типичный сценарий работы

В данном разделе описывается предполагаемый порядок работы пользователя с ПО, отражающий его предпочтения, привычки, навыки. Так же этот раздел служит основой для организации функционального тестирования.

Пример:

1. Первым делом пользователь заходит в стартовую форму программы, где ему предлагается выбрать из списка сайт, с которым предстот работать
  - если в списке нет нужного сайта - пользователь заполняет поле "сайт" и "пароль" самостоятельно. Если выбрана галочка "запомнить", то эти 
    параметры сохраняются и в дальнейшем сохранённый сайт выводится в списке
2. После выбора сайта пользователю представляется список самых популярных ключевых запросов в виде таблцы
...
N. Если

Цели, задачи и структура отдела программирования

Обеспечение поддержки отделов не связанных с разработкой

Поддерживаемые отделы

Отдел программирования обязан предоставлять консультативную и практическую помощь отделам:

  1. сопровождения сайтов
  2. технической поддержки
  3. продаж
  4. поисковой оптимизации оптимизации и продвиже ния

Виды работ

Поддержка осуществляется путём выполнения следующих видов работ:

  1. внесение мелких исправлений в программный код сайтов заказчиков, которые не реализуют какого-то нового функционала с точки зрения посетителя, но позволяют их более качественно продвигать;
  2. исправление ошибок в программном коде сайтов заказчиков, которые могут отрицательно сказаться на отношении с ними и результатах продвижения;
  3. исправление ошибок в программном коде сайтов заказчиков, связанных с переносом сайта на новую хостинговую площадку;
  4. оперативное вмешательство в код сайтов заказчиков, с целью ликвидации действий злоумышленников;
  5. оперативной вмешательство в код внутренних проектов, при обнаружении ошибок открытого характера, делающих невозможным использование системы;
  6. срочное восстановление работоспособности внутренних проектов и сайтов заказчиков из резервное копии;
  7. консультирование представителей поддерживаемых отделов по техническим вопросам.

Разработка сайтов

Поддерживаемые отделы

Отдел программирования обязан участвовать в разработке програм мной части сайтов, предоставлять консультативную и практическую помощь отделу разработки сайтов и web-дизайна.

Виды работ

Поддержка осуществляется посредством выполнения следующих видов работ:

  1. консультирование представителей отдела разработки сайтов и web-дизайна относительно сроков, трудозатрат и стоимости разработки необходимого им программного кода силами и средствами тактической группы отдела программирования;
  2. проектирование и разработка БД и программного кода, необходимого отделу разработки сайтов и web-дизайна для реализации нужных клиенту и закреплённых в техническом задании сервисов согласно установленным правилам разработки приложений для клиентов.

Разработка ПО для внутренних нужд

Поддерживаемые отделы

Отдел программирования обязан обеспечивать потребности органи зации в ПО, необходимом для автоматизации труда. Кроме того, его силами, по техническим заданиям аналитического от дела, реализуется программное обеспечение, необходимое для проведения различных исследований. Виды работ

При разработке ПО для внутренних нужд отдел программирования обязан:

  1. принимать участие в обсуждении возможностей будущего ПО и требований к нему;
  2. спроектировать и реализовать БД и программный код внутреннего ПО, согласно правилам разработки приложений для внутреннего использования

Состав отдела программирования

Для решения задач и достижения целей, описанных в п.1 отдел программирования имеет в своём составе следующие группы:

  1. оперативная группа;
  2. тактическая группа;
  3. стратегическая группа;

Оперативная группа

Оперативная группа предназначена для решения задач:

  1. внесение любых небольших по объёму и срочных изменений в код проектов заказчиков или внутренних проектов, для ликвидации очевидных и на 100% воспроизводимых ошибок, возникших по любой причине;
  2. внесение в код проектов разазчиков или внутренних проектов любых изменений, направленных на увеличения эффективности продвижения;
  3. консультирование поддерживаемых отделов по техническим вопросам;
  4. оценка трудозатрат, необходимых на решение поставленных задач.

Тактическая группа

Оперативная группа предназначена для решения задач:

  1. проектирование и разработка БД и программного кода, необходимого отделу разработки сайтов и web-дизайна для реализации нужных клиенту и закреплённых в техническом задании сервисов согласно установленным правилам разработки приложений для клиентов;
  2. консультирование поддерживаемых отделов по техническим вопросам;
  3. консультирование оперативной группы отдела программирования по вопросам реализации сайтов заказчиков;
  4. оценка трудозатрат, необходимых на решение поставленных задач.

Стратегическая группа

Стратегическая группа предназначена для решения задач, описанных в п. 1.3, а именно

  1. проектирование и реализация БД и программного кода внутреннего ПО, согласно правилам разработки приложений для внутреннего использования
  2. консультирование оперативной группы отдела программирования по вопросам реализации сайтов заказчиков;
  3. оценка трудозатрат, необходимых на решение поставленных задач.

Критерии оценки качества работы групп

В силу разного характера работ, выполняемых каждой из групп отдела программирования, на итоговую оценку их деятельности с разной степенью влияют следующие факторы:

  • своевременность;
  • объёмы работ;
  • качество реализации.

Эти 3 критерия отражены в расчете премиального коэффициента по итогам месяца. Соответственно, чем выше приоритет критерия, тем большую долю он занимает в премиальном коэффициенте.

Критерии оценки оперативной группы

Поскольку основное назначение оперативной группы — быстрое решение неожиданно возникающих проблем, то критерии оценки её деятельности располагаются в следующем порядке (по убыванию значимости):

  1. своевременность;
  2. качество реализации;
  3. объёмы работ.

Основной критерий

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

Задачи, оформляемые для этой группы в dotproject имеют высокий приоритет, и премиальный коэффициент за своевременность самый большой из 3-х групп. Дополнительный критерий

Вторым по значимости критерием в оценке работы оперативной группы является качество реализации. Премиальный коэффициент за качество у оперативной группы больше чем у тактической, но меньше чем у стратегической.

Второстепенный критерий

Низшим приоритетом в оценке работы оперативной группы является критерий объёма выполненной работы. Среди групп отдела программирования премиальный коэффициент за объёмы выполненной работы — наименьший.

Критерии оценки тактической группы

Основное назначение тактической группы — написание программной начинки web-сайтов клиентов, которая не отличается повышенной сложностью, но требуется в большом объёме и в относительно жесткие сроки. Поэтому приоритеты критериев оценки её работы следующие:

  1. объёмы работ;
  2. своевременность;
  3. качество реализации.

Основной критерий

Основным критерием для тактической группы является объём выполненной работы в запланированных при оценке трудозатрат человеко-часах. Как правило, при разработке программного кода для сайтов клиентов производительность труда наиболее ценна. Поощряется использование сторонних разработок, скриптов и фреймворков. Премиальный коэффициент за объёмы из 3-х групп для тактической является максимальным. Дополнительный критерий

Соблюдение сроков для тактической группы хоть и не столь критично, но не менее важно, поскольку даты выполнения прописаны в договоре на разработку. Размер премиального коэффициента за своевременность больше чем у стратегической группы, но всё же меньше, чем у оперативной.

Задачи, оформляемые для этой группы в dotproject имеют нормальный приоритет.

Второстепенный критерий

Из трёх критериев наименее значимым для для этой группы является качество исполнения. Но несмотря на то, что код не обязан быть универсальным, и оптимальным(но это не оправдывает грубые ляпы). Размер премиального коэффициента за качество среди групп отдела программирования минимален.

Критерии оценки стратегической группы

Характер работы стратегической группы — написание качественного, логически стройного, качественно спроектированного и тщательно задокументированного кода, для внутреннего использования. Отсюда вытекает следующий приоритет критериев оценки работы:

  1. качество реализации;
  2. объёмы работ;
  3. своевременность;

Основной критерий

Основной критерий в оценке деятельности стратегической группы — это качество реализации проектов. На передний план выступают: тщательное предварительное проектирование, универсальность и масштабируемость, оформление и документирование. За соблюдение правил разработки проектов с этой группы — особый спрос. Размер премиального коэффициента за качество среди групп отдела программирования максимален. Дополнительный критерий

Объёмы выполненной работы — тоже важны для этой группы. Но спрос с неё по этому критерию меньше, чем с тактической группы. Размер премиального коэффициента за объёмы — между тактической и оперативной группой.

Второстепенный критерий

Четкое соблюдение сроков почти противоречит качеству проработки, поэтому из 3-х критериев этот для стратегической группы не самый важный. Премиальный коэффициент за своевременность исполнения — минимальный.

Задачи, оформляемые для этой группы в dotproject имеют низкий приоритет.


Стандарт написания кода на PHP

За основу для данного стандарта взята статья http://www.reg.ru/coding_standards.

Оформление кода

Лесенка в 4 пробела.

Обязательна «лесенка» с отступом в 4 пробела (half-tab). При этом запрещается в редакторе изменять размер отображаемой табуляции, например выставлять отображение табуляции в 4 пробела. Код, созданный Вами при таких настройках, будет некорректно отображаться в других редакторах с другими настройками.

Величина отступа у двух соседних строчек, не должна превышать 4 пробела:

// Правильно
function get_id(
    $name   //!< Имя
) {

// Неправильно
function get_id(
                $name   //!< Имя
) {

Пробелы после запятых.

После запятых и точек с запятой (если, конечно, они не расположены в конце строки) ставятся пробелы. Перед запятой и точкой с запятой пробелы не ставятся:

$a = array (1, 2, 3);
for ($i = 0; $i < $count; $i++) {  };

Пробелы вокруг знаков операций.

Любые операторы / знаки операций (например =, ==, ⇒, <, >, &&, || и т.п.) обязательно отделяются пробелами с обоих сторон

В арифметических выражениях количество пробелов вокруг знаков операций можно варьировать, чтобы подчеркнуть приоритет операций. Примеры:

$a = $b * $c + $d * $e;
$a = $b * $c  +  $d * $e;

Пробелы вокруг сложных индексных выражений.

В случае, если Вы обращаетесь к элементу массива по индексу и индексное выражение достаточно сложное, отделяйте его пробелами для улучшения удобочитаемости. Если выражение простое — пробелы не обязательны.

$a[1];
$a[ 1 + 2 + 2 + 4 * function( $a{ $b->{c} } ) ];

Пробелы после знака комментария.

После символа начала комментария («») перед текстом самого комментария ставится пробел: <code> Комментарии начинаются С ЗАГЛАВНОЙ БУКВЫ! Вторая строка комментария </code> Исключение составляют fancy comments, где допускается сливать начальнуй символ решётки с последующими символами: <code> / MY COMMENT INIT * </code>

Пробелы после ключевых слов

После любых ключевых слов языка php обязательно следует пробел. Примеры:

$array = array ();
foreach ($array as $k => $item) {
    if ($item) { $array[$k] = $item * 2; }
}

<<Опять пробелы???>>

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

Не стоит полагаться на подсветку синтаксиса как на «костыль», скрывающий недостатки форматирования.

Выравнивайте комментарии точно так же, как и код.

Левый край комментариев выравнивается точно так же, как и основной код, т.е. используется принцип «лесенки».

//// тили-тили
//// трали-вали
if ($cond) {
    /*
    Это дело мне по силе,
    Откажусь теперь едва ли.
    */

}
else {
    # Это мы не проходили,
    # Это нам не задавали!
}

Ставить символы «» вначале строки, если левая граница кода находится правее, не допускается. тили-тили

// трали-вали
if ($cond) {
// ТАК ДЕЛАТЬ НЕЛЬЗЯ!!!
}

Максимальная длина строк. Разбиение длинных строк.

Строки не оставлять слишком длинными; ограничение — 80 символов в строке. При необходимости строка разбивается на несколько. Примеры допустимого разбивания конструкций:

if (
    very_long_condition_1
    && very_long_condition_2
) {
    statement;
}

if (
        ..
    &&
        ...
    ||
        ...
) {
    ...
}

Для контроля длины строк рекомендуется включить режим «статического переноса строк» после 80 символов. Большинство редакторов имеют эту возможность.

Открывающая фигурная скобка на той же строке, что и ключевое слово.

Старайтесь придерживаться компактного (K&R) стиля оформления циклов и блоков ветвления: открывающая фигурная скобка находится на той же строке, что и ключевое слово for, if, else, while и т.п. Закрывающая фигурная скобка блока, состоящего из нескольких строк, должна находиться на одной вертикали с ключевым словом начинающим конструкцию. Примеры:

if ($condition) {
    statement1;
}
else {
    statement2;
}

for ($i = 0; $i < $count; $i++) {
    statement;
}

Пробел перед открывающей фигурной скобкой.

Перед открывающей фигурной скобкой в блочных конструкциях всегда ставится пробел:

foreach ($array as $item) {
    statement;
}

Допускается компактное оформление блоков из одного оператора

Однострочные блоки, состоящие из единственного оператора, могут быть помещены в одну строку вместе с открывающими и закрывающими скобками:

foreach ($array as $item) { $item *= 2; }

Разбивайте код на абзацы, при необходимости снабжённые комментариями

Код внутри функций должен быть разделён на смысловые блоки, выполняющие определённую узкую задачу. Смысловые блоки отделяются друг от друга пустыми строками. Для дальнейшего улучшения сопровождабельности кода, добавляйте вначале каждого абзаца однострочный комментарий, объясняющий, что делает эта последовательность операторов.

Выравнивайте сходные элементы кода по вертикали.

Выравнивайте сходные элементы по вертикали, особенно если они достаточно короткие чтоб поместиться в одну строку:

$wm_conts_map = array (
    first_name  => 'iname',
    last_name   => 'fname',
    email       => 'email',
);

mkdir($tmpdir)          or die ("can't mkdir $tmpdir");
chmod($tmpdir, 0777)    or die ("can't change mode for $tmpdir");

Переменные и константы

Обязательно комментируйте константы.

Над константами обязательно необходимо ставить комментарий в формате doxygen

//! Режим отладки
define ("DEBUG_MODE", "1");

Не отделяйте имена переменных и функций от следующей за ними открывающей скобки.

Важно ставить открывающую скобку слитно с именем функции или переменной. В противном случае можно визуально спутать функцию с ключевым словом, а начало выражения для элемента массива.

# ХОРОШО
if (open_region($i)) { next CANDIDATE; }

$candidates[$i] = $incumbent[ $candidates[$i]['region'] ];
# ПЛОХО!
if (open_region ($i)){ next CANDIDATE; }

$candidates[$i] = $incumbent [ $candidates[$i]['region'] ];

Индексы ассоциативных массивов — только строки.

Индексы ассоциативных массивов должны представлять собой только текстовые значения (тип кавычек — не важен)

# ХОРОШО
$array['type_id'] = 1;
$array["type_id"] = 2;

# ПЛОХО!
$array[type_id] = 3;

Осмысленные названия идентификаторов.

Выбирайте осмысленные названия для идентификаторов (переменных, констант, функций). Исключение составляют итераторы циклов, где допускаются короткие идентификаторы: $i, $n и т.п. При этом не допускается калька с русского языка («$polzovatel», «$sajt» и т.п.). Если вы не можете вспомнить, что это имя значит — у вас проблемы.

Строчные буквы для названий переменных и функций.

Названия всех переменных и функций должны состоять только из строчных букв, цифр и знаков подчёркивания: «get_domain_name» и т.п.

Хотя короткие идентификаторы типа «$gotit» возможно и неплохи, используйте знак подчеркивания для разделения слов. В общем случае «$var_names_like_this» прочесть легче чем «$VarNamesLikeThis».

Заглавные буквы для констант.

Константы именуются только с использованием заглавных букв:

define ("DEBUG", 0);

Именуйте массивы во множественном числе, а скаляры в единственном.

Массивы рекомендуется называть во множественном числе, например $users, $objects, а скаляры — в единственном: $user, $object.

Функции

Одна функция выполняет одну задачу.

Если функция выполняет несколько разных, слабо связанных друг с другом задач, подумайте о том, чтобы разбить эту функцию на несколько.

Имена функций должны содержать глагол.

Наименования функций должны включать глагол, например «get_domain_name», или «chash_my_program».

Имена, заданные без учёта этого принципа, вроде «flat_components», могут быть истолкованны совершенно по разному, например как «get_flat_components», «set_flat_components», «update_flat_components», «remove_flat_components» или «add_flat_components»

Используйте устоявшиеся пары антонимов в именах функций

В книге Стива Макконелла «Совершенный код» приводятся устоявшиеся пары антонимов, рекомендуемые для использования в именах функций/методов, а именно:

  • add / remove,
  • begin / end,
  • create / destroy,
  • first / last,
  • increment / decrement,
  • insert / delete,
  • lock / unlock,
  • min / max,
  • next / prev,
  • old / new,
  • open / close,
  • show / hide,
  • source / target,
  • start / stop,
  • up / down.

Использование «несогласованных» пар глаголов вроде add / delete или insert / destroy вводит в заблуждение и усложняет анализ кода.

Имена private-функций начинаются с подчёркивания.

Если в модуле присутствуют функции, предназначенные только для внутреннего использования, которые никогда не будут вызваны за пределами модуля (за исключением случая автоматического тестирования), можно предварять имена этих private-функций знаком подчёркивания. Пример: _do_some_private_actions.

Отступы и комментарии для функций. Документирование входных параметров функций

Функции отделены друг от друга минимум одной пустой строкой. Для каждой функции необходимо краткое однострочное описание того, что она делает. Так же необходимо дать краткое описание входных параметров:

/**
     Получить имя домена по его id (краткое однострочное описание)

    Прочее описание

*/
function get_domain_name(
    $id //!< id домена
) {
    ...
}

Подобный формат написания комментариев связан с последующей обработкой кода с помощью doxygen, для получения документации по исходникам.

Не более 3-х параметров у функций.

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

Документирование выходных параметров функций.

Если выходные параметры функции не очевидны / нетривиальны, особенно это касается возврата сложных структур данных, их обязательно надо документировать

Библиотеки.

Комментарий вначале библиотеки.

Вначале библиотеки обязателен комментарий, описывающий её назначение.

/**  Краткое описание библиотеки
    \author Пупкин Василий

    Подробное описание

*/

Комментарий вначале класса.

Вначале класса обязателен комментарий, описывающий её назначение.

/**
     Краткое описание класса
*/
class myclass {
 ...
}

Наименование библиотек в стиле mylib.lib.php

Файлы библиотек следует называть в стиле mylib.lib.php. В то время как исполняемые файлы («скрипты»), следует именовать маленькими буквами, с применением знака подчёркивания: clear_cache.php.

Динамическая подгрузка тяжёлых опциональных модулей.

Если требуется использовать «тяжёлую» библиотеку (скажем, отъедающую 5 Мб памяти и более), при этом, необходимость в этой библиотеке возникает лишь изредка, при определённых условиях — лучше её динамически, когда в нём возникает необходимость:

define ("", $_SERVER['DOCUMENT_ROOT']);
$include_file = DOCUMENT_ROOT."/libs/mylib.lib.php";
if ($condition) {
    if (file_exists($include_file)) {
        include_once($include_file);
    }
}

Подгрузка библиотек только по абсолютному пути.

Для указания пути к библиотеки обязательно использовать полный путь в файловой системе. Его можно получить из переменной окружения $_SERVER[’DOCUMENT_ROOT’], либо указав его в константе.

define ("", $_SERVER['DOCUMENT_ROOT']);
$include_file = DOCUMENT_ROOT."/libs/mylib.lib.php";
if ($condition) {
    if (file_exists($include_file)) {
        include_once($include_file);
    }
}

SQL, базы данных

Осмысленные названия полей и таблиц.

Выбирайте осмысленные названия для полей и таблиц. При этом не допускается калька с русского языка (‘polzovatel‘, ‘sajt‘ и т.п.). Если вы не можете вспомнить, что это имя значит — у вас проблемы.

Имена таблиц и полей в обратных апострофах.

Имена таблиц, полей и их псевдонимов обязательно заключаются в обратные апострофы (символ ‘).

Форматирование SQL-запросов

Запросы длиной более 50 символов (примерно) рекомендуется разбивать на несколько строк, подгоняя текст по горизонтали. Например так:

    SELECT `fields`
      FROM `tables` `t`
     WHERE conditions
       AND more conditions
     GROUP BY `fields`
     ORDER BY `fields`
     LIMIT limits

или так:

    SELECT
        `fields`
    FROM
        `tables` `t`
    WHERE
        conditions
    AND
        more conditions
    GROUP BY
        `fields`
    ORDER BY
        `fields`
    LIMIT
        limits

Ключевые слова — заглавными буквами.

Все ключевые слова SQL записываются заглавными буквами, все наименование таблиц, полей, пользовательских функций — строчными.

Названия полей и таблиц — строчными буквами.

При именовании таблиц и полей не допускается использование заглавных букв. Допускаются только строчные латинские буквы, цифры и знак подчёркивания. Пример: «name_of_the_table».

Названия таблиц — во множественном числе.

Таблицы следует именовать по-английски, во множественном числе. Например: «domains», «users».

Первичный ключ с именем «id».

В каждой таблице (за исключением таблиц, где необходимы составные ключи, например таблиц для обеспечения связей многие-ко-многим) обязательно должно быть поле с именем «id» и типом INT, для которого должен быть создан первичный ключ:

id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY

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

Ссылочные поля — с именем <tablename>_id

Все поля, использующиеся для связи с другими таблицами по их первичному ключу, именуются как »<tablename>_id», где »<tablename>» — имя таблицы в единственном числе. Примеры наименований: domain_id, user_id.

Комментарии

Кодировка комментариев на русском языке должна быть ЕДИНОЙ на протяжении всего проекта (в зависимости от принятых для этого проекта договорённостей).

Комментирование функций.

Перед телом функции обязательно ставится краткое описание того, что она делает. Назначение входных параметров так же комментируется:

/**
     Краткое описание функции

    Полное описание функции
*/
function my_func(
    $xml,       //!< Описание аргумента 1
    $xsl_file   //!< Описание аргумента 2
) {
    ....
}

Краткое описание является обязательным. Полное, если работа функции сложна и нетривиально. Так же не стоит забывать о допустимом предельном количестве аргументов

Комментирование циклов.

Перед телом цикла обязательно должен стоять комментарий, кратко описывающий работу цикла

// Описание рабты цикла
foreach () {
    ...
}

Комментирование условий.

Перед условием обязательно должен стоять комментарий, кратко описывающий его работу

// Описание условия
if () {
    ...
}

Шаблоны.

Экранирование поставляемых данных во избежание XSS-атак При подстановке в шаблон данных, передаваемых пользователем (например, переданных ранее через форму на сайте), эти данные обязательно экранируются с помощью фильтра html (за исключением ОСОБЫХ случаев):

<?= htmlspecialchars($form_data);?>

Пробелы

К оформлению кода внутри шаблонов применяются те же самые требования, что и к оформлению кода на PHP. В частности это касается расстановки пробелов (пробелы вокруг операторов, пробелы после запятых, вокруг сложных индексных выражений и т.п.).

Лесенка.

При использовании логических / блочных конструкций TT данные, внутри блока сдвигаются вправо для улучшения удобочитаемости

    {if $ru}
        Русский текст
    {else}
        Английский текст
    {/if}

Проверки на непустоту списков.

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

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

Шаблон должен интерпретироваться без ошибок даже в случае, если требуемые шаблоном переменные не передаются шаблонизатору. Это означает, что в шаблонах должна быть предусмотрена адекватная защита, на случае, если данные не передаются.

HTML-код

Не использовать спецсимволы, записанные в национальной кодировке.

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

Для каждого чекбокса должен быть label.

Для каждого элемента <input type=«checkbox» …> должен быть предусмотрен элемент <label>, для того, чтобы чекбокс срабатывал также по клику по метке:

    <label><input type="checkbox" name="test" value="1">Тестовая метка</label>

Высота textarea

Textarea в форме минимум на 10 строк высоты (очень неудобно постоянно делают 4-6 строк)

Textarea в форме минимум на 95% её ширины.

Возможно следует задать минимум в см.

Использование таблицы для формы

Использование в форме тегов th для заголовков полей и тегов td содержащих поля. При этом чекбоксы с их лэйблами хранятся в тэгах td аналогично input.

<form>
    <table>
        <tr>
            <th>Field1:</th>
            <td><input ...></td>
        </tr>
    </table>
</form>

JavaScript

Всегда объявляйте переменные.

Всегда объявляйте переменные в JavaScript, даже если синтаксис языка допускает использование переменной без её объявления. Не позволяйте себе «расслабиться»!

    var variable = 'Value';
    alert( variable );

Основные пункты usability-тестирования.

Групповые установка и снятие checkbox’ов

Если на странице есть группа однотипных по смыслу checkbox’ов, то необходимо реализовать групповую установку иснятие «галочек» дополнительным checkbox’ом выделить все

Групповые операции.

Необходимо реализовать одну «групповую» кнопку для всех строк таблицы и использование для каждой записи чекбокса, если предполагается производить однотипное действие со всеми элементами. (негативный пример — 100 строк где у каждой стоит кнопка удалить или перенести).

Подсказка к ссылкам и графическим кнопкам.

К сылкам и особенно к графическим кнопкам обязательно должны идти всплывающие подсказки, кратко (не более 5 слов) объясняющие её назначение. Для этого следует использовать стендартный аттрибут тегов title

Значение по умолчанию «не выбрано» у select’ов.

За исключением случаев, когда один из элементов выпадающего списка <select> выбран сознательно, или особо оговорённых случаев, первым элементом списка (при этом выбранным по умолчанию) должен быть —не выбрано—, означающий, что пользователь не совершал сознательного выбора в этом поле. При отправке формы должна производиться проверка этого поля на отсутствие значения —не выбрано—.

Расположение кнопок «Ok» и «Отмена».

Если форма содержит кнопки ОК/Отмена (Выполнить/Отмена), их расположение должно быть стандартным: в самом низу формы, обе кнопки на одном уровне, выравнивание по правому краю и слева «ОК», а справа «Отмена»

Отправка формы по Ctrl+Enter

Любая форма должна отправляться по Ctrl+Enter, то есть обязательна должна содержать поле типа submit. Совершенно недопустима отправка формы с помощью javascript. С помощью javascript должна проводиться только её проверка.

Нумерация строк таблицы и списков.

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

Отступы от краёв ячеек в таблицах.

Данные в таблице, особенно если четко очерчены границы ячеек, не должды прилипать вплотную к левому и правому краю ячейки. Необхоимо использовать отступы, задаваемые стилями CSS. Рекомендуется отступ по 5px слева и справа. Выравнивание текста в ячейках таблицы, за исключением особых случаем, должно быть по левому краю.

Черезцветица строк.

Для таблицы ширина которой составляет более половины окна, цвет фона соседних строк должен чередоваться (чет/нечет). В то же время не стоит выбирать слишком яркие цвета, рекомендуется сочетание #EFEFEF и #F8F8F8.

Заголовки столбцов.

Если таблица имеет заголовки столбцов, то они обязательно должны формироваться с помощью тега th. Стилями, за исключением особых случаем, текст внутри ячеек заголовка столбца выравнивается по центру.

<table>
    <tr>
        <th>
            № П/П
        </th>
        <th>
            Ф.И.О.
        </th>
    </tr>
    <tr>
        <td>
            1
        </td>
        <td>
            Иванов Иван Иваныч
        </td>
    </tr>
</table>

Повторение заголовков у длинных таблиц.

Если количество строк таблицы превышает 30, то каждые 30 строк заголовок таблицы следует повторять, или организовать постраничный просмотр таблицы.

Предупреждение перед удалением.

Перед операциями удаления необходимо выводить предупреждающее сообщение, в котором пользователь должен подтвердить своё намерение (защита от случайных удалений). Рекомендуется реализовывать это с помощью стандартной функции javascript confirm, помещённой в качестве обработчика для элемента управления

<input type="submit" name="delete" onclick="return confirm('Вы уверены');">

Проверка данных формы с помощью Javascript.

Кроме проверки данных на стороне сервера необходимо организовать (по возможности полную) проверку на стороне браузера с помощью javascript. Вот пример проверки заполнения формы регистрации

  /* ***********************************
  *   Функция проверки данных формы
  *************************************/
  function check_form_master_reg(){

      // Проверка корректности имени пользователя
      var reg1=/[\d\w\_\-]+/i;
      if(!reg1.test(document.getElementById('form_username').value)){
          alert("Неверно задано имя пользователя. "+
          "Допускаются только символы латиницы, цифры тире и подчеркивание");
          return false;
      }

      // Проверка корректности e-mail
      var reg2=/[\d\w\-\.]+\@[\d\w\-\.]+/i;
      if(!reg2.test(document.getElementById('form_email').value)){
          alert("Неверно задан email");
          return false;
      }

      // Проверка непустоты пароля
      if(!document.getElementById('form_password').value){
          alert('Не введён пароль');
          return false;
      }
      // Проверка непустоты подтверждения пароля
      if(!document.getElementById('form_repassword').value){
          alert('Не введёно подтверждение пароля');
          return false;
      }

      // Проверка на совпадение пароля и подтверждения
      if(document.getElementById('form_password').value!=
          document.getElementById('form_repassword').value){
          alert('Пароль и подтверждение не совпадают');
          return false;
      }
      return true;
  }

Сохранение данных формы при распозновании сервером ошибочных входных данных.

Если данные не прошли проверку на сервере и браузеру снова передалась страница с отправленной формой, необходимо позаботиться о сохранении переданных данных и автозаполнении ими перезагруженной формы, избавив пользователя от повторного заполнения формы.

Сообщения об успехе/неудаче проделанной операции.

Любое действие инициированное пользователем(клик, отправление формы) должно сопровождаться сообщением о статусе операции (выполняется/успешно/неуспешно — причина).

Не допускать повторную отработку формы при перезагрузке страницы

Совершенно недопустима многократная успешная отправка формы простым нажатием F5 или Ctrl+R (негативный пример — добавление записи в гостевую книгу простым нажатием F5)

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