Кодинг (Статей: 12)

Написал проект на роторе. Пока писал проект вышел laravel 9 и обновился ротор. Пришлось обновляться и без неприятностей не обошлось. Очень неудобно смотреть кормиты и сравнивать со своим кодом в проекте. Где-то скопировал криво, где объединил весь файл, а там были моим изменения. В итоге пришлось все по новой тестировать, просматривать все страницы и код. А чем дольше не обновляешь, тем более сложнее потом переработать все новые обновления которых очень много. В чатике по Laravel не привыкли видеть такие cms которые переписывают код, как мне там дали понять, что cms должна предоставлять наследование контроллеров. Поэтому в чате не пришлось ожидать помощи. Нужен был инструмент слияния файлов таким образом, что бы наши файлы проекта не переписывались, а новый код добавлялся. Ничего подобного нагуглить не вышло. Была попытка написание сравнителя файлов, который генерировал git патчи, но это всё нито.

У git есть софтина merge-file которая оказалась подходящей, но merge-file это трехстороннее объединение. То-есть два файла невозможно объединить, нужен третий базовый, основа на которую накладывается новая версия файла от вантуза и сверху наша. Подсунуть git-merge в качестве базового файла копию своего файла не даст результатов. Значит нам нужен базовый файл, тот на котором были построены наши изменения. Если мы не знаем последний коммит из ротора на котором начал формироваться наш проект, то можно отследить по дате изменения наших файлов. И так нам известен последний коммит репозитория ротора. Клонируем ротор и в его директории откатываемся до нужного нам коммита git checkout commitId. Дальше на этом состоянии вытаскивает базовый файл на котором построены наши изменения. Затем переключаемся на последний коммит ротора просто git checkout master. Тут мы забираем самую новую версию файла выпущенного обновления от Вантуза. И сравниваем git merge-file наш_текущий_файл базовый_файл новый_файл. Происходит идеальное слияние то, что нам нужно, наши изменения не затерты, новый код от Вантуза добавлен, мы рады. Если был конфликт, по меткам в файле все видно и понятно, что из нового файла, а что из нашего, фиксим и готово.

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

Апгрейд в действии
У меня версия ротора 10.2 с обновления до лары 9, последний коммит с которого я обновлялся у меня есть, выяснять не пришлось.

В проекте в директории upgrades лежит свежий клонированный репозиторий ротора.

Запускаем roup
node roup

Наблюдаем процесс сравнения файлов с файлами нашего проекта, изъятия всех версий файлов и приготовления. В конце будет выведен результат работы. Это обновлённые файлы в нашем проекте, новые файла пришедшие с обновлением и файлы в которых имеется конфликт. Результат также дублируется в лог куда также пишется айди последнего коммита ротора. Берём айди коммита из лога и записываем в наш конфиг в запускаемом файле roup.js, он нам пригодится при следующем обновлении. В моём случаи вышло всего 7 конфликтных файлов и 200 начисто слитых. Процесс обновления прошёл великолепно, и последующие обновления будут сливаться в тот-же день не зная горя.

Процесс установки и использования roup описан в Readme репозиторя https://github.com/oopsfix/roup , здесь его дублировать не стану. На этом прощаюсь, возможно roup вас обрадует как и меня.
Денвер, сколько воспоминаний навивает это название.
Некоторые мои знакомые до сих пор используют денвер, для кодинга в локальной среде.
Денвер - ну очень устаревший локальный сервер, который забросили почти 10 лет назад.
Интерфейс официального сайта дружелюбен, и даже есть видеомануалы для новичков, но кому он нужен, со своими ярлыками и древней начинкой?

Блок "Скоро на экранах: Денвер -4" с попрошайкой доната висит на сайте почти 10 лет, и к сожалению так на экранах не появился.
Судя по комментариям его все еще скачивают и используют.

Собственно хочу посоветовать другой продукт, который в разы удобнее, функциональнее, свежее по начинке, а главное поддерживается разработчиками.
OpenServer (ospanel)
Функционал огромен, на выбор любая версия php баз данных данных и самого сервера.
Полный список начинки можете прочитать на сайте.
https://ospanel.io/
Предисловие
Затрагивая столь сложную и обширную тему, как "грабли", поджидающие новичков в программирования, я намеренно упускаю многие детали, так как иначе, статья получится слишком длинной и запутанной.

