Подскажите, плз, куда поступить

Форум для обсуждения любых тем
master_of_shadows
Маньяк
Сообщения: 199
Зарегистрирован: 06 мар 2004, 19:23
Откуда: Минск
Контактная информация:

Re: Подскажите, плз, куда поступить

Сообщение master_of_shadows »

2 Пуговица: я посоветую почитать "правильных" авторов. На тему как надо и как не надо писать софт. О том как он правильно создаётся. Итак, вот книги которые я лично советую:
1. /books/the must/Приемы объектно-ориентированного проектирования. Паттерны проектирования.pdf
2. /books/the must/AntiPatterns.pdf
3. /books/the must/Совершенный код, 2-е изд.djvu
4. /books/the must/Фредерик Брукс. Мифический человеко-месяц.pdf
5. Мартин Фаулер - Рефакторинг

Конечно в основном эти книги заходят лучше уже начинающему практику, но тем не менее. Плюс этих книг в том, что они отвязанны от платформы/языка - чистая философия программирования.

Далее - обязательно изучить функциональное программирование. Так или иначе оно приходит в мейнстрим и само по себе интересная штука. Это конечно не ответ на вопрос: что делать? Но нужные вещи имхо :).

Ещё не стоит забывать, что ты живёш свою жизнь один раз. Не стоит тратить всё время на программирование. Но если нравиться - то вперёд :).
[Ubuntu 8.10] @ home PC & MSI Wind

...take a look at the sky, just before you die...

Аватара пользователя
grub
Неотъемлемая часть форума
Сообщения: 849
Зарегистрирован: 13 сен 2006, 10:29
Откуда: Минск
Контактная информация:

Re: Подскажите, плз, куда поступить

Сообщение grub »

Пуговица, лучше с чего простого начать.

Мелкое скриптование для решения рутинных задачек (сначала таких задачек будет мало), развитие в себе привычки к DRY (если делаешь один и тот же набор действий с предсказуемым результатом два раза -- начинай прикидывать, можно ли его автоматизировать, делаешь третий-четвертый раз -- имеет смысл найти время, покопаться и автоматизировать). Банально те же задачки бэкапа настроек, забора почты, обновления дистра и т.п.

Освоить поиск по репозиториям, в гугле и на sourceforge. Если задача автоматизации явно решаемая, но как ее заскриптовать за полчаса -- не очевидно, проверь -- вдруг 90% задачи уже решили за тебя, а тебе осталось написать shell-обертку в пять строк к стандартной утилите.

Изучение какой-нибудь системы контроля версий (даже СVS для начала пойдет). Развитие привычки применять контроль версий для любой задачи с циклом жизни больше пары часов. Туда же -- обязательно посмотреть как работают diff и patch, открыть для себя наличие этого функционала в системе контроля версий. Потом (но реально попозже т.к. перегружать голову лишними сущностями сразу не стоит) открыть для себя распределенные системы.

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

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

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

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

Ну а дальше -- уже другие вопросы возникнут...

А иксы сносить не стоит всё-таки -- как будешь картинки смотреть, pdf-ы с экрана читать и по сайтам с аяксом ходить?

P.S. Всё что сказано -- ИМХО, конечно, без какой-либо претензии на высшую истину.

Аватара пользователя
grub
Неотъемлемая часть форума
Сообщения: 849
Зарегистрирован: 13 сен 2006, 10:29
Откуда: Минск
Контактная информация:

Re: Подскажите, плз, куда поступить

Сообщение grub »

master_of_shadows, для начинающего я бы добавил в начало списка Реймонда "Искусство программирования для Unix" -- очень толково и просто обобщены подходы к проектированию хорошего софта.

"Рефакторинг" -- +1, но лучше после Реймонда.

