фото
Магдалина Сергей Николаевич

Факультет
Компьютерных наук и технологий
Кафедра
Прикладной математики и информатики
Специальность
Программное обеспечение автоматизированных систем
Тема выпускной работы
Исследование средств разработки систем текстурного моделирования
Научный руководитель
Доцент, к.т.н. Карабчевский Виталий Владиславович
Общие рекомендации по написанию малых и средних Интернет-сайтов на примере образовательного портала
Введение

Блин, программистам надо за вредность молоко давать! А то вот так пока заставишь себя сложный код писать, столько нервных клеток помрет! Страшно же вот так писать — нужно с мыслями собраться, чтоб нигде ошибок не наделать.. В итоге со страху сидишь полдня перед компом, ни фига не делаешь! Лазишь по инету, по аське базаришь, в мусоре копаешься, кнопочки размалевываешь в интерфейсе — что угодно, только чтоб дальше не писать — страшно!
(c) kentussharelus



На сегодняшний день Интернет позволяет получить информацию практически любого плана и уровня детализации. Наверное, нет такой области знания, которой не был бы посвящен ни один сайт или форум. Особенно это касается программирования и компьютерных наук — логично, что компьютерщики обеспечивают информацией прежде всего самих себя. В Интернете полно платных и бесплатных образовательных порталов и сайтов, которые содержат множество статей, курсов, уроков по самым разным областям компьютерного дела — например, www.intuit.ru. Существует также множество форумов и блогов программистов, администраторов и просто приверженцев IT, на которых они могут делиться опытом, задавать вопросы, получать ответы. Одним из наиболее популярных блогов, посвященных компьютерной тематике, является www.habrahabr.ru.

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

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

Наиболее полным источником знаний по тому или иному вопросу, конечно, являются книги. Полноценная литература, на 500+ страниц, с иллюстрациями, комментариями, написанная настоящими профессионалами. Она содержит в себе много подробной информации и призвана дать достаточно полное представление о предмете повествования. Тем не менее, у нее имеются недостатки.
  1. Очень большой объем — долго читать, трудно искать информацию. У меня в шкафу стоит замечательная книга по PHP, в ней очень подробно, с примерами и комментариями освещаются почти все вопросы программирования на нем. И в ней всего-то 1200 страниц :-))) . Это значит, что если человек захочет изучить PHP по этой книге, ему потребуется очень много времени, чтобы просто прочесть ее. И изучение предмета превратится с долгие, изматывающие часы чтения. И хорошо, если человек знает, что ему это нужно и действительно хочет овладеть этим предметом. А если он захочет просто узнать об этом, немного войти в курс дела, не углубляясь в подробности? Для него такой объем будет лишним. Как и для профессионала, который уже хорошо в этом разбирается, и ему нужна лишь краткая справка по вопросу.
  2. Один вопрос — одна книга. Ах, как было бы хорошо, если бы был «учебник по всему», чтоб его открыл и получил ответ на любой вопрос из любой области! Но увы, это невозможно. Вот рядом стоят только по C++ 10 учебников — для Windows, для Linux, для новичков, для профессионалов, справочник на 1500 страниц.. а это только один язык программирования! Да, такими темпами, чтобы получить нормальное IT-образование, придется купить себе пяток хороших книжных шкафов.
  3. Встретив непонятное место, нельзя спросить автора или как-то подробнее уточнить какую-то деталь. В книге есть только то, что в ней есть. Если Вы хотите больше — покупайте другую книгу или спросите у специалиста.
  4. Автор хоть и профессионал, но не каждому профессионалу дано изъясняться понятным «простым людям» языком. В таких случаях автор ошибочно начинает думать, что его читателю какие-то вещи уже должны быть понятны, и он недостаточно подробно ведет повествование, опуская какие-то детали. Или, с целью экономии бумаги, сделав упоминание о каком-то аспекте однажды, более не считает нужным напоминать о его значении. В результате, читателю постоянно приходится пролистывать книгу назад, чтобы вспомнить что же значит та или иная функция. Особо ярким примером такого стиля рассуждений являются учебники по математике, когда автор пишет : «Понятно, что..» — и формула на 2 страницы! Кому это понятно? :-) К счастью, некоторые авторы все же избавляют своих читателей от мучений повторного поиска в недрах книги непонятных моментов, и раз за разом разъясняют значения параметров описываемых функций. Это хоть увеличивает объем книги, зато позволяет не путаться в коде и формулах.
Тем не менее, не стоит забывать, что именно книги содержат наиболее полную информацию о предмете, и если Вы хотите стать настоящим профессионалом в той или иной области, покупайте соответствующую литературу и детально ее изучайте.

Альтернативой профессиональной литературе является Интернет. Хоть в Интернете также имеется множество сайтов и порталов, на которых собраны курсы и лекции людей, получивших профессиональное образование в своей сфере, основную массу ресурсов представляют любительские статьи и форумы. Прелесть такого вида образования заключается в том, что любой желающий может внести свою лепту в общий поток знаний. Такой метод накопления информации имеет определенные преимущества.
  1. Массовость. Любой, кто хочет поделиться своими знаниями и опытом, может это легко сделать.
  2. Реальность. Знания на форумах, в статьях, написанных «народными умельцами», собраны без отрыва от реальной жизни. Это значит, что здесь речь идет не столько об изложении сухих знаний, как в справочниках, а о разделении накопленного личного опыта. Люди делятся проблемами, с которыми им пришлось столкнуться, решениями этих проблем на практике. Это позволяет выделить множество «подводных камней» и узких мест той или иной технологии.
  3. Интерактивность. На форумах происходит очень живое общение между всеми участниками, таким образом, можно получить ответы на свои вопросы в кратчайшие сроки.
  4. Сжатость информации. Как правило, в статьях и на форумах информация выкладывается в достаточно сжатом виде, так что на изучение того или иного вопроса тратится совсем немного времени, что делает такую форму обучения прекрасно подходящей для начального изучения вопроса.