Начало
Существует один вопрос, который задают себе все начинающие программисты: как стать прогрммистом? - и первым ответом, который возникает в голове вопрошающего бывает - выучить язык программирования! Такой подход изначально ошибочный. Дело в том, что начинать любое дело, становится мастером из подмастерья и изучать науку следует не с инструмента, а с фундамента. Представьте, что вы решили стать первокласным физиком-ядерщиком и начали свое изучение с химической структуры урана. Что из этого выйдет? В лучшем случае вы узнаете что уран нестабилен, и больше ничего. Аналогично слесарь не начинает свою деятельность с изучения молотка, так и программист не начинает с языка программирования. Как я уже сказал ранее, начинать следует с фундамента. Для начала узнайте, что же такое программа, для чего их пишут, какие виды программ бывают. Чтоб было интереснее, можете углубиться в историю программирования, познакомится с первыми потугами программистов в этой области, узнать кто был первым программистам и так далее. Попутно, вы будите узнавать много новых и важных терминов, часто встречающихся в программировании и без знания которых, вы просто не поймете ни языков программирования, ни информатики в целом. Обязательно прочтите одну-две простые, школьные книжки по информатике и основам компьютерной грамотности, это подготовит вас к дальнейшим шагам. Не следует беспокоится о предупреждениях других, мол без знания математики, английского языка и других дисциплин программистам вам не стать, все это чепуха! По ходу обучения вы сами придете к тому, что вам следует подтянуть свой английский и сесть за школьные книжки по алгебре, а на начальных этапах это вовсе не нужно! После того, как вы познакомитесь с информатикой и будете точно уверены в том, что программирование это ваше направление, выберите для себя книгу-учителя по одному из языков программирования. Это может быть любой высокоуровневый язык, такой как: C, pyton, ruby, PHP - я рекомендую начать с PHP или pyton. Обзоведитесь несколькими книгами по выбранному языку, это как если вы будете общаться не с одним, а сразу с несколькими учителями по теме, и объяснение одного может даться вам проще, чем объяснение другого. Обязательно прочтите одну-две главы выбранной книги и удостоверьтесь, что все излагается достаточно подробно, понятно и с примерами, так как некоторые книги расчитаны не на новичков.

Первые шаги
Обязательно установите компилятор или интерпретатор изучаемого языка (подробную инструкцию можно найти в интернете) и тренируйтесь чаще. Пишите простые программы, чем проще - тем лучше! Конечно мечту написать сложную программу нужно хранить, но лишь для того, чтобы оставался интерес, не следует пытаться сразу писать сложные программы. Читайте чаще, но тщательно выбирайте материал! Я рекомендую обращаться к известным книгам в несколько сотен страниц. Крайне не рекомендую начинать изучение с чужого кода или чтением статей из интернета. От этого вы только себе навредите и никогда не поймете сути прочитанного. Такой подход хорош, когда вы уже хорошо знакомы с программированием и хотите изучить работы других программистов, дабы найти для себя что то новенькое, а на начальном этапе это только запутает, ведь соблазн скопировать чужой код слишком велик. Обязательно пишите "велосипеды"! Реализуйте уже имеющиеся решения собственными руками, это позволит вам понять, как все это работает и прибавит вам практики.

После прочтения книг
Что делать, когда вы уже прочитали одну-две книжки и не видите ничего нового в следующих? Пора писать проекты сложнее! Читайте статьи, общайтесь с другими программистами, пишите сложные (на ваш взгляд) "велосипеды", не бойтесь, что кто то украдет вашу идею, смело делитесь ей с миром! Запомните - на данном этапе важно ошибаться и учиться на своих ошибках! Не спорьте с другими программистами, старайтесь перенять от них что то, относитесь к своим знаниям критично. Данный этап очень опасен, так как многие программисты начинают считать себя квалифицированными специалистами, но это не так. Поставьте себе новую цель, недостижимую мечту и двигайтесь к ней. Убедите себя, что вам еще есть куда стремиться. На самом деле, вы еще не специалист, а новичок в программировании.

Профессиональная деятельность
Вот вы уже с легкостью пишите сложные программы и общайтесь с программистами на равных. Пора искать работу! Выбирайте что нибудь интересное для себя. Работа программистом познакомит вас с особенностями бизнес-программирования, когда отчаяно не хватает времени, когда задача ставится размыто, когда предъявляются огромные требования к быстродействию, безопасности и интерфейсу. Это закалит вас, научит решать сложные задачи.
Удачи в начинаниях!
Статья удалена. Всем спасибо. Все расходимся. Статья удалена. Всем спасибо. Все расходимся. Статья удалена. Всем спасибо. Все расходимся. Статья удалена. Всем спасибо. Все расходимся. Статья удалена. Всем спасибо. Все расходимся. Статья удалена. Всем спасибо. Все расходимся.
Добрый день.
Начал переработку моего стандарта оформления кода на языке PHP c целью сделать его более строгим и (если можно так сказать) научным, поставив на крепкий фундамент в ожидании критического отношения.
Так как я не успел реинженерить весь стандарт, прилагаю только его часть в формате pdf (сам же стандарт располагается в другом формате, более удобном для чтения и поиска). Хотелось бы обсудить основные критерии оценки и правила формата. С чем вы не согласны и почему.
Надеюсь кому то это будет полезно, так как, по сути, данный стандарт квинтэссенция моих знаний в PHP в области качественного кода.
http://johncms.com/files/forum/attach/1384081823codestandart.pdf
Долго решал к какой категории отнести данную тему, решил остановиться на этой. По ходу изучения различных дисциплин, пишу себе короткие, иерархически-упорядоченные справочники, чтобы можно было быстро найти информацию, которую никак не можешь вспомнить, а книги "рыть" лень. Вот один из моих справочников. Я писал его когда изучал систему контроля версий git. Так же я часто добавляю в справочники упражнения по темам, теоретические и практические, для того, чтобы можно было быстро проверить кандидата на работу или ученика.