Брукса бы вынес в сильно опциональный раздел -- ибо это больше для ПМов, а начинающему программисту вообще заходит весьма тяжело, по своему опыту помню.
"Паттерны проектирования" (не пинайте ногами) тоже оставил бы на потом. Это всё-таки скорее справочник, чем учебник. И ИМХО они при чтении "со старта" способны слишком сильно искалечить мышление, надолго привязав его к парадигме ООП и парализовав другие видения. Но могу ошибаться.

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

master_of_shadows
Маньяк
Сообщения: 199
Зарегистрирован: 06 мар 2004, 19:23
Откуда: Минск
Контактная информация:

Re: Подскажите, плз, куда поступить

Сообщение master_of_shadows »

для начинающего я бы добавил в начало списка Реймонда "Искусство программирования для Unix" -- очень толково и просто обобщены подходы к проектированию хорошего софта.
Ммм, давно читал. Вроде там больше уклон в Юникс.

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

Жаль не помню где писали про ООП: ООП это не абстракция, инкапсуляция, полиморфизм. Это обеъкты, их состояния и сообщения (имзенение состояния). А вот абстракция, инкапсуляци и полиморфизм - чисто мехнизм реализации.
А иксы сносить не стоит всё-таки -- как будешь картинки смотреть, pdf-ы с экрана читать и по сайтам с аяксом ходить?
Одназначно не стоит. Глаза дороже :).
[Ubuntu 8.10] @ home PC & MSI Wind

...take a look at the sky, just before you die...

Аватара пользователя
grub
Неотъемлемая часть форума
Сообщения: 849
Зарегистрирован: 13 сен 2006, 10:29
Откуда: Минск
Контактная информация:

Re: Подскажите, плз, куда поступить

Сообщение grub »

Ещё не стоит забывать, что ты живёшь свою жизнь один раз. Не стоит тратить всё время на программирование. Но если нравиться - то вперёд
+1, но в то же время все мы так или иначе работаем, чтобы выжить (кроме детей олигархов и редких в наше время детей цветов).

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

Аватара пользователя
Пуговица
Интересующийся
Сообщения: 62
Зарегистрирован: 08 июл 2007, 23:10
Откуда: Минск
Контактная информация:

Re: Подскажите, плз, куда поступить

Сообщение Пуговица »

Спасибо большое за заботу, но меня в этом кое-что отпугивает.

Во-первых, меня притягивает ООП, хотя и понимаю, что unix-системы без процедурного программирования не существуют, а во-вторых, я не хочу рассыпаться по всему подряд. Мне кажется, что у подавляющего числа линксоводов это как раз самая распространённая черта)) Вы хотите заниматься всем :)

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

Только не предлагайте лисп ;)
Всё пришито накрепко суровыми нитками.

master_of_shadows
Маньяк
Сообщения: 199
Зарегистрирован: 06 мар 2004, 19:23
Откуда: Минск
Контактная информация:

Re: Подскажите, плз, куда поступить

Сообщение master_of_shadows »

Ядро максимально усечённое мне нужно с вполне определённой целью - я хочу максимально отрезать всё лишнее,
VirtualBox спасёт отца русской демократии ;).
[Ubuntu 8.10] @ home PC & MSI Wind

...take a look at the sky, just before you die...

kreol
Увлекающийся
Сообщения: 99
Зарегистрирован: 02 июл 2007, 20:38
Откуда: Минск

Re: Подскажите, плз, куда поступить

Сообщение kreol »