Конечно, выходя на улицу, глупо рассчитывать на то, что Вам будут встречаться только образованные, вежливые люди. Так и в Интернете «живут» не только культурные, профессиональные люди, но и контингент самого разного рода. Это создает определенные неудобства при поиске знаний в Интернет.
  1. Некомпетентность. Если Вы захотите написать статью на какой-нибудь из компьютерных порталов, Вам этого сделать никто не запретит, но также далеко не всегда эта статья будет проверена на соответствие истине. Из-за этого существует опасность попасть на статью, в которой будут изложены не соответствующие действительности знания. Например, человек захочет поделиться своим опытом, но будет делать неверные выводы, и получится, что он будет людей «плохому учить». Конечно, модераторы форумов стараются пресекать появление такой информации на публику, но не всегда это удается сделать вовремя.
  2. Низкое качество изложения. Если профессиональную литературу хоть как-то проверяют редакторы, которые следят за качеством повествования, то в Интернете этого не делает никто. Из-за этого многие статьи очень трудно читаются, в них часто отсутствует какая-либо поясняющая информация или встречаются банальные ошибки в коде.
  3. Разрозненность. Если в книге вся информация структурирована, то в Интернете статьи и форумы разбросаны хаотически, в результате чего читатель вынужден полагаться только на свои собственные знания, не надеясь, что какой-то непонятный момент можно прояснить, пролистав страницу «выше» или посмотрев в другой главе.
Как видим, оба вида изложения образовательной информации имеют свои преимущества и недостатки. Кроме того, хоть сейчас и существует множество литературы, порталов, форумов практически обо всех сферах компьютерных наук, часто найти нужную информацию бывает не так просто. Форумы не позволяют в должной мере изучить какую-либо технологию и являются лишь сборником вопросов и ответов, который не дает комплексных знаний по предмету. Литература также не всегда является доступной — часто нужную книгу приходится заказывать через Интернет из других городов или издательств. Причем не факт, что книга окажется полезной — информация, изложенная там, может не оправдать Ваших ожиданий или быть изложена в трудной для понимания форме. Качественных учебных порталов сейчас не так уж и много. И когда я столкнулся с этими проблемами, у меня появилась идея..
Идея
Любой проект начинается с идеи. С того самого момента, когда кто-нибудь, сидя в компании друзей или в одиночестве, задумается над какой-то проблемой, и спустя некоторое время скажет : «Опа! А ведь можно же сделать вот как..!». С этого момента и начинается жизнь любого проекта. С идеи. С мечты сделать что-то хорошее, что принесет пользу людям, что возбудит интерес к себе, что изменит мир и что стоит создать. И именно эта самая идея, мечта, идеал, является основной движущей силой проекта. На протяжении всей работы, эта мечта должна жить в душе создателя, ибо именно она и является той самой целью, которой создатель стремится достичь. И создатель никогда не должен забывать о ней, о том, что он хотел привнести в этот мир, о том, как оно должно изменить мир. Да, чаще всего это наивная, очень преувеличенная мечта, которая несет порыв : «Я сделаю это — и все будут счастливы!». Но она должна жить, именно в таком виде, потому что желание сделать что-то великое и побуждает человека идти вперед, даже если у него не будет получаться. Он будет терпеть неудачи, делать все неправильно, но пока он видит цель — он будет идти вперед, преодолевать трудности, совершенствоваться, чтобы стать еще на шаг ближе к этой мечте. И нужно всегда помнить — пока в душе создателя жива эта мечта, существует и проект. Как только мечта угаснет, проект в лучшем случае станет одним из многих других в своем роде, ничем не примечательным и никому не нужным, потому что именно мечта делает его особенным, ярким, живым. А в худшем случае — Вы просто бросите свой проект.

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

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

Однако, стоит сказать еще пару слов о том, зачем это нужно. Дело в том, что в подавляющем большинстве случаев идея, которой загорается человек, оказывается уже кем-то реализованной. Выше я это продемонстрировал — я описал общие особенности моего сайта, и вот сразу на ум пришла стойкая ассоциация того, что и так уже являет собой вышеописанный портал. НО! Так что ж теперь, перестать мечтать? НЕТ! Посмотрите, сколько на полках магазинов книг по С++? А ведь это один язык программирования, руководство по которому влазит в одну небольшую книжечку. Но люди пишут огромные книги. Более того — эти книги востребованы! Выходят обновления книг, новые редакции, новые авторы, а предмет один и тот же. А все потому, что на каждую книгу находится свой читатель. Другой пример — почтовые агенты. Mail.ru, google.com, yandex, rambler, ukr.net.. Разве они все так уж уникальны? Да, каждый из них имеет какие-то особенности, но 95% людей о них и не знают, потому что все, что им надо — отправить\принять почту, а это умеет делать каждый из почтовиков. Почему же их столько? Почему люди используют разные почтовики, читают разные книги по одному предмету? Потому что все мы разные. Разные авторы, разные программисты, разные пользователи, разные читатели. Один купил книгу, прочитал 3 главы и не очень-то понял что там написано. А потом открыл другую и сразу все стало понятно. Это не значит, что одна книга лучше другой, просто он нашел СВОЮ книгу. И чем больше будет различных книг по одному предмету, тем более точно читатель сможет найти «свою», которая будет для него самой понятной.