Настоятельно рекомендую скачать и установить программу CherryTree, она отлично подходит для поиска информации в моем справочнике.

CherryTree формат: http://yadi.sk/d/eRTU8xxxAEmWb
PDF: http://yadi.sk/d/vYsAyHNuAEmWH

Надеюсь пригодится. Так же рекомендую к прочтению перевог книги Progit, который был завершен совсем недавно, 31 августа этого года.
Статья удалена. Всем спасибо. Все расходимся. Статья удалена. Всем спасибо. Все расходимся. Статья удалена. Всем спасибо. Все расходимся. Статья удалена. Всем спасибо. Все расходимся. Статья удалена. Всем спасибо. Все расходимся. Статья удалена. Всем спасибо. Все расходимся.
Предисловие и для кого эта статья
Добрый день.
Данная статья расчитана быть короткой, так как затрагиваемые здесь вопросы стары как мир и говорить о них долго, просто не имеет смысла. Мы поговорим о двух наиболее часто встречающихся архитектурах программ, это терминальные утилиты и программы с графическим пользовательским интерфейсом (GUI). Что сподвигло меня написать эту статью на сайте wap/web разработчиков спросите вы? Я хотел бы объяснить (или может напомнить), что же из себя представляют программы с различными архитектурами, и в по какому направлению следует идти в том или ином случае. Начнем.

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

От простого к сложному: терминальная программа
Любой из вас, кто когда либо изучал программирование, начинал именно с этой типы архитектуры. Терминальная архитектура обычно включает следующие правила работы программы:
1. Программа может получать текстовые данные из вне в виде параметров;
2. Программа может работать с входными и выходными потоками, доступными ей из вне (если вы не знакомы с понятиями потоков, не стоит расстраиваться, мы рассмотрим их чуть позже);
3. Программа может выполнять некоторые операции над имеющимися у нее данными;
4. Программа может возвращать целочисленный результат, информирующий ОС о результате выполнения программы.
Рассмотрим каждый пункт подробнее:
Входные параметры
Если вы поработаете с любыми утилитами ОС Unix, Windows, Linux или Mac, то вскоре поймете, что они могут получать некоторые входные значения, на пример:
cd <имяКаталога> - устанавливает в качестве текущего каталога данный.
Возможность передать программе (в данном случае утилите) некоторые данные и является передачей входных параметров. Программы написанные на таких языках как C/C++, Java и даже PHP могут получать некоторые входные параметры.
IO потоки
Входные (in) и выходные (out) потоки, это специальные абстракции, используемые в программах для обозначения потока данных, который может быть передан (выходной поток) или получен (входной поток) к/из некоторого источника. На пример при записи в файл вы работает с выходным потоком, а при чтении из него - с входным. Многие программы терминальной архитектуры работают с IO потоками терминала, для получения данных от пользователя и выводе их на экран.
Выполнение операций
Естественно, что программа должна уметь что либо делать с данными, иначе теряется смысл ее существования, поэтому останавливаться подробно на этом пункте не будет.
Флаг выполнения
Обычто при вызове программы с помощью ОС (такой как Linux, Windows, Unix, Mac и т.д.) вторая передает ей управление в виде создания нового процесса, в котором выполняется программа, и ожидает от нее некоторый целочисленный результат, информирующий о результате работы. Принято понимать под результатом 0 - удачное выполнение программы, а числа больше 0 означают ошибку в работе программы.
Как это связано с wap/web
Когда вы создаете PHP скрипты, вы по сути создаете маленькие программки, которые вызываются с использованием другой программы, обрабатывающей HTTP запросы (на пример apache). Эта "головная программа" в зависимости от запроса клиента передает управление тому или иному PHP скрипту, а тот, в свою очередь, работая с потоками ввода (на пример из файлов или других программ, таких как СУБД) и вывода (echo передает данные в поток вывода, который в свою очередь передается apache, который передает его в виде тела ответа клиенту). Таким образом при проектировании PHP программ стоит придерживаться терминальной архитектуры вида: получаем данные, обрабатываем их, возвращаем результат в поток вывода (возврат целочисленного результата можно опустить, так как он неявно передается PHP интерпретатором). Но когда речь заходит о DHTML+AJAX+PHP программах, все несколько изменяется.