Пуговица писал(а):Только не предлагайте лисп ;)
Айайай, а почему же? =) Язык из разряда тех, которые даже если не используешь, знать или хотя бы иметь представление надо. К тому же, есть множество литературы с примерами на Лиспе, которые затем можно использовать повсеместно. Пример - уже упомянутый здесь SICP (к слову, подходит для начинающих, очень даже). И сам язык, и конкретно эта книга очень конкретно поднимают уровень программирования. Даже если вы пишете утилиты для ядра ОС.
Во-первых, меня притягивает ООП, хотя и понимаю, что unix-системы без процедурного программирования не существуют
ООП в том виде, в котором чаще всего используется сейчас, - это и есть процедурное программирование. Вернее модульное. Единственная действительно ценная вещь, которую привнесло ООП в такие языки как С++ - это наследование и вытекающий из него полиморфизм, что отлично подходит для моделирования сообщений (не знаю, как в *никсах, но в винде оконные сообщения, например, передаются тупо как блоки памяти - wParam и lParam, из которых нужную информацию приходиться выделять руками, с использованием наследования можно создать класс Message и все типы сообщений наследовать от него, обеспечивая совместимость с приёмником). Изначальная идея ООП была в том, чтобы вызывать одним именем различные методы в зависимости от типа данных, к которому они применяются. Но приличную реализацию такого принципа я пока видел только в Хаскелле, а что касается того же С++, то
Alan Kay писал(а):I invented the term object oriented, and I can tell you that C++ wasn't what I had in mind.
Поэтому, для начала определитесь, что вам нравится в ООП - может оно уже есть и в других, не объектно-ориентированных языках?
Пуговица писал(а):Распределённые системы, кластеры мне очень интересны! Ядро максимально усечённое мне нужно с вполне определённой целью - я хочу максимально отрезать всё лишнее, для того чтобы строить программу, которая будет развиваться и изучать сама себя и окружающую её среду в рамках железа и дискового пространства (пока что при содействии программиста).
Ну это как-то из совсем разных областей. Кластеры - С, ассемблеры; распределённые системы - Erlang (Агнер Эрланг - основатель теории массовго обслуживания), последние версии Винды (как бы кощунственно это не звучало на линуксовском форуме :)). Саморазвитие программы - это уже из области ИИ. Тут уж Пролог и, опять, же Лисп. Хотя как вы собираетесь писать подобные вещи с упором на ядро - я без понятия.

Аватара пользователя
grub
Неотъемлемая часть форума
Сообщения: 849
Зарегистрирован: 13 сен 2006, 10:29
Откуда: Минск
Контактная информация:

Re: Подскажите, плз, куда поступить

Сообщение grub »

+1 к мастеру.

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

Узкая специализация, о которой упоминаешь ты -- это всего лишь самоограничение объема знаний и путей развития. Оно имеет смысл в разумных дозах. Однако если такое самоограничение возводить в догму -- результатом будет лишь неспособность решить любую проблему, лежащую на границах твоего знания. Либо отчаянные попытки свести ее к известным схемам независимо от их полезности для решения данной проблемы. Кстати, без обид, но "самообучающаяся система, лисп не предлагать" -- хорошая иллюстрация данной ситуации. :)

Настоящая узкая специализация у профессионалов -- это когда человек владеет многим, а специализируется в чем-то одном (что ему интереснее всего решать/лучше, чем у других получается).

Но опять таки, что и как делать -- это тебе решать. Главное -- заниматься тем, что интересно и к чему лежит душа.

Аватара пользователя
Пуговица
Интересующийся
Сообщения: 62
Зарегистрирован: 08 июл 2007, 23:10
Откуда: Минск
Контактная информация:

Re: Подскажите, плз, куда поступить

Сообщение Пуговица »