К чему я это говорю? Не бойтесь творить! За то, что Вы создадите что-то, что уже создано, Вас никто ругать не будет (речь, конечно, не идет о плагиате!), наоборот — многие люди Вам благодарны будут. Потому что каждая книга найдет своего читателя, при этом ей совсем необязательно быть какой-то особо уникальной. И так во всем — искусство, программирование, литература.. Творите, пишите, и люди это обязательно оценят! Главное — делайте все ответственно и качественно!. И когда в Вашей душе рождается мечта, не губите ее. Представьте ее, полюбите ее и следуйте за ней. И, поселив в своей душе мечту, наметьте себе цель.
Цель
Идея по сути представляет собой результат, которого Вы хотите достичь. Что конкретно должна привнести в этот мир Ваша идея — задачи, которые она решит, возможности, которые она откроет, выгоды, которые принесет. Идея является наиболее абстрактным и эмоциональным уровнем представления проекта. Более реальным же его воплощением является цель.

Цель — это то, что в конечном итоге должно получиться. В случае с образовательным сайтом, идея — это «чтобы легко было учиться», а цель — это «что конкретно будет собой представлять сайт». Пока в общих чертах, не касаясь конкретной реализации. Можно сказать, что с этого момента начинается этап проектирования.


Незарегистрированные посетители

На данном этапе мы представляем, что должен увидеть на сайте рядовой посетитель. Ибо прежде всего все делается именно для простых посетителей (даже не для зарегистрированных участников, а именно для «заезжих» посетителей, которые пришли просто за информацией, и которые составляют основную массу всей аудитории сайта). Что должен получить пользователь? Знания. В каком виде? В нескольких видах, в зависимости от того, что нужно посетителю. Представим, что же ему может быть нужно, и подберем соответствующее представление знаний. Чтобы было легче, представим, что человек пришел учиться программированию на PHP.
  1. Человек ничего не знает о PHP. Ему нужна подробная, исчерпывающая информация о языке, шаг за шагом открывающая новые знания и возможности. Для этих целей ему лучше всего пройти специальный курс о «программировании на PHP для начинающих». При этом логично, что курс будет состоять из последовательности уроков, которые ученик будет проходить по порядку. Понятия в этих уроках будут связаны между собой таким образом, что каждый раз, когда это понятие встречается в уроках, оно должно представлять из себя ссылку на урок, в котором раскрывается суть этого понятия. Таким образом, ученик в любой момент сможет получить информацию о любом из описываемых понятий.
  2. Посетитель уже имеет представление о PHP, но столкнулся с некоторыми трудностями при программировании в конкретных ситуациях. Для описания применения PHP в конкретных ситуациях, тонкостей работы с ним, лучше всего подойдет формат статей, каждая из которых посвящена своему вопросу. Например, статья «проверка поступающих данных в скриптах PHP». Такая статья поможет на практике решить вопрос защиты скриптов от неблагонадежных данных, поступающих от пользователя.
  3. На сайт может зайти настоящий профессионал, которому просто нужна справочная информация по PHP, или которому просто нужно освежить в памяти основные моменты работы с языком программирования. Для этих целей можно сделать специальные сокращенные версии уроков, которые были бы лишены подробных комментариев, и которые содержали бы в себе лишь основную информацию. Это было бы полезно для людей, уже знакомых с программированием и основными концепциями, которые не нуждаются в пояснении того, что такое оператор или цикл, и которые пришли на сайт за «чистым» PHP.

Зарегистрированные посетители

На этом полномочия рядовых посетителей сайта можно ограничить. Они получат нужную им информацию, для большинства этого окажется достаточно. Однако, среди статей может не оказаться такой, которая решит возникший у посетителя вопрос. И он захочет его задать аудитории сайта. Или он захочет прокомментировать какую-то статью. Для этого ему будет необходимо зарегистрироваться. Это необходимо для того, чтобы сайт не захламлялся неверными, не относящимися к тематике сайта или просто деструктивными знаниями. В связи с этим, можно определить перечень возможностей, доступных зарегистрированным пользователям сайта.
  1. Любой зарегистрированный пользователь должен иметь возможность оставить комментарий к любому уроку, курсу, статье. Это необходимо для того, чтобы автор работы мог узнать о сильных и слабых сторонах своей работы или просто узнал мнение читателей. Также, через комментарии читатели могут задать вопрос автору по теме статьи, и там же — получить ответ.
  2. Он может захотеть поделиться своими знаниями, опытом. Значит, ему нужно обеспечить возможность присылать статьи или даже целые курсы.
  3. У него может возникнуть вопрос, который он сможет задать на форуме. Там же он может ответить на вопросы других пользователей.
  4. Пользователи должны иметь возможность вести личную переписку друг с другом.

Регулирование