GUI
Давайте рассмотрим программы с GUI. В данным момент, читая эту статью, вы используете программу с GUI - брайзер (существуют, кстати, браузеры без GUI, они выполняются в терминале (командной строке) и работают так же, как обычные, но с некоторыми ограничениями, на пример w3m. Во вложении вы можете посмотреть как выглядит visavi в браузере без GUI Не сможете, сайт не поддерживае вставку файлов в статьи :-( ). Что же такое этот GUI? В переводе с англиЦкого, это Графический пользовательский интерфейс, то есть способ взаимодействия с пользователем по средствам кнопок, полей ввода, окон и т.д. Программами с данным интерфейсом удобнее управлять (да простят меня терминальщики, но я говорю именно об удобстве, нежели о быстроте или гибкости!), но их архитектура гораздо сложнее терминальных программ.
Рассмотрим ее подробнее.
Две части
Программы с GUI обычно состоят из 2 частей, это:
1. Бизнел логика - то же, что и терминальная программа, то есть часть программы, ответственная за логику (как модель в MVC или PHP скрипт без echo);
2. GUI - часть программы, ответственная за представление состояния программы пользователю и взаимодействие с ним (как вид и контроллер в MVC или DHTML+AJAX в web'е).
Принцип работы
Те из вас, кто знакомы с MVC, легко поймут принцип работы программ с GUI. Обычно все строится по следующему алгоритму:
1. Создается бизнес логика, которая расчитана на прием и передачу простых текстовых сообщений с помощью предоставляемых ей IO потоков;
2. Создается представление, которое формирует графический интерфейс и обрабатывает события взаимодействия с пользователем и которое может передавать сообщения в бизнес логику (обычно все сводится к созданию интерфейса - инициализация - и обработке событий - листенеры);
3. Создается контроллер, который обрабатывает эти IO потоки и обеспечивает коммуникацию между представлением и бизнес логикой.
Сложность состоит в том, что терминальные программы состояти из 1 части - бизнес логики - а GUI вносит еще 2 компонента - представление и контроллер.

А как же web
web перенял терминальную архитектуру от wap'a, именно поэтому до сих пор используются такие костыльные компоненты, как шаблонизаторы, но с появлением web2.0 и HTML5 и развитию мобильных технологий главенствование терминальной архитектуры в web'e подходит к концу (лет так 10 еще просуществует, без паники).
GUI архитектура в web'е предполагает использование PHP как языка для создания бизнес логики программы (читать - сайта), JS, HTML, CSS и AJAX для создания графического интерфейса.
Этот подход позволит сократить объем трафика, используемый для коммуникации пользователя и программы, а так же увеличить возможности GUI, но в то же время программы станут сложнее, программисты разделяться на GUI-программистов и прикладных программистов, а дизайнерам придется работать не со статичным интерфейсом, а с динамичными структурами.

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

Так же хотелось бы попросить администрацию ресурса уделить больше внимания околоWEBовским технологиям, так сказать актуализировать их среди пользователей, а пользователей хотелось бы попросить обратить внимание на другие языки программирования и принципы работы таких важных системы как ОС и apache (ну или IIS).

Спасибо за внимание!
Предисловие
Хотя меня чаще можно наблюдать в разделе, посвященном ООП, иногда я касаюсь глобальных вопросов программирования в целом и некоторых его аспектов, не связанных с ОО, в частности. Сейчас как раз такой случай, а поговорим мы сегодня о том, чего хотят иметь в авторстве многие начинающие программисты, а именно о движках, двигах, двигателях и подобных, многими не понимаемых терминах. Сразу предупрежу любителей халявы, данная статья не является руководством по написанию "эксклюзивного двига" для вашего сайта, здесь речь пойдет именно о смысловой составляющей этого термина. Начнем.

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

Совсем немного истории
Начало
С самого начала становления программирования как дисциплины, люди начали стремиться к повторному использованию кода, его накоплению, упрощению понимания программы. Все программисты, и вы не исключения, стремились к написанию собственных "принципиально новых" велосипедов, которые должны были перевернуть привычный мир девелопинга, но большинство этих попыток обычно сводились к накоплению некой библиотеки утилит (функций или классов) и передачи ее в архив после использования любого стороннего продукта. Конечно есть и принципиально новые, но по сравнению с велопарком, это единицы.
Метапрограмминг
С появлением потребности в больших, коммерческих программных продуктах, появилась и потребность в написании таких программ, которые проще сопровождать и модифицировать. Это привело к созданию модулей, отвечающих за автоматизацию многих рутинных операций, что позволило программистам абстрагироваться, то есть отвлечься от низкоуровневой составляющей программирования. Так начали появляться первые программы, создающие программы, то есть очертания любимых всеми движков.
Распространение
Создание метапрограмм, то есть программ, позволяющих создавать прикладные программы, резко ускорило развитие IT индустрии и новые программы появлялись с частотой в несколько штук в день. Многие, как и ожидалось, оставляли желать лучшего, но были и самородки. Дело в том, что такая модель развития отклонила вектор девелопинга от университетов и научных учреждений, к более непринужденному, доступному и простому программированию, это привело к появлению множества не стандартизированных и часто несовместимых программных продуктов.
Унификация
Когда IT мир понял, что для использования одной программы требуется днями искать подходящие для нее компоненты, встал вопрос унификации, то есть стандартизации и приведения разного к общему. Так появлялись первые программные адаптеры, инкапсуляторы и унификаторы, то есть программные модули, позволяющие совмещать несовместимое ПО.
Игровая индустрия
Игры внесли немаловажный вклад в развитие движков, именно на этом рынке зарождались первые механизмы оптимизации и визуализации. Движки в играх строились по тому же принципу, что и корпоративные программные продукты вида b2b (от бизнеса и для бизнеса), но с уклоном на постоянную нехватку ресурсов.

Структура
В качестве примера можно взять практически любой движок, но я использую собственную разработку, так как у меня не будет сомнений в правильности описываемых мною программ. Конечно можно усомниться в полноте материала, ведь мой движок не охватывает такие важные понятия, как скажем рендеринг, звук, обработка видео и т.д., но в качестве простого и понятного примера, он подходит как нельзя лучше.
Как уже говорилось ранее, движок это не конкретный набор программных компонент, более того, нет точного определения этого термина, потому я постараюсь раскрыть это понятие в контексте одного из возможных вариантов.
Много лет опыта
Изучив не мало языков программирования и набив куда больше шишек от собственной криворукости, я, как и ожидалось, пришел к необходимости использования многоуровневой архитектуры программ, а именно расслоения программы с помощью абстракции.
Начал я свою систему (да-да, я не люблю слово движок ;) ) с написания нескольких классов, реализующих некоторые паттерны программирования для PHP. Данные классы (а точнее интерфейсы) позволяли стандартизировать основы архитекутуры будущей системы. Вслед за паттернами были написаны обертки базовых типов данных, добавляющие логику в строки, числа и массивы когда это было нужно. Затем появились классы, скрывающие низкоуровневую логику, такую как работа с сетью, базами данных и файловой системы, от других, более высокоуровневых слоев. Так я создал первый слой системы - слой инструментов. Данный слой делится, как уже было сказано, на слой шаблонов, то есть интерфейсов и классов, упрощающих программирование структуры других классов, и слой классов, включающих низкоуровневые классы для сокрытия логики от других слоев.
Если провести параллель с другими программными системами, данный слой я сравниваю с программными библиотеками, хранящими множество готовых решений простых задач. Важно понимать, что этот слой не должен зависеть ни от одного другого слоя системы, то есть классы этого слоя не должны "знать" о существовании других частей системы. Явно прослеживается программная библиотека, не так ли? Это позволило мне использовать данный слой еще в паре тройке других проектов, но этой другая история.
Вот она, вот она, система моей мечты
Важно понимать, что библиотека классов (или функций) не является частью движка как такового, то есть движки используют библиотеки, но их целью является метапрограмминг, а не аккумулирование программного кода для любых задач, с этой целью лучше справляются языки программирования.
И так библиотека готова, пришло время написать слой служб, то есть классов, отвечающих за работу самой системы. Эти классы активно используют библиотеку и включают такие компоненты, как: конфигуратор системы, локализатор сообщений, кэшер, лог, маршрутизатор, интерфейс взаимодействия с БД и т.д. Именно эту часть я считаю движком, нежели все остальные. Другими словами данный слой создает очертания системы и позволяет настраивать ее достаточно гибко.
Если рассматривать такие системы, как GNU/Linux, то GNU будет являться библиотекой и набором модулей (следующий слой), а Linux тем самым движком, который создает очертания системы и диктует правила работы с ней, но только не нужно синонимировать (есть такое слово? Оо) ядро и движок, это несколько неверно.
Гибкость
С появлением второго слоя, более абстрактного, но и более прикладного, я задался реализацией модулей, то есть программных систем, добавляющих функционал при их подключении. Как программы добавляют функционал ОС, так и слой домена (третий слой системы) добавляет функционал движку. Данный слой не являются частью движка чуть менее чем совсем, это лишь набор готовых решений некоторых прикладных, предметных задач, но без этого слоя теряется необходимость в самом движке (вам ведь не нужен сайт без форума, соц сети и встроенного гугла?!).
Я уже написал более десятка различных модулей и их число растет с каждым днем, но это уже надстройка над системой, нежели развитие самой системы. Модули связаны со слоем служб и используют классы слоя инструментов (библиотеку), то есть они зависят от архитектуры системы, но они взаимозаменяемы и, если постараться, могут быть перенесены на другие движки.
Визуализация
После написания нескольких основных модулей, таких как модуль доступа, регистрации пользователей и системных компонент, я принялся за написания консоли, то есть визуализатора, позволяющего обращаться к модулям через пользовательский интерфейс, а не "вшивая" обращения в код программы. Это было рождение слоя представления, слоя, содержащего экраны, визуализирующие текущее состояние системы в целом.
Данный слой, как и слой домена, включает взаимозаменяемые компоненты и, хоть и зависит от других, но не является частью движка, то есть можно удалить визуализацию вообще, от чего движок не потеряет своей "движучести".
Резюме
Как видите, под понятием "Движок" может скрываться огромное множество различных программных компонент, начиная от библиотек и кончая визуализацией. Подумайте об известных вам wap и web движках с этой точки зрения, и вам удастся лучше понять их структуру и, возможно, улучшить ее.

Охуечумелые ручки
Если вы все таки не поверили моим первым предупреждениям и дочитали статью до самого конца с надеждой найти хоть что то, что поможет вам в написании собственного движка, то вы сделали это не зря! Ура и ах, я немного расскажу о том, с чего можно начать при написании движков, в частности, для web'а.
Чистый лист
В первую очередь нужно понять, что для хорошего дома нужен крепкий фундамент. Скажу сразу, язык PHP настолько сырой, что без множества унифицирующих классов, интерфейсов и методов работать с ним крайне неудобно, особенно когда дело доходит до большого движка. Начните с выбора готовой программной библиотеки или написания собственной. Она обязательно должна охватывать все низкоуровневые операции, в том числе работа с элементарными типами данных, базой данных, процессами, файловой системой, архитектурные решения и так далее. Так же я советую реализовывать эти классы максимально полиморфно, инкапсулированно и гибко, так как их еще предстоит много раз переписать. Предупрежу сразу, многие на этом этапе и останавливаются, так как для продуктивной работы нужен стимул в виде готовой системы, но вы ведь не сдадитесь? Если сомневаетесь, используйте готовую библиотеку (фреймворк на пример, хотя сегодня это понятие смешалось с понятием движка, фу!).
Система
Часто после создания библиотеки (а еще чаще и до этого) пишутся такие модули (именно модули!), как регистрация, разделение доступа и подобное. Многие удивлялись как это я умудрился вывести эту логику на уровень модулей (слой домена) и подключать их в виде отдельных программ, но важно понять, что все, что не относится к архитектуре и низкоуровневым инструментам, является не движком, а модулями. Чтобы было проще, могу посоветовать следующую "лакмусовую бумажку": если некоторый функционал не является используемым всеми возможными модулями, то это модуль, если же это общеиспользуемый функционал, то это движок или библиотека. В моей системе этот принцип прослеживается очень хорошо, с учетом того, что правила построения этой системы содержат больше "букаф" чем эта статься ))) но не будем о грустном.
И так пора писать такие вещи, как служба конфигурации, локализации (хотя это может быть и модуль), Фабрику СУБД и т.д. Эти компоненты описывают очертания будущей системы, хотя я бы посоветовал так же выбрать из того что есть, нежели писать самому, ибо все (конечно не все, но многое) уже давно написано.
Разное
Вот теперь уже можно писать всякие плюшки, которыми грезят многие новички: форумы, чаты, галереи, соц сети и т.д. Это все пишется под созданную (или позаимствованную) ранее систему с использованием созданной (или позаимствованной) ранее библиотеки.