kreol писал(а):Айайай, а почему же? =) Язык из разряда тех, которые даже если не используешь, знать или хотя бы иметь представление надо. К тому же, есть множество литературы с примерами на Лиспе, которые затем можно использовать повсеместно.
Дело даже не в сложности языка, а в сложности _самостоятельного_ изучения этого языка. Я человекозависимый в некоторых начинаниях, особенно в тех, что касаются того, что уже создано людьми))
kreol писал(а):ООП в том виде, в котором чаще всего используется сейчас, - это и есть процедурное программирование. Вернее модульное. Единственная действительно ценная вещь, которую привнесло ООП в такие языки как С++ - это наследование и вытекающий из него полиморфизм
В том виде, в котором чаще используется, это достаточно неважный подход к программированию, исходя из основополагающей идеи Страуструпа. ООП - это как раз гранулированность кода, а процедурное программирование - это модульность.
kreol писал(а):Ну это как-то из совсем разных областей
Это почему же?.. Grid-системы как раз по большей части и есть пересечение этих "разных" областей :)
kreol писал(а):Саморазвитие программы - это уже из области ИИ. Тут уж Пролог и, опять, же Лисп. Хотя как вы собираетесь писать подобные вещи с упором на ядро - я без понятия.
Если бы все знали, на чём нужно писать сильный ИИ, то уже давно бы написали.
Мне ядро вообще не так уж интересно. Просто свою ось я не потяну, а работать с железом как-то нужно. Поэтому решил вернуться к линуксу, как к платформе для развития ИИ. Язык с++, а не лисп (что традиционно используется для таких целей) выбран из-за возможности свободно перемещаться по уровням от асма (а через костыль - и от машинного кода) до того же лиспа (когда он станет необходимым). Удалить лишнее мне необходимо, поскольку хочу расчистить пространство для обучения. Ядро хорошо защищено, поэтому за него можно не волноваться, а иксы и прочие некритичные части оси будут отъедены как экспериментально изучаемые самим ИИ. Поэтому я бы хотел отделить котлеты от мух, чтобы видеть на чём конкретно проводится обучение. ИИ здесь рассматривается не как часть ядра, но как пользовательское приложение.
Всё пришито накрепко суровыми нитками.

Аватара пользователя
Пуговица
Интересующийся
Сообщения: 62
Зарегистрирован: 08 июл 2007, 23:10
Откуда: Минск
Контактная информация:

Re: Подскажите, плз, куда поступить

Сообщение Пуговица »

grub писал(а):Кстати, без обид, но "самообучающаяся система, лисп не предлагать" -- хорошая иллюстрация данной ситуации. :)
Мне известны основные идеи лиспа, и именно поэтому я и выбрал другой язык.
А на счёт ограниченности... Я же хочу на курсы пойти!.. Я не от всего подряд отказываюсь. Просто у меня своя последовательность в обучении, а у вас своя. Хочу заполнить сразу пробелы в том образовании, которое уже сейчас получаю. Лисп еще впереди, а линукс в программе не предусмотрен вообще. Так может я всё правильно делаю?...

Кстати, нейронные сети, на мой взгляд, не подходят для развития ИИ, в силу абсолютного несоответствия своей элементарной природе. Перцептрон для решения большой задачи уже не подходит. Плюс ко всему (кпд строго алгоритма)>=(кпд нейронной сети). Таких примеров много, когда движение куда-то связано только с тем, что "все туда идут".
Всё пришито накрепко суровыми нитками.

kreol
Увлекающийся
Сообщения: 99
Зарегистрирован: 02 июл 2007, 20:38
Откуда: Минск

Re: Подскажите, плз, куда поступить

Сообщение kreol »

