Привет всем комрадам-коллегам.
Ситуация у меня складывается довольно-таки интересная.
Мне 15 лет. Учусь в десятом классе.
Программированием занимаюсь с 11 лет (спасибо Винграду ).
Сначала была гадость вроде Visual Basic 6.0, затем — HTML, CSS, JavaSсript, попытки овладеть веб-дизайном (не получилось), изучение XML (XSL, XHTML, /X.+/). Параллельно — болезненный переход с VB на VB .NET, освоение базовых принципов ООП, UML, паттерны GoF, рефакторинг. Из технологий — Windows Forms, ADO .NET, ASP .NET на примитивном уровне. Год назад окончательно перешёл на C#. Изучал появившиеся с 2.0 дженерики, игрался с LINQ, ORM в DLinq'е aka LINQ to SQL, забавлялся с Nemerle. Покрутил Ruby, но не прижилось (хотя и впечталило). Заинтересовался ФП.
Перешёл на Linux (пока что Ubuntu) => изучаю Mono, Gtk#, прочее. Пишу менеджер закачек под Mono. Перевожу MonoDevelop на русский язык.
К чему это я? Ах, да.
Куда мне поступать? Вроде бы собираюсь в ИТМО к Парфёнову попасть, но на 100 процентов не уверен. А не уверен вот почему: меня тошнит от алгоритмов, системного программирования, C, Pascal, операторов >> и <<, указателей, оптимизаций, WinAPI и прочего, что в моём понимании непосредственно связано с «программированием» в институте. Знаю, что надо. Самому стыдно, что не знаю, чему равно O(n) для quick sort. Но, к сожалению, как только я пытаюсь в это дело вникнуть, тут же появляется новая технология / проект / идея, которая не даёт мне заниматься этой скукотищей.
Что делать? И куда поступать с моими «новыми» мозгами? По каким книжкам лучше изучать алгоритмы?
Вот вопросы, которые меня сейчас волнуют.
Заранее спасибо .
<offtopic>А с Винграда тут никого, случаем, нет?</offtopic>
4 ноября 2007 в 19:03
Даня, с Винграда есть как минимум один человек .
"Новые" мозги, это, конечно, хорошо Но я бы не рискнул нанимать инженера, который щёлкает неопределённые интегралы но не может сложить дважды два. Посмотри-ка //russian.joelonsoftware.com/Articles/Advicefor... – Спольский не очень продвинутый человек, но пишет просто и доступно. Думаю, вопросов у тебя не осталось?
И, кроме того, нужно решить – хочешь ты стать исполнителем либо Творцом. Если творческая жилка в тебе есть, то у тебя есть и шанс стать не просто "тупым кодером" . Исполнитель вполне может не разбираться в "алгоритмах" и низком уровне. Но Творец обязан думать обо всём одновременно и учитывать всё на этапе проектирования самого высокого уровня – и тут технологии не спасут, т.к. они приходят и уходят, спасут лишь вечные Дейкстра, Вирт, Винер.
Но чтобы просто понять, о чём говорили эти три кита, нужно изучить философию, математику, политологию, биологию, физику, историю, социологию и ещё много разных предметов, а также пройти практику по устройству самых нижних уровней машин, про устройство операционных систем, изучить бОльшую часть существующих и умерших языков программирования, и многое другое.
К сожалению, нет царской дороги к знаниям, и никакие технологии такую дорогу тебе не откроют. Лишь через много лет упорного труда ты сможешь, наконец-то, что-то понять в программировании. И, если к тому времени ещё будут существовать программисты, станешь Творцом.
31 октября 2007 в 19:05
Вношу ясность по поводу Парфенова. Парфенов никого и ничего не затачивает, он декан факультета и его дела – это пожать ручку отличившимся и поставить подпись на приказе об отчислении плохих студентов.
Просто в каждом потоке кафедры КТ находятся человек 5 которые занимаются главным образом олимпиадами, и все остальные которые с 3-4 курса идут работать. Иногда первые 5 тоже входят в число остальных (работа не мешает олимпиадам).
Поскольку победа на олимпиаде более известна чем успехи Васи Пупкина в компании Xсофт, то и родился миф о том что люди там только олимпиадами занимаются.
Кем ты станешь – зависит только от тебя. Там читаются и алгоритмы, и фреймворки.
31 октября 2007 в 10:04
Я тоже знаю олимпиадников, которые не умеют писать хороший код, а умеют только быстро и одноразово строгать правильный код "на выброс"
Но, с другой стороны, я еще не видел человека, который бы писал хороший код и при этом не мог реализовать бинарное дерево. Ни одного не видел. Правда я не так уж многих видел, и в моем окружении _все_ могут реализовать, по крайней мере, бинарное дерево Но и это о чем-то говорит.
Скажем так, у человека, не знающего алгоритмы, нет никаких шансов стать хорошим программистом, пока он их не узнает и не научится придумывать, оценивать и т.п.
Теорию категорий в педивикии лучше не читать, а лучше взять хорошую книжку. На русском языке их, похоже, хрен найдешь – по крайней мере в основных книжных магазинах нет вообще ничего. Я купил через амазон Basic category theory for computer scientists by Benjamin Pierce; она, похоже, очень хорошая и довольно понятная, и упражнения есть. Думаю, ее можно найти в ed2k или торренте.
31 октября 2007 в 0:00
Спасибо всем за ответы!
Математику я люблю и ни в коем случае не считаю её ненужной .
> Я понимаю, что тебе очень интересно их изучать; это потому, что многие из них привносят какую-то новую концепцию в твои знания
Именно! Вот оно . Хочется расширять кругозор (верно, дело в моей базовой ЧИ).
> прочитай "Структуру и интерпретацию компьютерных программ" Абельсона и Сассмана
Как раз что-то подобное (судя по описанию) я и искал. Куплю.
> Ибо первый может создавать, а второй – только управлять
Создавать? Создавать что? Шансов написать качественную программу (или управлять её написанием) больше у того, кто знает, как писать хороший код, чем у того, кто знает, как реализуются бинарные деревья. Потому что знать, очевидно, надо и то, и другое.
Моя аналогия была нарочито преувеличенной. Я знаю нескольких людей, которые _и не слышали_ о том, как пишутся хорошие программы (а их код ужасен и нечитаем), но зато умеют быстро сортировать строки. И они, что интересно, совершенно не хотят учиться чему-то новому… Впрочем, лучше я пока что откажусь от этой аналогии, т.к. она чересчур провокационная, и, по-видимому, многие думают, что я превозношу умение проектировать.
> Попробуй почитать про теорию категорий, хотя боюсь что это будет все-таки очень тяжело даже тебе.
Видимо, математического аппарата не хватает. Из написанного по этой теме в Википедии ничего не понял.
> сорри! я не понял чем этот код красивее и понятнее? Имхо, совершенно убогий синтаксис.
//rsdn.ru/article/nemerle/Amplifier.xml#EEB
> Парфенов, по-моему больше затачивает ребят на победы в олимпиадах
Вот это мне уже меньше нравится.
З.Ы.
У каждого разный путь развития. Вы от алгоритмов пришли к фреймворкам, я — прихожу от фреймворков к алгоритмам. Вероятно, важную роль в моём я-не-хочу-учить-никаких-алгоритмов-и-нифига-в-них-не-понимаю сыграла школа, а именно, уроки информатики. Ну не смогли меня вовремя этим заинтересовать, главным образом из-за шаблонности мышления учительницы. Сейчас я осознаю свою ошибку и собираюсь "нырнуть" в это. В нужности этих знаний я теперь не сомневаюсь, так что предлагаю не спорить по данному поводу за отсутствием одной из сторон .
30 октября 2007 в 12:04
сорри! я не понял чем этот код красивее и понятнее? Имхо, совершенно убогий синтаксис.
По поводу обсуждения: я знаю кун-фу, карате и другие страшные слова. Все что описано в первом посте это отлично, просто здорово, только это называется background. То есть, у Вас, молодой человек, для Вашего возраста завидный кругозор. Основная фишка это применить этот кругозор в реальном проекте с реальными требованиями пользователей. А так это все равно что учиться кататься на велосипеде, сидя на велотренажере.
Все это я к чему… С точки зрения знаний в принципе пофиг куда идти учиться, важно куда пойти работать. Хотя конечно я бы посоветовал мат-мех – там голову правильно сворачивают. Парфенов, по-моему больше затачивает ребят на победы в олимпиадах, по-крайней мере было так когда я туда поступал.
30 октября 2007 в 11:00
Насчет "дикой убежденности" – да, код на Ruby красивше. Но это не имеет отношения к алгоритмам.
Тебя никто не заставляет думать так как думает машина, но знать, как именно выполняется твой код на низком уровне – действительно очень важно. Иначе ты будешь без зазрения совести писать конкатенацию строк в цикле, использовать в хаскелле foldl вместо foldl'/foldr и т.п. Да и если ты собираешься написать что-то серьезное, а не просто "спроектировать архитектуру" и наплевать на реализацию, то о производительности задуматься придется с самого начала. Вообще, почитай в гугле про "дырявые абстракции" (leaky abstractions).
Согласен с кем-то из предыдущих ораторов, что ты, кажется, чрезмерно увлечен новыми фреймворками и языками. Можно, конечно, просто пользоваться чужими инструментами и учиться только комбинировать их по-разному – но это и есть кодерство, а не программирование.
Я понимаю, что тебе очень интересно их изучать; это потому, что многие из них привносят какую-то новую концепцию в твои знания – императивщина (Basic/C/Pascal/…), разметка (HTML/XML/..), декларативщина (CSS, SQL, XSL), функциональщина (местами Ruby, LINQ), ООП… Но есть способ сделать то же самое гораздо лучше, глубже, интереснее и быстрее: Мой тебе совет – прочитай "Структуру и интерпретацию компьютерных программ" Абельсона и Сассмана. Она прочищает мозги, знакомит со всеми основными принципами программирования – императивное, функциональное, объектное, логическое, параллельное, декларативное, data-flow и т.п. и, главное, дает понять, как это все работает. Поняв, что все эти концепции – это не "что-то, что сделали чужие дяди и теперь можно на этом писать", а что-то продуманное, с теоретической основой, понятное, реализуемое, _изменяемое_ – ты сможешь сам создавать концепции под свои нужды, вот это-то уже по-настоящему интересно.
Она безумно интересна и если у тебя хватает мозгов ее понять, то от нее будет за уши не оттащить, зуб даю. И в ней не используется ни одной библиотеки, не пишется ни одного GUI или веб-страницы, и т.п., это программирование в чистом и первозданном виде.
После нее все новые фреймворки оказываются как на ладони: микрософт расхваливает linq, а это всего-навсего лямбда-исчисление; кто-то с пеной у рта объясняет как работают виртуальные функции, а объект это всего-навсего замыкание.
Она лежит на //mitpress.mit.edu/sicp/ по-английски и продается в магазинах на русском языке. Если не найдешь – я сам буду очень рад дать тебе ее почитать, у меня есть.
Однако в этой книжке почти не описываются стандартные алгоритмы и структуры данных; для этого подойдет Вирт или Кормен. Если хорошенько изучить их, то выяснится, что и там много общих концепций; как на ладони окажутся вещи более низкого уровня – не целые фреймворки, а их низкоуровневая реализация. Хэш-таблица в java перестанет быть загадочной штуковиной, которая обеспечивает быстрый поиск и перестает работать если допустить малейшую ошибку в hashCode.
Насчет математики еще – по-моему, самое важное в математике – не теоремы, а терминология. Если вместо "ассоциативна" говорить/думать "такова, что в последовательности операций скобки можно расставлять в другом порядке", а вместо "является моноидом" говорить "у операции конкатенации скобки можно расставлять в любом порядке, а если сложить с пустой строчкой слева или справа, то получится то же самое", то сам понимаешь, насколько снижается продуктивность мысли; в голове можно держать лишь ограниченное количество терминов одновременно, и чем эти термины более емкие, тем лучше. Математика для мозга – как функциональное программирование для программы. Попробуй почитать про теорию категорий, хотя боюсь что это будет все-таки очень тяжело даже тебе.
30 октября 2007 в 11:00
Да, и про agile: человек, способный реализовать бинарное дерево – как минимум так же важен, как человек, знакомый с agile, а скорее всего – гораздо более важен. Ибо первый может создавать, а второй – только управлять.
30 октября 2007 в 0:00
Я думаю, что если ты хочешь научиться действительно программировать или хотябы научиться составлять алгоритмы, то тебе не надо гнаться за новыми языками программирования, технологиями и разными реализациями данных. Начни с чего-нибудь простого (pascal, basic, c и т.д), где нет этих наваротов, и изучай этот язык. В этих языках все какраз построенно на алгоритмах, и ненадо говорить типо это все старьё, изучать эти языки гораздо легче, чем многии другие в наше время. Составлять алгоритмы потом где угодно будет проще. По себе знаю, за 2 года я изучил pascal, delphi, html,c/c++(вкрации), assembler, basic, и сейчас изучаю ruby, и это тока среди довольно извесных языков программирования. (А я всего лишь на 3 курсе, и мне 16 лет)
29 октября 2007 в 21:04
а в итмище у Парфенова не только алгоритмы изучают. джавы с дотнетами входят в программу, да.
Но алгоритмы всеж таки главным образом, да.
Можешь идти к нам, на ИС (несмотри что кафедра физики – это бюрократия, спец-тьинформационные системы и технологии) – у нас меньше алгоритмов и математики и больше всяких слов на тему информационных систем.
Но математика – это язык, это не инструмент. Вообще говоря 1ый курс у хорошего препода излечивает мысли на тему ненужности математики для программиста.
Твоя проблема это то что ты гонишься за фреймворками. Завтра MSвыпустит дотда и половина дотнетчиков пойдет нах =). А серьезные люди они сначала переждут рекламные вопли а потом пересядут когда им потребуются новые возможности.
Так вот чтобы стать серьезным человеком – учи математику. Для поступления так же архиполезно.
Математика придает мыслям стройность. А построение красивой архитектуры приложения – без разницы в рамках какого процесса – это и есть воплощение стройными мыслями красивого мира.
29 октября 2007 в 18:02
2 Даня ☯☯☯ Абрамов
<
Кто был бы полезнее в среднестатистическом проекте по разработке прикладного ПО: человек, знакомый с agile development, XP и т.п. или человек, знающий, как реализуется бинарное дерево?
>
Вообще-то, знание реализации бинарного дерева совсем не помешает, а вот знание методологий разработки ПО (Agile, XP) – дело наживное. Представь себе, что по задаче тебе требуется использовать какой-нибудь тип дерева, а в используемой платформе его реализации нет – что делать? Выходов два – либо искать реализацию под нужную платформу, либо реализовывать самому, а если реализации нет, то возникнут проблемы, придётся либо просить сделать другого сотрудника, либо лихорадочно искать описание алгоритма и разбираться в нём в сжатые сроки.
У меня сложилось впечатление, что ты противопоставляешь проектирование архитектуры проекта (модули, классы и т.п.) разработке алгоритмов, а ведь эти вещи идут рука об руку – без нормально спроектированной архитектуры ПО потонет в потоке багов и никакие алгоритмы его не спасут, а без оптимизированных алгоритмов дажде самая лучшая архитектура будет тормозить.
Про книжки:
По алгоритмам много всего написано, начиная с того же Н. Вирта и заканчивая Д .Кнутом – выбор большой (если нужно, могу посмотреть что есть дома и по спискам литературы пороюсь – озвучу список).
Я бы ещё посоветовал, помимо чтения книжек по теории взять какой-нибудь задачник и делать задания из него – это будет намного полезнее, чем чтение голой теории.
P.S.
O большое для Quicksort равно всреднем O(n*lon(n)), а в худшемслучае O(n^2)
29 октября 2007 в 17:03
Вирт
29 октября 2007 в 16:04
Работать ещё ой как рано . Потому что опыта работы в команде нет (сейчас это стараюсь восполнять).
> то, что описывашь никак на программиста не тянет
Соглашусь: без знаний алгоритмов — это как занимающемуся высшей математикой не знать арифметику.
Не соглашусь: как раз именно пресловутые «кодеры» обычно и учатся на всяких Pascal'ях, знают алгоритмы, но почему-то просто не в состоянии понять и оценить более продвинутые (ну или не продвинутые, но просто *другие* вещи). Для разработчика (не кодера), как мне кажется, важнее знать не самый быстрый алгоритм для сортировки массива чисел, а уметь выделить нужные сущности и правильно спроектировать приложение. Я ни в коем случае не отрицаю необходимость знания алгоритмов (а при решении некоторых задач без него никак), а просто сравниваю его приоритетность с другими областями знаний, связанными с программированием. Кто был бы полезнее в среднестатистическом проекте по разработке прикладного ПО: человек, знакомый с agile development, XP и т.п. или человек, знающий, как реализуется бинарное дерево?
Чтобы не спровоцировать холивар, повторюсь: естественно, я буду учить алгоритмы. Но где мне найти литературу, которая меня этим увлечёт? Читать GoF было увлекательно. Читать «Совершенный код» было увлекательно. Даже Троелсена было очень интересно читать. А книжки по алгоритмам?..
29 октября 2007 в 15:05
то, что описывашь никак на программиста не тянет. если хочется и дальше оставаться кодером, то, конечно, ничего из мат базы, алгоритмов, логики и тп учить не надо.
Ко всему этому, надо сначала опробовать институт, чтобы говорить о нем. Всегда можно со всеми договориться
29 октября 2007 в 15:03
Даня ☯☯☯ Абрамов, тожебесит, когда меня заставляют думать так, как думает машина" ))))))))
из-за этого пропадает тяга к мышлению!
29 октября 2007 в 14:05
одназначно, крут
думаю, никуда не надо идти учиться,
а скорей уже начинать работать
поскольку знаний уже просто вагон
а пробелы можно по ходу восполнять,
по мере необходимости
и успех обеспечен!
29 октября 2007 в 14:02
По поводу алгоритмов.
У меня какая-то дикая внутренняя убеждённость, что
def someList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
def isEven (num) { num % 2 == 0 }
def sumEvens (list) {
““head :: tail => (if isEven (head) head else 0) + sum (tail)
““[] => 0
}
def evenSum = sumEvens (someList); // 30
выглядит гораздо лаконичнее и прикольнее, чем
int[] someArray = new int[10] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int evenSum = 0;
for (int i = 0; i < 10; i++) {
““if (someArray[i]% 2 == 0) evenSum += someArray[i];
}
Про
def someList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
def evenSum = someList.Filter (_ % 2 == 0).FoldLeft (0, _ + _);
я вообще промолчу, т.к. меня не поймут .
Да, первый вариант (как и третий ) на первый взгляд менее понятен, но второй какой-то.. уродливый. Очень рад тому, что C# 3.0 движется в нужном направлении (хотя и через жопу).
Так вот: меня бесит, когда меня заставляют думать так, как думает машина. То есть, я, конечно, могу этим заниматься, но это не приносит мне того удовольствия, которое я получаю, когда абстрагируюсь от того, *как* мой код выполняется . Вот такой я теоретик.
Но изучать, конечно же, надо. Думаю на неделе съездить в Дом Книги, подзакупиться…
29 октября 2007 в 12:04
Чувак, похоже, ты крут
Вот только от алгоритмов очень зря тошнит, теория несравненно важнее и интереснее технологий. Очень странно: казалось бы, с твоими мозгами от математики и алгоритмов ты должен получать оргазм за оргазмом, тем более что еще и ФП заинтересовался – там же сплошные мозговыверты, теория категорий, все дела.
В общем, к Парфенову, видимо, идти стоит. Или в Универ на матмех или еще куда. Я еще понимаю, что от WinAPI тошнит, но там и очень интересные вещи рассказываются очень крутыми людьми, судя по опыту моих знакомых, учащихся там.
29 октября 2007 в 3:03
весьма впечатлило сообщение. Вы отжигаете.
29 октября 2007 в 3:03
а алгоритмы по Вирту изучать