Ликбез по программированию

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

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


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

Причем в рунете вы можете найти несколько хороших специализированных сайтов ( сайт , www.phpclub.net и т.д.), где есть много отличных материалов для начинающих (достаточно воспользоваться поисковой системой), объяснены основы. Если что-то непонятно — обращайтесь к другому источнику и форумам.
Кстати, очень часто у начинающих можно встретить проблему: они не совсем понимают, что хотят сделать. То есть: «я учу, но зачем?». Поэтому предложим для освоения PHP цели, а именно, обязательное написание ряда программ.

. Калькулятор (это делается в первую очередь практически для всех языков программирования для изучения специфики математических операций). . Одностраничная анкета или тест. Пользователь выбирает варианты ответов, расставляя «птички». Параллельно с этим считается статистика по нажатиям. Вычисляется правильность прохождения теста или составляется результат анкеты.
. Простейший одностраничный интернет-магазин, например, по продаже игрушек. Пользователь выбирает товары, их количество, после чего выдается результат того, что он заказал: «слоник» 3 шт. 9000 руб., «машинка» 1 шт. 3000 руб., общая сумма заказа 12.000 руб.».
. Система оценки статей. Каждый посетитель может выставлять оценку от 1 до 5 баллов, при этом, если он уже голосовал, второй раз этого сделать не может («страшное слово» cookies:)). Вычисляется средняя оценка.
. Менеджер файлов.
. Гостевая книга.

В принципе, написав все это самостоятельно, при помощи книг и руководств, но при этом понимая, что вы делаете (каждую строку кода), вы уже начинаете становиться специалистом.

Но… хорошо, если вы натолкнетесь на ресурс или книгу, где вам, не знакомому с программированием, на примере PHP(!) качественно, «на пальцах» объяснят, что такое переменные, типы данных, массивы, циклы, функции и т.п. Не очень верится, что такое произойдет.

Поэтому есть и другой, по моему скромному мнению, более правильный путь. PHP не является чем-то особенно сложным, если вы владеете на начальном уровне хотя бы одним из базовых (лучше объектно-ориентированных) языков. И это не обязательно должны быть С++/С# или Java.

Из современных я бы предложил начинающим в первую очередь ActionScript 2.0 (3-я версия языка более сложна, поскольку приближена к Java). Если кто не знает, это Adobe Flash. Находите книгу Дмитрия Гурского «Программирование на ActionScript 2.0». Несмотря на то, что это профессиональная серия, там все очень хорошо и доступно объяснено.

ActionScript 2.0 очень легок в освоении, дает все необходимые базовые знания в области программирования как такового, причем его синтаксис основан на стандарте ECMA-262 — это тоже большой плюс. Иными словами, в будущем вам будет понятно множество других С/С++-подобных языков и некоторые операции в PHP. Даже не углубляясь в «язык флеша» (хотя я бы рекомендовал изучить AS качественно), вы приобретете навыки работы с объектами, формами, классами, при этом пишутся так называемые сценарии, то есть модели поведения. В рамках ActionScript 2.0 вы легко научитесь созданию интерактивных форм со стандартными компонентами, такими как, например, текстовые поля ввода, листбоксы, комбобоксы и т.п. При желании сможете написать таковые и самостоятельно. В общем, самое главное — умение обращаться со всем этим арсеналом.

Многие спросят, зачем так усложнять? Ведь PHP достаточно прост. Дело в том, что объектно-ориентированное программирование учит очень важной вещи - качественному планированию. То есть вы сможете четко ставить перед собой задачи, выявлять и представлять последовательность действий и так далее. В любом случае, перед тем как что-то писать в коде, вы должны составить общую модель, описать ее.

Во-вторых, нужно с чего-то начинать, то есть приобретать навыки программиста. Это должно быть, с одной стороны, легким, а с другой — современным. Кстати, по этому поводу следующий вопрос.

Я бы хотел узнать, какой язык проще начать изучать, чтобы писать программы, и какой язык программирования лучше для этого.
И можно ли написать какие-то программы на языке Pascal? И напишите пример программы на языке паскаль и "какой язык проще начать изучать, чтобы писать программы".