Все, что происходит на сайте, должно быть упорядочено и контролироваться. Материалы на сайт будут присылать разные люди, поэтому необходимо организовать такой механизм работы сайта, который обеспечивал бы высокое качество содержимого. Самым грубым и неэффективным (но необходимым) способом регулирования размещаемой на сайте информации, является модерация. Суть ее заключается в том, что Вы или специальные пользователи сайта, имеющие привилегированные права (модераторы), имели возможность непосредственно управлять содержимым сайта. В обязанности модераторов входит:
  1. Базовая проверка качества присылаемого материала. Она включает в себя проверку статей и уроков на опечатки, грубые ошибки и наличие явно ложной информации
  2. Обеспечение высокой культуры общения. Любые нецензурные или оскорбительные высказывания должны с сайта удаляться.
  3. Коррекция комментариев и ответов путем добавления специальных блоков текста от администрации. Это бывает полезно для указания причины правки комментария или уточнения деталей.
  4. Введение санкций. В случае, если какой-то пользователь злостно нарушает пункты 1-2, он может быть забанен или его учетная запись вообще может быть удалена с сайта.
Какими бы бдительными ни были модераторы, они не могут в полной мере отвечать за достоверность размещаемой на сайте информации. Человек не может быть специалист во всех сферах, поэтому на сайт может быть выложена информация, для оценки которой модераторам не хватает знаний. Однако, здесь на помощь могут придти сами пользователи. Для этого можно ввести специальную систему голосования. Ее суть заключается в том, что любой зарегистрированный пользователь может проголосовать за любой материал, размещенный на сайте. При этом каждый материал должен иметь свой счетчик баллов, который будет увеличиваться при положительной оценке голосования пользователя, и уменьшаться при отрицательной. Вместе с ним также будет меняться и счетчик баллов пользователя, приславшего этот материал. Таким образом, можно будет оценить, насколько полезным для пользователей является тот или иной материал, а также насколько компетентным — тот или иной участник. Материалы и участников с большим отрицательным рейтингом модераторы должны удалять как вредоносных.

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

Рисунок 1
Рисунок 1 — Предварительная схема организации прав разных категорий пользователей.

Проектирование
База данных

После того, как была намечена предварительная общая схема распределения данных и обязанностей в системе, необходимо переходить к более детальному ее проектированию. Этот этап представляет собой детальную схему течения информационных потоков и форм хранения информации. На практике это означает разработку базы данных проекта — таблиц и связей между ними. Для успешного прохождения этого этапа, разработчику необходимо знать основы организации реляционных баз данных. В частности, в большинстве случаев все таблицы должны быть представлены в третьей нормальной форме (3НФ) — форме, при которой каждый элемент однозначно идентифицируется по ключевому полю, значение которого уникально в пределах таблицы. Самым распространенным примером ключевого поля является целочисленный идентификатор. Также следует учесть, что связи между таблицами могут быть таких видов: «один к одному», «один ко многим» и «многие ко многим». Вообще, вопрос проектирования баз данных касается всех областей разработки ПО, поэтому изложенная далее информация может быть применена при проектировании любых сложных систем.

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

При всей необходимости, категоризация информации накладывает ряд дополнительных сложностей.
  1. Однозначность определения. Если бы все статьи были сосредоточены в одной таблице, то каждая статья имела бы свой уникальный идентификатор в пределах таблицы. Однако, при разбивке статей на несколько таблиц, статьи в разных таблицах будут иметь одинаковые идентификаторы (для своих таблиц). То есть в одной таблице будет статья с идентификатором 1, и в другой тоже нумерация начнется с 1. В связи с этим, необходимо либо искусственно следить за нумерацией, введя дополнительный глобальный идентификатор для каждой статьи, либо сделать так, чтобы значения идентификатора в каждой из таблиц были уникальны в пределах не только таблиц, но и всей базы данных. Ну, есть еще третий вариант — идентифицировать статьи по идентификатору таблицы и темы : «статья 173, тема 27, область 7, категория 3» — сломайте мозг всем! :-)))
  2. Даже в случае обеспечения глобального идентификатора, все равно существует проблема определения принадлежности данных более низкого уровня (статьи) к данным более высокого (темы). Проще всего обеспечить такую связь путем добавления в таблицу статей идентификатора темы, к которой относятся эти статьи. Но это вызовет некоторую избыточность данных — все статьи темы будут иметь одинаковое значение поля «тема».
Проектирование баз данных и таблиц является сложным вопросом, решение которого нельзя описать в общем случае. Проблема заключается в том, насколько тесно организовывать связь между таблицами. Для обеспечения связи достаточно организовать ее хотя бы по одному полю. Но на практике это будет означать, что для получения дополнительной информации из связанных таблиц, придется выполнять дополнительные запросы, что будет нагружать процессор. С другой стороны, избыточность информации в таблицах сделает более сложным их обслуживание и будет требовать больше памяти. Поиск компромисса между элементами память-процессор является наиболее сложной задачей не только при проектировании сайтов, но и в программировании вообще. Продемонстрирую эту проблему на примере.

На сайте www.kentussharelus.ru (на момент написания данной статьи) вся информация организована следующим образом.
Наиболее высоким уровнем организации информации является категория. Категории представляют собой наиболее общую единицу классификации материала. В частности, категориями могут быть «программирование», «администрирование», «железо» и другие достаточно общие вопросы.
После того, как пользователь выбрал категорию, ему необходимо уточнить — в какой области знаний данной категории ему необходима информация. Например, для категории «программирование» областями могут быть «программирование для Интернет», «системное программирование», «программирование для Windows» и другие.
Выбрав область знаний, например, «программирование для Интернет», необходимо продолжить процесс уточнения и выбрать тему. Темами могут быть «программирование на PHP», «проектирование баз данных» и другие.
Наконец, после выбора темы, пользователь может выбрать конкретную статью, например, «проверка входных данных в скриптах PHP». Ее написал некий пользователь — автор статьи.

