singlepost

Учиться… а куда? << На главную или назад  

Привет всем комрадам-коллегам.
Ситуация у меня складывается довольно-таки интересная.
Мне 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>

121 ответов в теме “Учиться… а куда?”

  1. 19
    Константин Смотритель ответил:

    Даня, с Винграда есть как минимум один человек :-) .

    "Новые" мозги, это, конечно, хорошо ;-) Но я бы не рискнул нанимать инженера, который щёлкает неопределённые интегралы но не может сложить дважды два. Посмотри-ка //russian.joelonsoftware.com/Articles/Advicefor... – Спольский не очень продвинутый человек, но пишет просто и доступно. Думаю, вопросов у тебя не осталось? ;-)

    И, кроме того, нужно решить – хочешь ты стать исполнителем либо Творцом. Если творческая жилка в тебе есть, то у тебя есть и шанс стать не просто "тупым кодером" ;-) . Исполнитель вполне может не разбираться в "алгоритмах" и низком уровне. Но Творец обязан думать обо всём одновременно и учитывать всё на этапе проектирования самого высокого уровня – и тут технологии не спасут, т.к. они приходят и уходят, спасут лишь вечные Дейкстра, Вирт, Винер.

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

    К сожалению, нет царской дороги к знаниям, и никакие технологии такую дорогу тебе не откроют. Лишь через много лет упорного труда ты сможешь, наконец-то, что-то понять в программировании. И, если к тому времени ещё будут существовать программисты, станешь Творцом.

  2. 18
    Евгений Михайлин ответил:

    Вношу ясность по поводу Парфенова. Парфенов никого и ничего не затачивает, он декан факультета и его дела – это пожать ручку отличившимся и поставить подпись на приказе об отчислении плохих студентов.
    Просто в каждом потоке кафедры КТ находятся человек 5 которые занимаются главным образом олимпиадами, и все остальные которые с 3-4 курса идут работать. Иногда первые 5 тоже входят в число остальных (работа не мешает олимпиадам).
    Поскольку победа на олимпиаде более известна чем успехи Васи Пупкина в компании Xсофт, то и родился миф о том что люди там только олимпиадами занимаются.
    Кем ты станешь – зависит только от тебя. Там читаются и алгоритмы, и фреймворки.

  3. 17
    Жека Кирпичев ответил:

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

    Теорию категорий в педивикии лучше не читать, а лучше взять хорошую книжку. На русском языке их, похоже, хрен найдешь – по крайней мере в основных книжных магазинах нет вообще ничего. Я купил через амазон Basic category theory for computer scientists by Benjamin Pierce; она, похоже, очень хорошая и довольно понятная, и упражнения есть. Думаю, ее можно найти в ed2k или торренте.

  4. 16
    Alexey Sepotok ответил:

    Спасибо всем за ответы!

    Математику я люблю и ни в коем случае не считаю её ненужной :) .

    > Я понимаю, что тебе очень интересно их изучать; это потому, что многие из них привносят какую-то новую концепцию в твои знания
    Именно! Вот оно :) . Хочется расширять кругозор (верно, дело в моей базовой ЧИ).

    > прочитай "Структуру и интерпретацию компьютерных программ" Абельсона и Сассмана
    Как раз что-то подобное (судя по описанию) я и искал. Куплю.

    > Ибо первый может создавать, а второй – только управлять
    Создавать? Создавать что? Шансов написать качественную программу (или управлять её написанием) больше у того, кто знает, как писать хороший код, чем у того, кто знает, как реализуются бинарные деревья. Потому что знать, очевидно, надо и то, и другое.
    Моя аналогия была нарочито преувеличенной. Я знаю нескольких людей, которые _и не слышали_ о том, как пишутся хорошие программы (а их код ужасен и нечитаем), но зато умеют быстро сортировать строки. И они, что интересно, совершенно не хотят учиться чему-то новому… Впрочем, лучше я пока что откажусь от этой аналогии, т.к. она чересчур провокационная, и, по-видимому, многие думают, что я превозношу умение проектировать.

    > Попробуй почитать про теорию категорий, хотя боюсь что это будет все-таки очень тяжело даже тебе.
    Видимо, математического аппарата не хватает. Из написанного по этой теме в Википедии ничего не понял.

    > сорри! я не понял чем этот код красивее и понятнее? Имхо, совершенно убогий синтаксис.
    //rsdn.ru/article/nemerle/Amplifier.xml#EEB

    > Парфенов, по-моему больше затачивает ребят на победы в олимпиадах
    Вот это мне уже меньше нравится.

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

  5. 15
    Сергей Куршев ответил:

    сорри! я не понял чем этот код красивее и понятнее? Имхо, совершенно убогий синтаксис.
    По поводу обсуждения: я знаю кун-фу, карате и другие страшные слова. Все что описано в первом посте это отлично, просто здорово, только это называется background. То есть, у Вас, молодой человек, для Вашего возраста завидный кругозор. Основная фишка это применить этот кругозор в реальном проекте с реальными требованиями пользователей. А так это все равно что учиться кататься на велосипеде, сидя на велотренажере.

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

  6. 14
    Жека Кирпичев ответил:

    Насчет "дикой убежденности" – да, код на 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.

    Насчет математики еще – по-моему, самое важное в математике – не теоремы, а терминология. Если вместо "ассоциативна" говорить/думать "такова, что в последовательности операций скобки можно расставлять в другом порядке", а вместо "является моноидом" говорить "у операции конкатенации скобки можно расставлять в любом порядке, а если сложить с пустой строчкой слева или справа, то получится то же самое", то сам понимаешь, насколько снижается продуктивность мысли; в голове можно держать лишь ограниченное количество терминов одновременно, и чем эти термины более емкие, тем лучше. Математика для мозга – как функциональное программирование для программы. Попробуй почитать про теорию категорий, хотя боюсь что это будет все-таки очень тяжело даже тебе.

  7. 13
    Жека Кирпичев ответил:

    Да, и про agile: человек, способный реализовать бинарное дерево – как минимум так же важен, как человек, знакомый с agile, а скорее всего – гораздо более важен. Ибо первый может создавать, а второй – только управлять.

  8. 12
    Данила Сергеев ответил:

    Я думаю, что если ты хочешь научиться действительно программировать или хотябы научиться составлять алгоритмы, то тебе не надо гнаться за новыми языками программирования, технологиями и разными реализациями данных. Начни с чего-нибудь простого (pascal, basic, c и т.д), где нет этих наваротов, и изучай этот язык. В этих языках все какраз построенно на алгоритмах, и ненадо говорить типо это все старьё, изучать эти языки гораздо легче, чем многии другие в наше время. Составлять алгоритмы потом где угодно будет проще. По себе знаю, за 2 года я изучил pascal, delphi, html,c/c++(вкрации), assembler, basic, и сейчас изучаю ruby, и это тока среди довольно извесных языков программирования. (А я всего лишь на 3 курсе, и мне 16 лет)

  9. 11
    Евгений Михайлин ответил:

    а в итмище у Парфенова не только алгоритмы изучают. джавы с дотнетами входят в программу, да.
    Но алгоритмы всеж таки главным образом, да.
    Можешь идти к нам, на ИС (несмотри что кафедра физики – это бюрократия, спец-тьинформационные системы и технологии) – у нас меньше алгоритмов и математики и больше всяких слов на тему информационных систем.
    Но математика – это язык, это не инструмент. Вообще говоря 1ый курс у хорошего препода излечивает мысли на тему ненужности математики для программиста.
    Твоя проблема это то что ты гонишься за фреймворками. Завтра MSвыпустит дотда и половина дотнетчиков пойдет нах =). А серьезные люди они сначала переждут рекламные вопли а потом пересядут когда им потребуются новые возможности.
    Так вот чтобы стать серьезным человеком – учи математику. Для поступления так же архиполезно.
    Математика придает мыслям стройность. А построение красивой архитектуры приложения – без разницы в рамках какого процесса – это и есть воплощение стройными мыслями красивого мира.

  10. 10
    Александр Пинский ответил:

    2 Даня ☯☯☯ Абрамов

    <
    Кто был бы полезнее в среднестатистическом проекте по разработке прикладного ПО: человек, знакомый с agile development, XP и т.п. или человек, знающий, как реализуется бинарное дерево?
    >
    Вообще-то, знание реализации бинарного дерева совсем не помешает, а вот знание методологий разработки ПО (Agile, XP) – дело наживное. Представь себе, что по задаче тебе требуется использовать какой-нибудь тип дерева, а в используемой платформе его реализации нет – что делать? Выходов два – либо искать реализацию под нужную платформу, либо реализовывать самому, а если реализации нет, то возникнут проблемы, придётся либо просить сделать другого сотрудника, либо лихорадочно искать описание алгоритма и разбираться в нём в сжатые сроки.

    У меня сложилось впечатление, что ты противопоставляешь проектирование архитектуры проекта (модули, классы и т.п.) разработке алгоритмов, а ведь эти вещи идут рука об руку – без нормально спроектированной архитектуры ПО потонет в потоке багов и никакие алгоритмы его не спасут, а без оптимизированных алгоритмов дажде самая лучшая архитектура будет тормозить.

    Про книжки:
    По алгоритмам много всего написано, начиная с того же Н. Вирта и заканчивая Д .Кнутом – выбор большой (если нужно, могу посмотреть что есть дома и по спискам литературы пороюсь – озвучу список).
    Я бы ещё посоветовал, помимо чтения книжек по теории взять какой-нибудь задачник и делать задания из него – это будет намного полезнее, чем чтение голой теории.

    P.S.
    O большое для Quicksort равно всреднем O(n*lon(n)), а в худшемслучае O(n^2) ;)

  11. 9
    Антон Чапоргин ответил:

    Вирт :(

  12. 8
    Alexey Sepotok ответил:

    Работать ещё ой как рано :) . Потому что опыта работы в команде нет (сейчас это стараюсь восполнять).

    > то, что описывашь никак на программиста не тянет
    Соглашусь: без знаний алгоритмов — это как занимающемуся высшей математикой не знать арифметику.
    Не соглашусь: как раз именно пресловутые «кодеры» обычно и учатся на всяких Pascal'ях, знают алгоритмы, но почему-то просто не в состоянии понять и оценить более продвинутые (ну или не продвинутые, но просто *другие* вещи). Для разработчика (не кодера), как мне кажется, важнее знать не самый быстрый алгоритм для сортировки массива чисел, а уметь выделить нужные сущности и правильно спроектировать приложение. Я ни в коем случае не отрицаю необходимость знания алгоритмов (а при решении некоторых задач без него никак), а просто сравниваю его приоритетность с другими областями знаний, связанными с программированием. Кто был бы полезнее в среднестатистическом проекте по разработке прикладного ПО: человек, знакомый с agile development, XP и т.п. или человек, знающий, как реализуется бинарное дерево?
    Чтобы не спровоцировать холивар, повторюсь: естественно, я буду учить алгоритмы. Но где мне найти литературу, которая меня этим увлечёт? Читать GoF было увлекательно. Читать «Совершенный код» было увлекательно. Даже Троелсена было очень интересно читать. А книжки по алгоритмам?..

  13. 7
    Станислав Лысиков ответил:

    то, что описывашь никак на программиста не тянет. если хочется и дальше оставаться кодером, то, конечно, ничего из мат базы, алгоритмов, логики и тп учить не надо.
    Ко всему этому, надо сначала опробовать институт, чтобы говорить о нем. Всегда можно со всеми договориться ;)

  14. 6
    Иван Лузинов ответил:

    Даня ☯☯☯ Абрамов, тожебесит, когда меня заставляют думать так, как думает машина" ))))))))
    из-за этого пропадает тяга к мышлению!

  15. 5
    Дмитрий Гайдамович ответил:

    одназначно, крут
    думаю, никуда не надо идти учиться,
    а скорей уже начинать работать
    поскольку знаний уже просто вагон
    а пробелы можно по ходу восполнять,
    по мере необходимости
    и успех обеспечен!

  16. 4
    Alexey Sepotok ответил:

    По поводу алгоритмов.
    У меня какая-то дикая внутренняя убеждённость, что

    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 движется в нужном направлении (хотя и через жопу).

    Так вот: меня бесит, когда меня заставляют думать так, как думает машина. То есть, я, конечно, могу этим заниматься, но это не приносит мне того удовольствия, которое я получаю, когда абстрагируюсь от того, *как* мой код выполняется :) . Вот такой я теоретик.
    Но изучать, конечно же, надо. Думаю на неделе съездить в Дом Книги, подзакупиться…

  17. 3
    Жека Кирпичев ответил:

    Чувак, похоже, ты крут :)
    Вот только от алгоритмов очень зря тошнит, теория несравненно важнее и интереснее технологий. Очень странно: казалось бы, с твоими мозгами от математики и алгоритмов ты должен получать оргазм за оргазмом, тем более что еще и ФП заинтересовался – там же сплошные мозговыверты, теория категорий, все дела.
    В общем, к Парфенову, видимо, идти стоит. Или в Универ на матмех или еще куда. Я еще понимаю, что от WinAPI тошнит, но там и очень интересные вещи рассказываются очень крутыми людьми, судя по опыту моих знакомых, учащихся там.

  18. 2
    Антон Чапоргин ответил:

    весьма впечатлило сообщение. Вы отжигаете.

  19. 1
    Антон Чапоргин ответил:

    а алгоритмы по Вирту изучать

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.