Конец
И вот вы уже (надеюсь) лучше представляете себе, из чего же состоят эти программные монстры и (наверно) хотите заиметь себе парочку, но не спешите, написание движка это работа не на один месяц, порой у меня уходило несколько только на написание пары пакетов, ведь здесь и документация, и тестирование, и реинженеринг, и еще много чего не очень интересного.
Прошу всех, кто зажегся на написания собственного движка после прочтения этой статьи - мотивация это важно, но не надоедайте собственным самолюбием ;)
Удачи в программировании!
Введение
Данная статья содержит выжимку моего опыта как программиста. Я постараюсь не повторять общеизвестных принципов и правил, описанных в таких замечательных книгах как "Совершенный код" или "Загадочный человеко-месяц", а приведу замеченные и тщательно отобранные мною законы, следуя которым, можно добиться если не отличных, то как минимум, хороших результатов в столь нелегком деле, как программирование компьютерных систем. Замечу, что в написании программ, я придерживаюсь исключительно ООП подхода, если конечно задача не требует другого.

Начинаем новый проект
Как вы начинаете новый проект? Общаетесь ли вы с заказчиком, или требуете "техническое задание"? Готовитесь ли вы к будущей работе или садитесь за написание кода сразу? Многие начинающие программисты (да и не совсем начинающие) стремятся минимизировать данную фазу проекта и поскорее перейти к непосредственному программированию, но не стоит забывать, что написание кода это не есть программирование, как не есть дырка сыром, это лишь его часть, хотя и наиболее важная, но все же часть.
Подводные камни
И вот новый заказчик с очередным, довольно простым и прибыльным проектом. Пусть его техническое задание на первый взгляд кажется трудоемким, но вас это не пугает! Вы внимательно, хоть и по диагонали, читаете этот увесистый документ и оцениваете стоимость будущей системы. Конечно это не общепринятый план действий, но довольно распространенный, не так ли? Этот подход имеет множество подводных камней, но и полезен тем, что позволяет не утруждать себя сложной подготовкой к простому проекту.
И так какие проблемы могут ждать вас и уже попадались мне?
1. Недопонимание - заказчик хотел одно, а вы поняли совершенно иначе, и в результате заказчик хоть и не против выкупить систему, ибо долго ждал, да и спорить с авторитетным "кодером" не хочется, но осадок остался;
2. Плохой фундамент - вроде вот оно, техническое задание, но многие моменты в нем вам кажутся непонятными или абсурдными. Конечно это не проблема, но хотелось бы лучше;
3. Недооценка или переоценка - два предыдущих пункта обычно ведут к занижению или завышению стоимости;
4. Стандарт - у вас вряд ли есть четкий прайс-лист ваших услуг, не так ли? Максимум n руб. за час, и то, с "можно договориться".
Эти, "не очень" серьезные проблемы, могут сильно повредить вам, когда заказчик станет крупнее, бюджет больше, и риски выше.
Возможные решения
Я всегда начинаю проект не с кода или листа бумаги, а с подробного плана будущих работ, анализа требований заказчика и оценки эффективности. Крупные компании, занимающиеся разработкой программного обеспечения, формируют довольно большие пакеты документации именно на данном этапе, так почему бы не последовать их примеру. К подобной, обязательной документации, лично я отношу следующую:
1. Модель прецедентов - если вы еще не знаете что это, настоятельно советую узнать. Прецедент это сценарий использования некоторой части системы, и описывать требования заказчика с точки зрения сценариев использования очень легко и понятно как для вас, так и для заказчика;
2. Словарь терминов - все неясные или неоднозначные термины я выношу в отдельный словарь, привязанный к проекту;
3. Предметная модель - когда я писал свой преобразователь объектов в реляционные структуры, я уже достаточно хорошо знал SQL, но все равно предварительно я перечитал свои конспекты и записал основные моменты в отдельный документ. В последующем этот документ сэкономил мне немало времени, так как он содержал очень полезные решения и подзабытые мною хитрости SQL. Изучайте предметную область перед началом работы;
4. Функциональная спецификация - данный документ служит для закрепления понимания между мной и заказчиком. Если написанная мной программа полностью соответствует изложенным в этом документе требованиям, а заказчик не доволен, то я забираю деньги (но, конечно же, не бросаю заказчика ) ).
Заметьте, что данный этап не включает в себя технического задания. Почему? - спросите вы. Дело в том, что техническое задание это документ, используемый разработчиками, и он, как правило, состоит из огромного числа других документов, а потому, нет возможности подготовить его на столь раннем этапе.