Итак, выше было сказано, что для самых начинающих хорошо подойдет ActionScript 2.0. Правда, выводиться все будет только через Flash Player. Насчет языка Pascal:), вопрос смешноватый, поскольку, как минимум, Object Pascal является основой для очень популярной среды разработки Borland/Inprise Delphi. В ней до сих пор пишется очень много ПО, потому как приложения там составляются по принципу конструктора, а сам процесс разработки очень прост и быстр, язык удобен. Вокруг данной среды собралось серьезное сообщество энтузиастов и опытных программистов, поэтому есть большое количество полезных ресурсов, библиотек с дополнительными компонентами, прекрасных книг.
Причем в Delphi разрабатывалось немало известных программ.

Пример программы на Object Pascal (Delphi)… как вы себе это представляете? Пятнашки? Я всегда выполняю конкретные задачи, код там достаточно объемен, и нужно долго объяснять, что к чему. В общем, Delphi прост в освоении, если у вас есть желание. Возможностей — море.

Если хотите, некоторые примеры для статей я буду писать не только на С/С++/С# и Lua, но и, например, на Delphi. Разницы нет.
И, кстати, в большинстве случаев я рекомендую начинать с С#.

После двух лет изучения Turbo Pascal в лицее (я занял второе место на районной олимпиаде по программированию) и года — C++ в БГУИРе (учусь на ФКП), я начал учить серверный язык программирования PHP.
В процессе самообучения я понял, что дизайнер из меня никудышный, а сайты делают из готовых CMS, да и при создании сайтов нет того интереса придумывания хитрых алгоритмов. Так скажите, где я могу использовать этот язык, чтобы составлять сложные интересные алгоритмы. Думал в обеспечение безопасности податься...


В общем, PHP развивается, он и сейчас используется для решения не совсем тривиальных задач. Есть сайты по шаблонам, а есть и «авторы шаблонов», причем хорошо зарабатывающие. То есть практически с нуля разрабатываются сложные системы с реализацией администраторского и пользовательского интерфейсов, взаимодействием с базами данных и специализированными СУБД, отдельно решаются вопросы безопасности. Это же относится и к сетевым играм, а также множеству сетевых приложений. В общем, развернуться есть где. Кстати, на PHP-специалистов спрос постоянен.

Единственный «тормозящий» момент, на который хочется указать, — менталитет, у нас мало серьезных задач решается, и много готовых решений заимствуется. Это мое скромное мнение. Хотя идей вокруг масса. Хороших идей. Пример? Связанный с РНР?

ОК, я уже давно слежу за общей тенденцией развития программ-конструкторов, в рамках которых пользователь, не умея программировать, просто составляет логические цепочки за счет несложного визуального представления. Это сейчас очень модная тема в различных сферах, от создания компьютерных игр до того же web-дизайна. Что касается последнего, ваш покорный слуга внимательно рассмотрел около пяти таких программ, вернее, изучил около 12, но только пять из них оказались более-менее серьезными. В принципе, ситуация не дожата до необходимого уровня — все равно пользователям нужно знать HTML, Java, PHP (в зависимости от того, какой вариант они хотят выбрать), то есть выход на редактор кода так или иначе присутствует.

А почему бы еще не упростить задачу и не сделать конструктор без кода (со стороны пользователя), чтобы он собирал логические цепочки, указывал выводимые параметры и т.п. И интерактивность генерируемого приложения/сайта/ресурса после основывалась бы на том же РНР (код генерируется автоматически)? Сделать максимально понятный интерфейс, большую обновляемую библиотеку красивых компонент (различных видов, цветов и т.п.). Это сложно реализовать? Нет. Только направление развивается не нашими разработчиками. А после наши же пользователи будут платить за такие программы, причем сформируют сообщества в Интернете, начнут переводить документацию… Все как обычно… будет двигаться традиционно:). Хотя захватить такой программой русскоязычный сегмент вполне реально, а если она выйдет удачно, то и зарубежный потребитель к такому продукту потянется.

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

Недели три тому назад в увлекательной статье в Компьютерной Газете вы рассказали о конструкторах компьютерных игр. В конце статьи было анонсировано: "продолжение следует". Вопрос к вам - когда можно ожидать продолжения этой темы?

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

Расскажите, пожалуйста, простыми словами об эмерджентности, немного непонятен термин и что за ним стоит…