И вот в списке статей этого автора должно значиться, что он написал эту статью. И тут возникает вопрос — как же эту статью найти? Понятно, что нужно как минимум указать глобальный идентификатор статьи. Но зная лишь идентификатор, придется обыскать все таблицы статей для всех тем. А темы, в свою очередь, хранятся в таблицах областей, а те — в таблицах категорий. В итоге придется выполнить уйму трудоемких запросов, просмотрев, в худшем случае, всю базу данных. Решением этого вопроса было бы — хранить в списке статей пользователя информацию не только о статье, но и идентификаторы темы, области и категории, к которой эта статья относится.
Этого достаточно, чтобы быстро найти нужную нам статью. Однако, это малоинформативно для других пользователей — открыв перечень статей этого автора, они увидят список с элементами вида : «категория 3, область 5, тема 7, статья 73». Ну, статья 73, и что? Чтобы понять, что это за статья, пользователю придется пройти по ссылке, и так гулять по ссылкам всех статей, чтобы ознакомиться с их перечнем поближе. Хорошим тоном было бы показать хотя бы название статьи, а лучше — и названия темы, области и категории, в которой эта статья значится. Решений этого вопроса два, и они являют собой канонический вид спора «память-процессор».
  1. Экономим память, грузим процессор. Суть этого решения в том, чтобы каждый раз, когда пользователь просматривает список статей автора, делать соответствующие запросы ко всем таблицам категорий, областей, тем и статей, чтобы «добыть» оттуда их названия. Таким образом, пользователь будет видеть не голые цифры, а вполне понятные названия элементов. Но для формирования такой таблицы придется сделать n*4 запросов, где n — количество статей автора.
  2. Бережем процессор, забиваем память. В этом случае мы сразу храним в таблице-списке статей автора названия всех нужных элементов. Таким образом, при просмотре таблицы, пользователь будет видеть названия элементов, но при этом они будут многократно дублироваться — для каждой статьи своя копия названий. К тому же, серьезной проблемой может стать переименование какой-то темы, категории. Ведь теперь придется поменять название этой категории во всех списках статей (а еще курсов, вопросов, ответов..) всех авторов.
В связи с вышеизложенным, можно сделать вывод, что целесообразнее было бы все же использовать ресурсы процессора и по мере необходимости искать свежую релевантную информацию. Это позволит не заботиться о соответствии информации в разных таблицах так как значения тех или иных полей на деле будут храниться всего в одной таблице, а остальные будут лишь ссылаться на нее. Однако, в этом случае следует четко понимать — какая информация действительно нужна на странице, а без которой можно и обойтись.

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


Страницы сайта

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

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

Рисунок 2
Рисунок 2 — Схема потоков данных страниц «темы» и «статьи».

На схеме видно, что входными данными в файле topics.php (файл тем) должны быть значения выбранной категории и области (category, domain). Эти данные используются в запросе к базе данных для нахождения соответствующей таблицы тем, в которой содержится перечень тем, относящихся к данной категории и области. Из таблицы тем извлекаются идентификатор и название каждой из тем. При этом название темы является ссылкой, по которой пользователь может перейти к статьям соответствующей темы (на то, что название — ссылка, на схеме указывает выделение параметра name желтым цветом). При переходе по этой ссылке, пользователь будет перенаправлен на страницу статей выбранной темы, причем входными данными для нее (и выходными — для страницы тем) будут категория, область и идентификатор темы, который в запросе к странице articles.php будет иметь имя topic.

Для страницы статей — articles.php входными данными являются категория, область и тема, в которой будет производиться поиск статей. Как и в случае со страницей тем, эти данные используются в запросе к базе данных для поиска нужной таблицы статей. Затем из таблицы извлекается информация о каждой их статей. Это : идентификатор статьи (id), имя автора (author), идентификатор автора (author_id), баллы статьи (score), краткая информация о ней (info) и дата ее публикации (date). При этом название статьи и имя автора являются ссылками.
Файлы сайта могут содержать очень большое количество ссылок, ведущих на большое количество других файлов сайта, или даже на другие сайты. Так и на странице статей articles.php ссылки name и author ведут на разные страницы. Как видно из выходной информации страницы, ссылка name ведет на страницу article.php, которая выведет пользователю текст выбранной статьи, идентификатор которой передается по параметру article. Ссылка author ведет на страницу просмотра профиля пользователя — автора статьи — user.php. При этом, чтобы получить информацию о пользователе, достаточно знать его идентификатор, поэтому в качестве параметров передается идентификатор автора. Заметьте, что хотя передается идентификатор автора, ссылкой все же является имя автора. Это связано с тем, что идентификатор автора малоинформативен для других пользователей — людям гораздо естественнее и понятнее различать пользователей по именам.
Страница статей содержит еще один важный блок. Этот блок становится доступен только в том случае, если страницу посетил авторизованный пользователь. Этот блок служит для добавления новых статей и имеет ряд полей, которые должен ввести пользователь. Это название, описание и текст статьи. Эта информация также будет отправлена по отдельному адресу — new_article.php.