Готовим фундамент
Заказ принят, аванс оплачен, компьютер включен, что дальше? Открываем любимую IDE или текстовый редактор и начинаем писать главную страницу сай... то есть главное окно системы )) Ну как правило так и поступают, но это не лучший выбор для проектов, которые планируется сопровождать, а не просто продать и забыть.
Подводные камни
На данном этапе могу выделить множество "подводных камней", но остановлюсь на наиболее важных:
1. Непонимание проекта - вы вроде поняли, что нужно сделать, но часто останавливаетесь и задумываетесь - а что я сейчас делаю? Для вас подбор имени свойству, классу или методу целая проблема, а о размерах классов я вообще молчу. Скорее всего, вы плохо понимаете, что вы делаете;
2. Сложность моделирования - всем нам тяжело держать в голове сложные модели. Если вы забываете недавно пришедшею мысль, то вы не одиноки;
3. Недопонимание внутри команды - вы пишите код, за вами его тут же переделывают ваши коллеги - знакомая картина?
Возможные решения
Никогда не начинайте проект с кода! Это наиболее опасный путь, так как подобные программы нужно писать на одном дыхании и как можно быстрее избавляться от них, как от бомбы с часовым механизмом! Такие системы, это как бег у сороконожки, пока она делает это подсознательно, все получается, но стоит задуматься над тем, что в данный момент нужно делать и что ждет впереди, как все рушиться и бедное создание попадает в глубокий ступор.
1. Модель классов - выделите основные сущности будущей системы и опишите их в модели классов, а за основу можно взять уже существующую модель предметной области;
2. Модель взаимодействия - объекты создаются для взаимодействия, так опишите эти взаимодействия в данной модели;
3. Абстрагирование - старайтесь использовать слоистую модель разработки, внизу наиболее прикладные механизмы, вверху наиболее абстрактные. Внизу класс для работы с файлом, вверху класс для буферизации данных с помощью файлов.