:))) Эмерджентность — это одна из любимых тем специалистов по искусственному интеллекту. И хотя у английских слов emergency и emergent есть конкретные варианты перевода, под этим термином в ИИ скрывается весьма интересное явление — возникновение некоей неожиданной формы поведения, которая изначально не планировалась. Другими словами, у системы появляется свойство, которое не является свойством его подсистем и не может быть выведено из других свойств. Эмерджентность относится к явлениям высокого уровня. Самый простой пример: с точки зрения микроэкономики в мире долгое время все было более-менее нормально — фирмы работали, валютный рынок был более-менее стабильным, но на уровне макроэкономики наступил кризис. Пока его причины не изучены, это явление можно назвать необъяснимым, то есть эмерджентным.

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

Мало того, эмерджентность может встречаться и в экспертных системах, которые не нужно путать с системами, «основанными на знаниях»; есть небольшое отличие, потому как экспертные системы делают выводы и вырабатывают решения. Раньше за экспертными системами так или иначе скрывались обычные knowledge-based, то есть составлялись системы оценки вводных параметров и в результате делался вывод. Это больше напоминает работу программы по рисованию графиков согласно загруженным данным — интеллекта там нет. Или шахматного ПО, где зачастую оптимальный ход высчитывается просто с учетом весовых коэффициентов. Но при этом нередко сложная шахматная программа не может сделать первый ход (поэтому и используется база дебютов). Самые неэффективные фигуры при начале партии — слоны, ладьи, ферзь и король. Почему? Они блокированы и не могут никуда двигаться. Экспертные системы более близки к повторению нашего мышления. В качестве иллюстративного примера в серии «Популярно об ИИ» я приводил предложение: «Мы сели под ели и ели» («сели» — или существительное «сель» во множественном числе, или глагол, «ели» — аналогично). Как поступит программа-переводчик в данном случае, непонятно. Для правильного перевода пригодится либо человек, который слету понимает, о чем речь, либо экспертная система, повторяющая его мысли.

Другой пример с микро и макро был приведен в той же серии на примере муара, противостоянии идей Римана и Гаусса, а также вскользь вспомнили о Джоне Нэше. Причем, на примере муара - наблюдая микроуровень и не зная о том, как выглядит макро (вернее, как мы его запрограммировали), человек сделает совершенно другие выводы, а макро станет для него неожиданностью, то есть эмерджентностью.

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

В общем, тема очень интересна и обширна.

Не могу разобраться, как в Delphi блокировать запуск второй копии приложения?

Уф-ф, когда-то мне присылали тот же самый вопрос по С++, но я забыл на него ответить:). В общем, смотря на каком уровне знаний вы находитесь… Фактически для всех основных языков при программировании под Windows, в том числе и для C/C++/C#, равно как и для Delphi, действия будут идентичными. Используется системная функция CreateFileMapping(), ее описание (смотрите спецификацию в справке):

HANDLE WINAPI CreateFileMapping(
HANDLE hFile,
LPSECURITY_ATTRIBUTES lpAttributes,
DWORD flProtect,
DWORD dwMaximumSizeHigh,
DWORD dwMaximumSizeLow,
LPCTSTR lpName
);

В начале текста проекта до создания формы требуется поместить фрагмент кода. Нам нужно выделить блок совместно используемой памяти в системном страничном файле. Этот блок может быть именован или нет (lpName).
Например, в Delphi мы введем так:

var MyMapping : THandle;
MyWindow : THandle;

begin

MyMapping := CreateFileMapping($ffffffff,
nil, PAGE_READONLY, 0, 32, 'MyProgr'');

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

if GetLastError = ERROR_ALREADY_EXISTS then
begin
MyWindow := FindWindowEx(0, 0, TfmMain.ClassName, nil);
if MyWindow=0 then
SetForegroundWindow(MyWindow);
Halt;
end;
//далее может продолжаться Application. Initialize;

Могу дать пример и на С++ из справки Visual Studio:

hMap = CreateFileMapping(...);
if (hMap != NULL && GetLastError() == ERROR_ALREADY_EXISTS)
{
CloseHandle(hMap);
hMap = NULL;
}
return hMap;

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

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

Это правда, что во многих играх данные считываются с заранее подготовленной базы, а не вычисляются в процессе?

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

На сегодня все, с наступающими праздниками!

Кристофер christopher@tut.by


Компьютерная газета. Статья была опубликована в номере 01 за 2010 год в рубрике программирование

©1997-2024 Компьютерная газета