Таким образом, мы дали достаточно полное представление того, какая информация должна выводиться на страницах тем и статей, как она должна взаимодействовать со страницами, куда быть отправлена далее и в каких случаях доступна.
Вопросам проектирования должно уделяться самое пристальное внимание, так как именно проект в виде диаграмм, схем и таблиц описывает логику работы всего приложения. Сейчас существует множество средств, позволяющих автоматизировать и облегчить процесс проектирования систем — их изучению следует уделить внимание для того, чтобы составлять проекты понятным остальным людям языком. Конечно, представленные выше схемы также весьма понятны их разработчику, однако, они к тому же еще и весьма просты. Если же дело касается сложных больших проектов, над которыми будут работать много людей, то необходимо использовать стандартизированные средства разработки проектов. Например, язык UML.
Кодирование
Выбор технологий

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

Несмотря на наличие довольно большого количества технологий, применяемых для написания сайтов, лидирующее место среди них по-прежнему занимает связка PHP+MySQL. Пусть Вас не смущает тот факт, что на них написано подавляющее количество сайтов — они все равно остаются эффективным и несложным инструментом реализации сайтов почти любого уровня сложности. Доказательством тому служит Википедия — wiki-движок написан на PHP.

Тем не менее, выбор конкретных технологий реализации Вашего сайта лежит за Вами. Многие хостинги поддерживают такие языки, как Python, Ruby или технологию ASP.NET, с применением которой также написано немало сайтов, в том числе и весьма крупных.


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


Многократное использование кода

Большинство языков программирования позволяют программисту писать функции или подключать к коду другие файлы. Не стоит пренебрегать такими возможностями. При написании страниц сайта Вы будете вынуждены проделывать одни и те же операции — проверка входных данных, запросы в базу данных, вывод информации на страницу и т.п. У неопытных программистов часто бывает соблазн написать код прямо в страницу сайта, надеясь, что «его мало — потом будет легко изменить», или «да ладно, все хорошо работает, что тут менять?». Не будьте наивными — даже хорошо написанная страница со временем может потребовать правки, причем даже раньше, чем Вы могли бы предположить )) .

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

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

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

function check_input($data,$types,$msg)

Здесь
  1. $data — массив проверяемых данных.
  2. $types — массив, содержащий описание типов, которым должны соответствовать данные.
  3. $msg — сообщение, которое будет сформировано в случае неудачи.
Такая несложная организация проверки входных данных скрипта позволит Вам избежать многих проблем и сэкономит кучу времени, когда Вы начнете кодирование. Ведь хоть у Вас на руках и есть готовый детальный проект, невозможно заранее предсказать какие еще данные придется передавать той или иной странице. Благодаря этой функции, изменение кода страниц сведется к правке всего нескольких строк.

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

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


Использование шаблонов

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

Конечно, это довольно общий случай — на практике сложно создать по-настоящему универсальную страницу для всего сайта. Тем не менее, легко можно выделить одинаковые составные части всех страниц, и их уже распределить по отдельным файлам, вроде header.php, side_panel.php, footer.php. Подключая эти файлы к каждой странице сайта, Вы резко сократите количество кода, необходимого для формирования страниц, а также сможете сосредоточиться на написании уникальной части контента отдельных страниц.


Конфигурационный файл

На сайте часто могут встречаться определенные константные данные. Например, Вам может потребоваться установить некоторые размеры аватарок пользователей, или максимальный объем текста в описании статьи. При этом, проверка аватарок и описания статей будет производиьтся в соответствующих файлах, имена которых будут вроде new_avatar.php и new_article.php. В случае с аватарками в файле new_avatar.php может быть код вида:

if (($size_X > 256) || ($size_Y > 256))
{
info_msg("Слишком большое разрешение аватарки!", $c_msgtype['fail']);
}


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

Такой код, конечно, будет работать (если Вы определили функцию info_msg и подключили файл с нею к коду страницы), однако, если Вам придется менять допустимый размер аватарок, то это может вызвать некоторые затруднения. Ведь тогда придется менять и все страницы, в которых эти аватарки выводятся (а таких страниц будет очень много), и везде значение «256» придется менять на другое. Это очень долго, утомительно и Вы просто можете наделать кучу ошибок и опечаток. Поэтому, было бы удобнее создать специальный файл constants.php, в котором и были бы определены все константы системы (я не имею ввиду константные переменные языка PHP или сервера, на котором это все у Вас стоит).

Это же касается и константы $c_msgtype['fail']. Конечно, можно договориться, что 0 — это неудача, а 1 — это успех, но Вам могут потребоваться и другие классификаторы сообщений, да и вообще — код старайтесь делать как можно читабельнее. Таким образом, в файле $constants.php могут быть несколько таких строчек:

$c_avatarsize['x'] = 256;
$c_avatarsize['y'] = 256;

$c_msgtype['fail'] = 0;
$c_msgtype['success'] = 1;
$c_msgtype['info'] = 2;


Заметьте, что здесь каждая константа начинается с префикса c_. Это соответствует правилам именования переменных — в имени каждой переменной должен быть отражен ее тип, является ли она функцией или членом некоторого класса, а также ее название должно отражать ее предназначение. $dfghb — плохое название переменной! $c_pixelsinavatarforVIPusers — ёмкое, но длинное. Хотя, великий copy-paste нас, конечно, выручит в деле длинных имен, тем не менее, лучше по возможности избегать трехэтажных выражений.


Безопасность

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

