Без прочного знания основ математики получится работать только с тривиальным кодом для очень простых задач. Разобраться в готовом коде бывает не просто. Мат. детали возможно вспомнить, только если раньше их знал. Другое дело, что даже мат. специальности традиционно делятся на «чистые» и «прикладные». Хорошо известно, что прикладников нужно готовить иначе, чем чистых математиков. Обычно перед программистом не стоит задачи доказать новую мат. теорему — когда и если такая задача возникает, программисту приходится обращаться за помощью к чистому математику. Другое дело, что программист должен обладать достаточными знаниями, чтобы самостоятельно оценить вычислительную сложность алгоритма, вникнуть в доказательство его корректности, понять, как модифицировать алгоритм под конкретную цель и т.д. Будущий программист должен знать основные теоремы математики и уметь их применять на практике, но конечно же он не должен детально знать доказательства всех этих теорем. К сожалению, нередко мат. преподы требуют именно подробных доказательств, и пока студент не докажет, зачета он не получит и экзамена не сдаст.
При этом нужно отметить, что существует много конкретных работ, где знание математики почти не требуется или требуется очень ограниченная область. И можно долгие годы благополучно работать в такой экологической нише. Однако в этом случае увольнение с работы может обернуться личной катастрофой.
Кстати, со второго по пятый курс универа я вовсю подрабатывал написанием курсовых и дипломных работ, в т.ч. для студентов IT'шных факультетов. А еще я делал им лабы. На Си и Делфи. При том, что тогда толком эти языки не знал (и сейчас не знаю, чего уж). И если мой велосипедостроительный говнокод в 4 случаях из 5 оценивался на отлично, значит стать настоящим специалистом на тех факультетах можно было только чем же путем, что и у нас.
Это очень плохо, что там так халтурно принимали лабы (не говоря о курсовых и дипломах). Диплом, курсовую, лабу может сделать кто-то другой на отлично, может не студент, а сильный специалист (на сайтах фрилансеров куча подобных предложений). Но любой нормальный препод при неформальном отношении к своим служебным обязанностям всегда обнаружит, что данную работу сделал кто-то другой, задав всего несколько конкретных вопросов по ней.
Пожалуйста! (Хотя в общем-то не за что — посоветовал не оригинально, с накоплением опыта подобные советы становятся довольно очевидными). Дополнительно рискну дать более оригинальный совет тем, кто решил избрать путь самообразования, м.б. в дополнение к вузовской программе. — Совет поучаствовать в совместном проекте. Исключительно для примера приведу свой проект — в сетке можно найти много других проектов разной степени сложности, где будут рады всем. Такое участие даст дополнительный практический опыт, круг общения по конкретной теме и возможность упомянуть о своем участии в конкретном проекте на собеседовании при устройстве на первую работу. Последнее может показаться недостаточно серьезным — кто бы спорил — конечно, публикация в солидном рецензируемом журнале по информатике будет выглядеть гораздо весомее, но за неимением оной лучше что-то, чем совсем ничего.
Жутковатые тут истории… Искренне сочувствую. Кое с чем из сказанного сталкиваюсь. Сам сейчас с преподаванием дела не имею, но много знакомых, кто преподает. Да, очень всё не здорово. Я сам окончил МГУ в СССР и сейчас кажется, что тогда хорошо учили для того времени. Однако к очень хорошей физ-мат. спец. школе осталась крупная претензия: на историю КПСС приходилось тратить времени не меньше, чем на физику и математику! — Т.о. в каждое время свои проблемы. Посоветовать рискну следующее:
1) Определить, что приоритетнее: карьера с высоким заработком или программирование с, может быть, не самым высоким заработком?
2) CS относительно новая область, причем очень быстро развивающаяся. Многое в ней очень быстро устаревает. Возможно, но не всегда бывает, что учебные курсы будут соответствовать новейшим достижениям. В то же время очень востребованы специалисты, умеющие не только программировать, но и владеющие какой-либо предметной областью (экономикой, химией и т.д.) Т.о. стоит рассмотреть вариант: учиться на экономиста или химика, а программировать и там научат (если ВУЗ достаточно хороший). Есть надежда, что более зрелым дисциплинам, чем CS, учить будут лучше.
3) Как уже сказал: языки и технологии быстро устаревают. Надо стремиться к получению базовых знаний в математике, в алгоритмике…
4) Самообразование очень полезная и даже незаменимая вещь для тех, кто научился учиться. Для него необходима большая самокритичность. Поэтому надеяться самообразованием заменить приличный ВУЗ можно, но достичь этого будет гораздо труднее, чем окончить такой ВУЗ.
Большое спасибо за Вашу статью и за интересный комментарий. Вы совершенно правы — количественное сравнение слишком грубое, что я и отметил выше. На мой взгляд, тут важно качественное различие: интеллектуальный (естественный или искусственный) эвристический подход обычно не обладает строгой доказательной силой. Такова природа вещей — за все приходится платить, но никто при этом не считает нужным отказываться от ИИ подходов. Уж тем более я, написав недавно игрового бота с ИИ. Просто призываю читателей отдавать себе отчет не только в возможностях того или иного подхода, но и в его принципиальных ограничениях. Если бы мир был устроен проще и все бы задачи решались строго аналитически, то все бы так и решали, и приближенные методы были бы не нужны.
Согласен, что интересно и общественно полезно решать разными методами (в том числе и генетическими) самые разнообразные задачи, может, даже и не традиционные для этих методов. Это позволяет лучше оценить возможности методов.
Что касается:
тем более мы сами именно таким методом её и решаем своей головой
Это очень интересный и, на мой взгляд, неоднозначный вопрос. Недавно в другом обсуждении вспомнил про Ботвинника, которому не удалось научить ЭВМ играть в шахматы своим методом. Не все методы ИИ в точности воспроизводят методы естественного интеллекта. Также повторюсь:
Известный основоположник философии интуитивизма А. Бергсон отмечал, что хотя человек может поднять руку, он не может объяснить, как он это делает. Позже, работая над системами автоматического доказательства теорем, исследователи столкнулись с парадоксальным фактом: ни один математик не может объяснить, как он доказывает теоремы настолько полно, насколько нужно для реализации этих систем. Не помогает и то обстоятельство, что математике люди учатся в сознательном возрасте и могут шаг за шагом рассказать, как они изучали математику. Еще сложнее представляется ситуация с распознаванием речи и зрительных образов – никто не может рассказать, как он этому научился.
Спасибо за интересный перевод. Жаль, не успел принять участие в обсуждении. Обсуждение показалось мне интереснее, чем статья. Немного в сторону:
Треугольник иллюзий. Человек сразу видит на этом рисунке треугольник, но нужно потратить изрядные усилия, чтобы научить компьютерную программу делать это.
Это утверждение статьи вызвало недоумение. Преобразованием Хафа находим отрезки прямых, далее отрезки, лежащие на одной прямой, и точки пересечения этих прямых. Проще простого!
Давайте уточним на примере с моей первой картинки. Уровень основной формы, далее уровень закладок на этой форме (Основная, Настройка, Тест, Роджерия и т.д.), далее компоненты управления на закладках — на основной это Дроид, ОМП и т.д., к ним относится инструментальная панель с кнопками Открыть, Справка, Выход. Для некоторых закладок кнопка Открыть не имеет смысла и прячется. Тут мы танцевали от «печки» GUI. На следующем уровне идут обработчики событий, а на следующем всякие вспомогательные функции, с GUI непосредственно не связанные. На мой взгляд, такое деление очевидно. Вы его имели в виду?
пока дойдёшь через форму(попробуй ещё найди нужный компонент среди нагромождения других)
Ходить можно не только через форму, но и через Object Tree View. Представление в виде дерева самое удобное. Если в блок-схеме не предусмотреть скрытие не интересующих ветвей, то в сложной программе возникнет нагромождение, в котором трудно разобраться. Но блок-схема м.б. графом, который не является деревом — прятать лишние цепи в таком графе не очень наглядно. Еще для сложных программ блок-схемы приобретают катастрофические размеры. Конечно, экран можно сделать безграничным, но распечатка или отрисовка такой блок-схемы на бумаге потребует листа размером с Красную площадь.
Графическое программирование — это когда ты алгоритм рисуешь а не набираешь текстом.
Согласен. Но совсем без текста на таком рисунке не обойтись.
В делфи от графического только расположение компонентов на форме, а где связи между сущностями, где графическое представление алгоритма взаимодействия этих компонент и обработчиков событий?
С этим не согласен. Вот пример кода игрового бота, о котором недавно рассказывал:
Нажав на шаблоне формы кнопку Открыть, в инспекторе объектов вижу список событий и их обработчиков, нажимаю на нужный мне обработчик и оказываюсь в нужном месте исходного текста, навожу курсор мыши на используемый метод (на снимке курсор не виден) и перехожу к этому методу по гиперссылке. ИМХО четкие и удобные связи, ничего в голове держать не надо. Имена могу давать любые.
Возможно, Вам покажется интересным следующий инструмент, который из исходного текста строит блок-схемы — он скорее для анализа кода:
Спасибо — статья затрагивает очень интересную проблему блок-схем. Еще до ПК, когда в средних и высших учебных заведениях процветало так называемой «бумажное программирование», многие учебники настойчиво рекомендовали начинать написание даже простой учебной программы с блок-схемы. В какой-то книжке того времени (не учебник, издана в США) читал, что был произведен опрос среди профессиональных программистов об их отношении к блок-схемам. «За» и «против» разделились почти поровну. В современной литературе блок-схемы встречаются относительно редко, несмотря на то, что для их создания существует хорошо развитая инструментальная база (UML и т.д.).
Честно говоря, я удивлен и недоумеваю, почему за всю историю программирования не было придумано ничего подобного
Здесь не понял: разве современные IDE, основанные на технологии графического программирования GUI, не подобное? И появились эти среды разработки довольно давно: я, нпр., многие работы продолжаю делать на старом Delphi-7. В статье предложена нижняя планка проекта — 250 строк. Верхнюю планку предложу 10 тыс. строк. Для кода больших размеров может появиться дополнительная специфика. Программы с GUI, размер которых попадает в указанный интервал, зачастую начинают делать с формы главного окна, на которой размешают компоненты (кнопки, списки, ползунки и т.д.). Далее IDE помогает создавать обработчики событий мыши, клавиатуры и т.д. В результате возникает структура с классом формы главного окна. Куда обычно и добавляют вычислительные методы, т.к. их I/O завязан на компоненты формы. Вспомогательные функции, непосредственно не связанные с компонентами, бывает удобнее определять отдельно, не встраивая их в какой-либо класс в отдельном модуле или модулях. Если я правильно понял, то предлагаемый в статье инструмент будет полезен для работы именно с такими функциями вне ОО подхода?
на следующих строчках указанной вики-статьи говорится о проблеме игры программы с программой.
Читаем здесь эти строчки:
Когда два компьютера играют в го друг с другом, то в идеале должна получиться картина игры, свойственная игре человека с человеком. Однако этого трудно добиться, особенно в конце игры. Основная проблема заключается в том
и т.д.
Люди тоже топятся в фонтанах.
Нормальные люди и подавляющее большинство ненормальных, склонных к суициду, в фонтанах не топятся. М.б. Вы считаете особым прогрессом ИИ имитацию личности на крайней стадии ее распада?
Очень интересная статья на интересующую меня тему. К сожалению, в начале статьи нет четкого определения ИИ или хотя бы игрового ИИ. Остается принять за определение утверждаемую цель
в имитации разумного поведения и в предоставлении игроку убедительной, правдоподобной задачи.
Но тогда придется все без исключения игры и — шире — все компьютерные программы называть интеллектуальными. Разве системный калькулятор ведет себя неразумно, когда перемножает пару чисел? А можно ли назвать неразумной программу, которая предлагает угадать число в заданном интервале? — С точки зрения приведенного «определения» эта программа, использующая системный генератор случайных чисел и больше ничего, предоставляет игроку убедительную и правдоподобную задачу, а, значит, интеллектуальна. Но сомневаюсь, что кто-либо согласится с таким всеохватным пониманием ИИ.
Но это очень грубое сравнение на разном железе. И это не главное. Я не оптимизировал программу, считая время в несколько секунд (и даже больше) вполне приемлемым. Главное, что мой алгоритм гарантирует нахождение кратчайшего решения, если оно существует в рамках выбранного словаря. А ИИ вряд ли сможет такое гарантировать. И м.б., что не достаточно хорошо обученный ИИ не сможет сделать из мухи слона.
Сейчас инет есть наверное в каждом дворе — в качестве инструмента верификации запросто можно использовать гугл. Раньше, когда не было сетки, в спорных случаях можно было пробежаться до районной или до школьной библиотеки.
Но никто не препятствует сделать компании свой словарь. Такое дело безусловно повысит общий кругозор двора. При этом в словаре могут оказаться слова, которые возникли только в этом дворе и никем кроме не используются.
Я не спорю, замечу только, что игроки команды «Пузляры», видимо, сочли данное слово допустимым, раз оставили его в своем словаре. Думаю, что, прежде чем играть, надо договориться, какой словарь использовать.
Думаю, что успех программы в трех партиях не дает основания для вывода, что проблема решена. Нпр., в крестики и нолики 3х3 у программы выиграть невозможно. М.б. и здесь какой-то финт: программа сводит партию к комбинациям, когда становится возможным полный перебор. Интересно, что на следующих строчках указанной вики-статьи говорится о проблеме игры программы с программой.
Что касается задачи 4х красок, то ИИ здесь ни при чем. Было сделано утверждение, что достаточно перебрать всего ок. 2000 тысяч вариантов. Этот перебор был сделан на компьютере. Однако вникнуть во все детали ни один человек не в состоянии. Поэтому почти 30 лет ряд несогласных специалистов искали контрпример. Среди не признавших был такой известный математик, как Александр Гротендик, правда, в поисках контрпримера он не участвовал. До сих пор делаются попытки найти человеческое, а не машинное доказательство. См. нпр., В.В. Родионов, Методы четырехцветной раскраски вершин плоских графов, М.: URSS, 2005. Там довольно подробно изложена и история проблемы 4х красок. Т.о., задача 4-х красок это особый случай, а с другими теоремами, за исключением достаточно тривиальных и практически никому не нужных, комп справится пока не может.
Детские коллективы не показатель. У детей могут быть разные не совпадающие знания. Нпр., помню как в 4ом классе на перемене повторил фразу, услышанную в научпоп. передаче по радио: всё состоит из атомов. Надо мной стали смеяться, но стоявший рядом семиклассник, брат одного из моих оппонентов, прекратил этот спор, авторитетно заявив, что я прав.
Но в общем случае многие игры в компании зачастую требуют уточнения правил. Это не всегда просто сделать. В случае игр в слова проще всего взять какой-либо словарь — можно не в 100К слов, а меньше и договорится использовать только те слова, что есть в данном словаре.
Вообще-то статья не о том. Алгоритм не оценивает словарь (Орфографический, 106000 слов, 28-е издание, 1990 г.). Думаю, что подобные претензии нужно адресовать составителям словаря. Выше я уже предложил выслать код, тогда Вы сами сможете получить желаемый результат.
Если бы я сказал на нашей улице «ИИ», то не высмеяли бы, как не смели смеяться, когда трубку от телевизора я, начитавшись детской энциклопедии, называл Кинескопом. Но не поняли бы. Однако Вы правы — результат работы программы зависит от словаря. Если Вас интересуют конкретные решения, то могу выслать Вам программу — хотите в исходном коде на Дельфи-7, хотите исполняемым файлом. Если не только Вас это заинтересует — выложу в открытый доступ.
При этом нужно отметить, что существует много конкретных работ, где знание математики почти не требуется или требуется очень ограниченная область. И можно долгие годы благополучно работать в такой экологической нише. Однако в этом случае увольнение с работы может обернуться личной катастрофой.
Это очень плохо, что там так халтурно принимали лабы (не говоря о курсовых и дипломах). Диплом, курсовую, лабу может сделать кто-то другой на отлично, может не студент, а сильный специалист (на сайтах фрилансеров куча подобных предложений). Но любой нормальный препод при неформальном отношении к своим служебным обязанностям всегда обнаружит, что данную работу сделал кто-то другой, задав всего несколько конкретных вопросов по ней.
1) Определить, что приоритетнее: карьера с высоким заработком или программирование с, может быть, не самым высоким заработком?
2) CS относительно новая область, причем очень быстро развивающаяся. Многое в ней очень быстро устаревает. Возможно, но не всегда бывает, что учебные курсы будут соответствовать новейшим достижениям. В то же время очень востребованы специалисты, умеющие не только программировать, но и владеющие какой-либо предметной областью (экономикой, химией и т.д.) Т.о. стоит рассмотреть вариант: учиться на экономиста или химика, а программировать и там научат (если ВУЗ достаточно хороший). Есть надежда, что более зрелым дисциплинам, чем CS, учить будут лучше.
3) Как уже сказал: языки и технологии быстро устаревают. Надо стремиться к получению базовых знаний в математике, в алгоритмике…
4) Самообразование очень полезная и даже незаменимая вещь для тех, кто научился учиться. Для него необходима большая самокритичность. Поэтому надеяться самообразованием заменить приличный ВУЗ можно, но достичь этого будет гораздо труднее, чем окончить такой ВУЗ.
5) Участвуйте в конкурсах программистов.
6) Не унывайте.
Желаю успехов!
Согласен, что интересно и общественно полезно решать разными методами (в том числе и генетическими) самые разнообразные задачи, может, даже и не традиционные для этих методов. Это позволяет лучше оценить возможности методов.
Что касается:
Это очень интересный и, на мой взгляд, неоднозначный вопрос. Недавно в другом обсуждении вспомнил про Ботвинника, которому не удалось научить ЭВМ играть в шахматы своим методом. Не все методы ИИ в точности воспроизводят методы естественного интеллекта. Также повторюсь:
Это утверждение статьи вызвало недоумение. Преобразованием Хафа находим отрезки прямых, далее отрезки, лежащие на одной прямой, и точки пересечения этих прямых. Проще простого!
С этим не согласен. Вот пример кода игрового бота, о котором недавно рассказывал:
Нажав на шаблоне формы кнопку Открыть, в инспекторе объектов вижу список событий и их обработчиков, нажимаю на нужный мне обработчик и оказываюсь в нужном месте исходного текста, навожу курсор мыши на используемый метод (на снимке курсор не виден) и перехожу к этому методу по гиперссылке. ИМХО четкие и удобные связи, ничего в голове держать не надо. Имена могу давать любые.
Возможно, Вам покажется интересным следующий инструмент, который из исходного текста строит блок-схемы — он скорее для анализа кода:
Здесь не понял: разве современные IDE, основанные на технологии графического программирования GUI, не подобное? И появились эти среды разработки довольно давно: я, нпр., многие работы продолжаю делать на старом Delphi-7. В статье предложена нижняя планка проекта — 250 строк. Верхнюю планку предложу 10 тыс. строк. Для кода больших размеров может появиться дополнительная специфика. Программы с GUI, размер которых попадает в указанный интервал, зачастую начинают делать с формы главного окна, на которой размешают компоненты (кнопки, списки, ползунки и т.д.). Далее IDE помогает создавать обработчики событий мыши, клавиатуры и т.д. В результате возникает структура с классом формы главного окна. Куда обычно и добавляют вычислительные методы, т.к. их I/O завязан на компоненты формы. Вспомогательные функции, непосредственно не связанные с компонентами, бывает удобнее определять отдельно, не встраивая их в какой-либо класс в отдельном модуле или модулях. Если я правильно понял, то предлагаемый в статье инструмент будет полезен для работы именно с такими функциями вне ОО подхода?
Я точно указал:
Читаем здесь эти строчки:
и т.д.
Нормальные люди и подавляющее большинство ненормальных, склонных к суициду, в фонтанах не топятся. М.б. Вы считаете особым прогрессом ИИ имитацию личности на крайней стадии ее распада?
Но тогда придется все без исключения игры и — шире — все компьютерные программы называть интеллектуальными. Разве системный калькулятор ведет себя неразумно, когда перемножает пару чисел? А можно ли назвать неразумной программу, которая предлагает угадать число в заданном интервале? — С точки зрения приведенного «определения» эта программа, использующая системный генератор случайных чисел и больше ничего, предоставляет игроку убедительную и правдоподобную задачу, а, значит, интеллектуальна. Но сомневаюсь, что кто-либо согласится с таким всеохватным пониманием ИИ.
Генетический алгоритм: «муха» — «мура» — «фура» — «фора» — «кора» — «корн» — «коан» — «клан» — «клон» — «слон» 137 сек.
Но это очень грубое сравнение на разном железе. И это не главное. Я не оптимизировал программу, считая время в несколько секунд (и даже больше) вполне приемлемым. Главное, что мой алгоритм гарантирует нахождение кратчайшего решения, если оно существует в рамках выбранного словаря. А ИИ вряд ли сможет такое гарантировать. И м.б., что не достаточно хорошо обученный ИИ не сможет сделать из мухи слона.
Но никто не препятствует сделать компании свой словарь. Такое дело безусловно повысит общий кругозор двора. При этом в словаре могут оказаться слова, которые возникли только в этом дворе и никем кроме не используются.
Конечно, у ИИ есть скромные успехи, однако роботы в фонтанах топятся…
Что касается задачи 4х красок, то ИИ здесь ни при чем. Было сделано утверждение, что достаточно перебрать всего ок. 2000 тысяч вариантов. Этот перебор был сделан на компьютере. Однако вникнуть во все детали ни один человек не в состоянии. Поэтому почти 30 лет ряд несогласных специалистов искали контрпример. Среди не признавших был такой известный математик, как Александр Гротендик, правда, в поисках контрпримера он не участвовал. До сих пор делаются попытки найти человеческое, а не машинное доказательство. См. нпр., В.В. Родионов, Методы четырехцветной раскраски вершин плоских графов, М.: URSS, 2005. Там довольно подробно изложена и история проблемы 4х красок. Т.о., задача 4-х красок это особый случай, а с другими теоремами, за исключением достаточно тривиальных и практически никому не нужных, комп справится пока не может.
Но в общем случае многие игры в компании зачастую требуют уточнения правил. Это не всегда просто сделать. В случае игр в слова проще всего взять какой-либо словарь — можно не в 100К слов, а меньше и договорится использовать только те слова, что есть в данном словаре.