Пуговица писал(а):Дело даже не в сложности языка, а в сложности _самостоятельного_ изучения этого языка. Я человекозависимый в некоторых начинаниях, особенно в тех, что касаются того, что уже создано людьми))
http://gigamonkeys.com/book/
http://mitpress.mit.edu/sicp/full-text/book/book.html
Первой книги вполне достаточно, чтобы получить конкретные знания по одному из самых распространённых диалектов Лиспе - Common Lisp, вторая, написанная на другом, академическом диалекте - Scheme, показывает все плюсы программирования на этом языке. В принципе, этих 2-х книг достаточно, чтобы понять, насколько абстрактные модели можно описывать прямо в терминах языка и, соответственно, насколько просто решаются сложные для других языков задачи. Обе читаются легко и с удовольствием :wink:
ООП - это как раз гранулированность кода, а процедурное программирование - это модульность.
Что вы подразумеваете под гранулированностью кода?
Это почему же?.. Grid-системы как раз по большей части и есть пересечение этих "разных" областей :)
Пардон, не о тех кластерах подумал :)
Если бы все знали, на чём нужно писать сильный ИИ, то уже давно бы написали.
http://www.rsdn.ru/Forum/message/1271544.flat.1.aspx
Не про ИИ, правда, но аналогию, я думаю, поймёте.
Поэтому решил вернуться к линуксу, как к платформе для развития ИИ. Язык с++, а не лисп (что традиционно используется для таких целей) выбран из-за возможности свободно перемещаться по уровням от асма (а через костыль - и от машинного кода) до того же лиспа (когда он станет необходимым).
Мне кажется, вы смешиваете вместе две совершенно разные области - системное программирование (асм, Си, уровень ядра) и искусственный интеллект. Я просто не могу понять, как вы собираетесь подавать информацию на вход своей программе, как строить базы знаний, каким образом программа будет обучаться и принимать решения? И чем полноценное ядро мешает развитию ИИ?
Кстати, нейронные сети, на мой взгляд, не подходят для развития ИИ, в силу абсолютного несоответствия своей элементарной природе. Перцептрон для решения большой задачи уже не подходит.
Это почему?
Плюс ко всему (кпд строго алгоритма)>=(кпд нейронной сети).
Когда-то один из моих бывших преподователей сказал очень правильную мысль: "Сначала реши задачу, а потом уже оптимизируй её, если понадобиться". Пока что, как я понимаю, у вас нет никакой системы, так стоит ли сейчас задумываться о КПД? Оптимизировать даже уже написанный код не так сложно ;)

Аватара пользователя
Пуговица
Интересующийся
Сообщения: 62
Зарегистрирован: 08 июл 2007, 23:10
Откуда: Минск
Контактная информация:

Re: Подскажите, плз, куда поступить

Сообщение Пуговица »

На счёт книг по лиспу, спасибо! Пожалуй, попробую.
kreol писал(а):И чем полноценное ядро мешает развитию ИИ?
Полноценное ядро, по сути ничем. Но всё, что не относится к ядру - это не относится к проекту, следовательно ненужно. ИМХО.
kreol писал(а):
Пуговица писал(а):Кстати, нейронные сети, на мой взгляд, не подходят для развития ИИ, в силу абсолютного несоответствия своей элементарной природе. Перцептрон для решения большой задачи уже не подходит.
Это почему?
Потому что при использовании насыщенного перцептрона рост числа нейронов вызывает экспоненциальный рост числа моделируемых синапсов, а как следствие и числа весовых коэффициентов. Если вспомнить, что обучение происходит через подстройку весовых коэффициентов, то легко увидеть, что время обучения так же будет экспоненциально расти. А так как при моделировании динамично развивающегося ИИ подразумевается, что сеть будет обучаться целому спектру новых задач, то наращивание объёма сети вызовет дефицит ресурсов.
kreol писал(а):Пока что, как я понимаю, у вас нет никакой системы, так стоит ли сейчас задумываться о КПД? Оптимизировать даже уже написанный код не так сложно ;)
о КПД стоит задумываться всегда)) пожалуй, работающая нейронная сеть имеет одно преимущество перед неработающим алгоритмом - она работает, тогда, как алгоритм не работает :)
перевести нейронную сеть в мат.алгоритм - это нетривиальная задача, по сложности эквивалентная обучению нейронной сети руками. наоборот - всегда пожалуйста.

ЗЫ: мы уходим в глубокий оффтоп
Всё пришито накрепко суровыми нитками.

kreol
Увлекающийся
Сообщения: 99
Зарегистрирован: 02 июл 2007, 20:38
Откуда: Минск

Re: Подскажите, плз, куда поступить

Сообщение kreol »

Пуговица писал(а):Полноценное ядро, по сути ничем. Но всё, что не относится к ядру - это не относится к проекту, следовательно ненужно. ИМХО.
В общем, как вы всё это собраетесь реализовывать, я так и не понял, но тема действительно уходит куда-то не туда, так что прекращаю оффтопить :) Если можно, когда у вас что-нибудь получиться, отпишитесь, пожалуйста, было интересно взглянуть :)

Ответить