Пишем
К тому времени как я начну писать код, вы наверняка уже закончите половину системы ))). И так написание кода, или реализация системы, является наиболее важной и ответственной частью проекта. Это одновременно и наиболее сложный этап, так как он требует наибольшей концентрации и использования всех своих умений. Обычно данный этап для многих новичков является испытанием их возможностей, но для меня это механический труд, по типу - а как быстро я сейчас набираю слепым методом? - да, да! Я пишу код на основе подробных моделей и разработанных архитектур, потому его написание практически не вызывает трудностей, написание данной статьи для меня куда сложнее )
Подводные камни
Сразу к делу:
1. Не на что опереться - вы держите всю систему в голове и каплями выплескиваете ее в код, часто забывая, что вы делаете в данный момент? Знакомая картина для 99% начинающих программистов;
2. Сложность - самая опасная часть программирования! Все описанное ранее требуется лишь для того, чтобы сделать систему наиболее простой в понимании;
3. Сроки - я еще не видел программиста, который всегда успевает сдать проект во время, а истоком данной проблемы является первый этап!
4. Знания - учитесь во время программирования? Не стоит! Учиться надо в свободное от работы время и наиболее жадными способами. Как вам 350 страничная книга за 4 дня? Это не предел!
Знакомые проблемы? Думаю да. С ними сталкивался каждый программист!
Возможные решения
1. Планы - если вы не упустили предыдущих двух этапов, то проблем у вас с фундаментом для будущей системы не будет;
2. Разделяй и властвуй - если алгоритм вам кажется сложным, разделите его на части, а те еще раз, и так, пока алгоритм не станет тривиальным. Это старое, но мощное средство снижения сложности задач;
3. Запасы времени - заказчик не согласен на 2 недели работы? Откажитесь от заказа! Условия ставите вы, а не заказчик, так как вам выполнять заказ;
4. Учитесь - читайте больше качественных книг по программированию, языку программирования, архитектурам, решениям, шаблонам, теории и т.д.