В случае с программированием для web дело обстоит гораздо серьезнее. Мало написать сайт, который работает на правильных входных данных. Нужно ОЧЕНЬ хорошо проконтролировать, чтобы до основной части скрипта дошли именно правильные данные. Это связано с двумя причинами. Первая — пользователи случайно могут ввести в поле для ввода чисел — буквы или другие знаки — это может нарушить работу скриптов. Вторая (куда более серьезная) — нехорошие люди, от зависти или потехи для могут умышленно саботировать Ваш сайт с целью.. ну, цели могут быть разные. Просто развлечься (да, хакеры часто жаждут применить вновь обретенные знания на практике и посмотреть, что будет). Получить несанкционированный доступ к информации, удалить ее или изменить. Или атаковать Ваш сайт по заказу конкурентов. В любом случае, если Вы не хотите, чтобы каждые 2 дня база данных на Вашем сайте приходила в негодность, чтобы конфиденциальная информация утекала с Вашего сайта, как сквозь решето, чтобы работа сайта просто не была блокирована — защищайте свой сайт! Прежде всего — на уровне проверки входных данных.

Обеспечение безопасности веб-приложений — очень сложная задача, требующая от специалиста глубоких знаний применяемых технологий. Однако, можно дать основные рекомендации.
  1. Проверяйте входные данные на соответствие ожидаемым их типам. Например, в поле ввода номера ICQ логично было бы вводить цифры. Возможно, еще символ «-». В связи с этим, необходимо выполнить такую проверку, которая отсеивала бы все данные, поступающие с этого поля, если они содержат символы, не входящие в последовательность "01234567889-". Сделать это можно с помощью специальной функции, о которой речь уже говорилась выше — пусть она принимает в качестве параметров все необходимые данные, и условные обозначения типов, которым те должны соответствовать. В самой функции можно использовать встроенные средства языка PHP для проверки типов данных, или же (что гибче) — регулярные выражения. Это необходимо для того, чтобы обеспечить базовую защиту от SQL-инъекций. Суть SQL-инъекции заключается в формировании таких данных, которые, попав в SQL-запрос к базе данных, изменяли бы его. Измененный запрос может вывести совсем не те данные, которые ожидаются, или вообще удалить их. Например, если в коде скрипта выполняется запрос:

    SELECT id_news, header, body, author FROM news WHERE id_news = " . $_REQUEST['id']

    то передав в качестве значения параметра id строку "-1 UNION SELECT 1,username, password,1 FROM admin", это вызовет выполнение такого запроса:

    SELECT id_news, header, body, author FROM news WHERE id_news = -1 UNION SELECT 1,username,password,1 FROM admin

    Так как новости с идентификатором -1 заведомо не существует, то из таблицы news не будет выбрано ни одной записи, однако в результат попадут записи, несанкционированно отобранные из таблицы admin в результате инъекции SQL.

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

    SELECT author FROM news WHERE id=" . $_REQUEST['id'] ." AND author LIKE ('a%')

    Он отображает имя автора новости по передаваемому идентификатору id только при условии, что имя начинается с буквы а. В данном примере, злоумышленник может передать в скрипт параметр id со значением "-1 UNION SELECT password FROM admin/*", выполнив таким образом запрос:

    SELECT author FROM news WHERE id=-1 UNION SELECT password FROM admin/* AND author LIKE ('a%')

    в котором часть запроса ( AND author LIKE ('a%')) помечена как комментарий и не влияет на выполнение. PHP имеет специальные функции, которые позволяют экранировать специальные символы, а также снимать экранирование. Так, обработав входной параметр следующим образом:

    $data = addslashes($_REQUEST['id']

    все специальные символы будут экранированы символом '/', что приведет к преобразованию строки это "опасная" строка /*с комментарием*/ в строку : это /"опасная/" строка //*с комментарием*//. Теперь интерпретатор SQL-запросов, выполняя запрос, снимет экранирование со специальных символов и уже будет знать, что это лишь символы, а не инструкции к запросу.

  3. Используйте сессии. Не стоит передавать идентификатор авторизованного пользователя через GET-запрос, и через POST — тоже. Для этого используйте сессии — они создаются на стороне сервера, и хотя существует возможность подделать значения зарегистрированных переменных, хранящихся браузером, это все равно создаст неплохой уровень защиты.

  4. Используйте алгоритм MD5 для шифрования паролей. Не храните пароли в базе данных в открытом виде. В 1991 году Рональдом Л. Ривестом был разработан алгоритм 128-битного хеширования данных, названный Message Digest 5 (MD5). Этот алгоритм по входным данным (неважно каким — данные воспринимаются как массив байт, а следовательно это может быть текст, видео, изображение, звук.. что угодно) строит 128-битный хеш, уникальный для входных данных. Точнее, почти уникальный. Тем не менее, число комбинаций столь велико (2 в 128 степени), что можно не бояться за случайное совпадение. К тому же, изменение всего в одном байте входной последовательности значительно меняет весь хеш. Это называется лавинным эффектом. Несмотря на то, что MD5 все равно можно взломать, его надежность находится на крайне высоком уровне благодаря тому, что по значению хеша невозможно восстановить входной текст. Это значит, что даже в случае похищения базы данных, информация о хранящемся там хеше никак не поможет злоумышленнику узнать пароль.
Последние советы
Как уже говорилось, качество реализации проекта во многом зависит от профессионализма и опыта программиста. Тем не менее, даже если у Вас опыта нет и Вы только начинаете делать первые шаги в программировании для web, вот несколько советов.
  1. Не бойтесь! Не бойтесь начинать что-то новое, изучать что-то новое. Даже если Вы с этим не работали, ибо опыт у Вас никогда и не появится, если Вы не начнете с этим работать. Но к любому делу лучше подходить системно. В частности, если Вы хотите создать свой сайт, начните с обзора существующих технологий. Поищите в Интернете — какие сейчас применяются технологии, какие их преимущества и недостатки. Или просто найдите хорошие лекции или книги по ним и изучите первые несколько глав (уроков). Это даст Вам понять что представляет из себя та или иная технология, хотите ли Вы использовать именно ее. После того, как определились с технологией, сядьте за ее изучение более детально — пусть Вы всего и не запомните, но Вы будете знать ее возможности.
  2. Экспериментируйте. Изучая какую-то технологию более детально, прикиньте, как Вы могли бы использовать ее возможности в своем сайте. И по мере изучения этой технологии, Вы могли бы потихоньку писать функции, программные модули, реализующие те или иные компоненты Вашего сайта. Таким образом Вы сможете одновременно и изучать новую технологию, и делать полезное дело для своего сайта. Позже Вы, возможно, будете переделывать свои наброски, но они все равно дадут Вам бесценный опыт.
  3. Старайтесь разбить весь код на множество блоков, модулей, в работоспособности которых Вы были бы абсолютно уверены. Например, у Вас есть скрипт, вызывающий несколько функций подряд. И он не работает. Первое, что нужно сделать — убедиться, что все, вызываемые им функции, работают корректно. Вообще-то, это надо делать во время написания самих функций — тогда Вы сможете не бояться того, что в скрипте какая-нибудь функция будет «шалить». Зная, что все Ваши функции работают корректно, Вы будете уверены, что проблема кроется в самом скрипте, а не связанных с ним файлах — это значительно сократит область поиска ошибки.
  4. Не работайте уставшим. Я понимаю, что работы много, времени мало, а еще хочется и с друзьями погулять, и на компе поиграть, и поспать (особенно!). Но программирование — не та область, в которой допускается работа «на автомате» или уставшим. Потому что те ошибки, которые Вы наделаете, пока будете работать уставшим (100% наделаете, причем глупых и смешных!), Вы потом будете исправлять очень долго и мучительно. Поэтому постарайтесь сложную работу вроде написания новых скриптов или проектирования оставить для свежей головы. Если Вы устали, но так уж тянет поработать — займитесь дизайном!
  5. Кстати, о дизайне. Лично мне не нравится традиционное бело-синее оформление. Да, это выглядит мило и не мешает работать, но.. это ж так уныло! Все сайты одинаковые, везде примерно одно и то же оформление — фи! Давайте раскрасим этот мир! Но в деле раскрашивания мира надо знать меру. Ибо у всех людей разные вкусы, разные понятия о красивом. Например, мне нравится дизайн этого сайта (сайт магистра) — я его разработал сам так, как мне нравится. Но многим это не нравится — многие любят просто черным по белому. Еще не у всех хорошее зрение, поэтому слишком мелкие буквы лучше не делать. А вообще, идеальным вариантом было бы сделать несколько таблиц стилей, чтобы пользователь смог выбрать себе таблицу по вкусу — размер шрифта, цветовую гамму и т.п.
  6. Помните, что Вы делаете свой проект для людей. Поэтому основная Ваша цель — сделать так, чтобы людям у Вас понравилось. Для этого как минимум нужно не делать того, что людям не нравится. Походите по другим сайтам — Вы будете замечать в них какие-то недостатки — в дизайне, в оформлении, в наполнении. Постарайтесь это запоминать и не повторять чужих ошибок в своей работе. Когда подготовка проекта будет близиться к концу, окиньте его взглядом рядового пользователя. Вам самому нравится Ваш проект? Вы бы с ним работали? Удобно ли с ним работать? Если Вы чувствуете, что где-то что-то сделали недостаточно хорошо (а Вы это обязательно будете чувствовать) — не ленитесь и подправьте это. Потому что за любым брендом (а Ваш сайт — то тоже бренд) с момента его появления на рынке, закрепляется определенная слава. И если слава начнет распространяться плохая, то изменить мнение пользователей будет очень сложно. Поэтому постарайтесь произвести хорошее впечатление в самом начале, чем потом доказывать, что Вы — хороший, просто раньше выложили недоделанный проект раньше времени.
Над созданием сайтов для крупных компаний трудится много народу — программные инженеры, программисты-кодеры, дизайнеры, бренд-мейкеры, пиарщики, рекламщики, журналисты, маркетологи. Все эти люди имеют соответствующее образование и опыт работы. Когда Вы принимаете решение о создании собственного сайта в одиночку, Вы должны будете выполнять роли всех вышеперечисленных людей. Несмотря на то, что Вам придется перечитать уйму статей, курсов, книг, чтобы изучить хотя бы азы каждой из этих областей деятельности, это все равно безумно интересно, и Вы получите бесценный опыт, которого в других условиях не получили бы. Поэтому с уверенностью можно сказать, что создание сайтов — интересное, увлекательное, полезное дело. А когда Вы выпустите в сеть готовый сайт, туда начнут приходить посетители и он начнет приносить пользу людям — Вы получите ни с чем не сравнимое удовольствие! И Вам захочется улучшать свой проект, лелеять его, доводить до совершенства )) . А что может быть прекраснее человека, который захвачен полетом творческой мысли и мечты? Поэтому — мечтайте, господа! И воплощайте свои мечты в жизнь! :-)