Проверяем
Программа написана, запущена в специально подготовленной среде и выдала ожидаемые результаты? Продавай скорее! ))) На данном этапе необходимо сломать программу. "Сломать ее полностью"!
Подводные камни
1. Страх - в процессе написания или изменения кода часто появляется чувство страха. Оно вызвано нашей неуверенностью, тем что код может не запуститься или того хуже, повлиять на всю систему.
Возможные решения
1. Юнит-тесты - пишите юнит-тесты чаще, пишите их всегда, когда появляется чувство страха! Они как лакмусовая бумага, покажут вам, что и почему не работает;
2. Покрытие - постарайтесь покрыть тестами как можно больше кода, часто ошибки встречаются там, где меньше всего их ждешь.

Описываем для потомков
Вы когда-нибудь писали документацию для своих программ? Если да, то это уже хорошо, но если нет, сжечь вас и прах ваш... хотя нет, лучше так:
Подводные камни
1. Поддержка проекта - нет желания возвращаться к той каше, что была написана 4 месяца назад? Можно ведь просто выключить телефон )
2. Популярность - какой проект вы выберете? Японоязычная документация и никаких комментариев в коде или рускоязычная документация с отлично поддержикой?
Возможные решения
1. Документирование - PHPDoc ваш лучший друг! Нет? Уверен что да! )
2. Пакет документов - если вы послушали меня, и все же к концу проекта у вас набралось 2-3 документа, не выкидывайте их, они вам еще обязательно понадобятся, хотя-бы чтоб вспомнить, зачем же вы в цикле обращались к базе.
Итоги
Попробуйте написать проект с использованием изложенных здесь правил, хотя-бы просто для общего развития, стоит попробовать что-то новое, не так ли? Удачи в программировании!
Облако тегов / Авторы