Математика и секс
Июнь 28th, 2014

Кто хочет стать программистом?

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

Обычный карьерный путь человека в IT выглядит так: он поступает в технический ВУЗ на любую специальность, ему пять лет капают в мозг всякой чушью, но среди этой чуши он начинает понимать как писать циклы while и условия if. Если ВУЗ топовый, то он узнает что такое классы и объекты. В качестве очень редких исключений можно попасть к хорошему преподавателю на какой-нибудь спецкурс, где тебе расскажут нормально про что-то ещё, например про XML или про то же теситрование или про современный веб, но это редко. В МИФИ, например, когда говорят про HTML, до сих пор рассказывают про тег FONT.

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

Альтернативный подход — это самообразование. К сожалению, это почти никогда не работает. В редких случаях, когда это работает, человек вырастает в куда более хорошего специалиста, нежели он мог бы вырасти окончив институт. Другое дело, что у 99% заниматься самообразованием не получается. Получается, что институт оказывается в общем-то на порядок предпочтительнее самостоятельной учёбы. Полезно понять как именно выглядит неудачный сценарий самообразования.

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

Человек выбирает одну какую-то книгу и начинает её читать. Например, это может быть какая-нибудь книга «Java для начинающих» на 500 страниц текста. После прочтения книги человек узнаёт про все возможные операторы, типы данных, несколько паттернов, но зачастую не может написать ничего сложнее каких-то консольных программ, которые считают числа Фибоначчи. Учитывая, какого труда это ему стоило, человек утверждается в мысли, что программирование это не для него. Конец.

Чем институт оказывается в выигрышном положении? Главным образом он выигрывает в том, что на лекциях дают лишь необходимую выжимку. Вместо чтения 500 страниц по Яве достаточно прослушать несколько которотких лекций (обычно всего навсего 3-4), чтобы уметь делать ровно то же самое и даже больше, чем ты сможешь делать после прочтения книги. Конечно, знания будут обзорными и неглубокими, но начинающему знать что-то глубоко и не нужно. Углубиться можно уже в процессе работы и заробатывания денег.

Институт так же поддерживает темп. Если на лекции были while, if и алгоритмы сортировки, то через неделю надо сдать домашнее задание на эту тему. Конечно, кто-то может скопировать программу из Интернета, кто-то может получить хвост, про который потом все забудут, но само присутствие на лекцией и в лабораторном помещении откладывается в мозгах. По крайней мере даже если студент не делает никаких заданий, он примерно себе представляет как выглядит процесс программирования, как программа компилируется, дебажется и запускается. А это уже половина успеха, даже если программируют на отсталом языке типа Pascal и программируют чушь. Это всё равно навыки программирования, пусть и пассивные.

Следующее важное свойство института, это то что он даёт кругозор. Вопрос новичка обычно выглядит так: «А как мне научиться программировать на Яве?» Человеку после такого вопроса вполне справедливо начинают давать рекомендации по изучанию именно Явы. Мало кому придёт в голову сказать человеку, что чтобы стать программистом, помимо Явы надо знать какие-то алгоритмы, процесс тестирования, системы контроля версий, форматы XML и JSON, HTML, какие-нибудь скриптовые языки, основы криптографии, базы данных, устройства сетей и операционной системы, принципы многопоточного программирования и так далее. Даже не смотря на то, что половина перечисленного легко изучается за неделю, об этом просто никто не скажет, не даст тестового задания или домашнего упражнения. В итоге даже освоив на каком-то уровне Яву человек всё равно не способен писать что-то сложнее совсем тривиальных окошечек.

Российские институты из необходимых навыков дают программисту лишь малую часть и дают её некачественно. Но опять же это полезно — это расширяет кругозор. Даже если в институте рассказали про тег FONT, если вдруг человеку придётся становиться разработчиком под веб, он сможет довольно легко переключиться на новые стандарты. Важно однако что он уже имеет представление в какую сторону хотя бы смотреть. Самоучка в Яве зачастую даже примерно не знает что из себя представляет страничка в Интернете.

Так же очень важным преимуществом института является то, что он создаёт внутри себя некоторое комьюнити. Если студент не понимает почему у него не компилируется «Hello World!», он может всегда спросить об этом у соседа. Если вы учитесь сами по книжкам, то спросить вам как правило неукого. Есть, конечно, форумы, но в большинстве мест, если вы будете задавать много «глупых» вопросов, местные эксперты вам вначале будут кивать на Гугл, потом заминусуют, потом назовут «ламером» и потом забанят. На этом ваше самообучение скорее всего прекратится из-за полной вашей демотивации.

В последнее время появились различные онлайн-курсы, вот эти самые MOOC, которые в самообучении помогают очень здорово. Во-первых, они дают кругозор (не идеальный, но сравнимый с университетским, если вы беретё несколько курсов), во-вторых, они не заставляют читать книжку, а дают вам быструю необходимую выжимку материала, а так же устанавливают дедлайны, что не позволяет вам лениться. В-третьих, они формируют так же как и институт комьюнити, где вас никто не забанит за глупые вопросы. В отличие от института такие курсы так же объясняют что-то современное и реально прикладное, а не доисторичскую чушь типа Pascal или HTML4. Почти идеально.

Однако, MOOC имеет и недостатки. Главный недостаток заключается в том, что у ученика нет куратора, который мог бы направлять процесс обучения. Всё что вы видите — это набор курсов, но вы не знаете какой из них вам надо выбрать и нет человека, который сказал бы вам, что «Курс по „Hadoop” тебе рановато пока брать, научись для начала хотя бы массив сортировать».

Второй недостаток заключается в том, что подход MOOC не индивидуален. Вы можете написать программу, но её никто не проверит и никто вам не скажет: «Да, молодец, всё круто, но вот эта функция берёт на себя слишком много ответственности, лучше бы разбить её на несколько подпроцедур», — а такие комментарии между тем крайне важны, без них стать профессионалом куда сложнее, нежели с ними. Отсюда же следует, что в MOOC вам не дадут на выполнение какие-то большие и сложные проекты, требующие коллективной разработки, понимания архитектуры и должного тестирования. В институтах этого тоже нет, но это решается тем, что на четвёртом курсе вас обычно пихают в какую-нибудь конторку, где вы это всё начинаете потихоньку осваивать.

Помимо MOOC существуют ещё и оффлайновые курсы, но они как правило совершенно неэффективны и максимум могут подготовить вас к сдаче экзамена на какой-нибудь сертификат.

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

По суди единственное, что я могу дать своей девушке — это отвечать на её вопросы, напрявлять на какие-то конкретные учебные материалы, делать код-ревью и давать проекты для самостоятельного выполнения. По идее это не должно отнимать у меня много времени и с тем же успехом я могу учить ни одного человека, а, скажем, десять. И вот у меня родилась мысль начать такой «курс».

Я опишу, как я себе представляю каким образом это всё может выглядеть на практике.

Во-первых, сам курс будет представлять собой закрытый форум (по крайней мере на первое время), на котором будут общаться ученики и учителя. Иногда будут созвоны в скайпе. Еженедельно учителями будут поститься ссылки на учебные материалы и даваться какие-то разъяснения и рекомендации, а так же самостоятельные задания. Решенные задания ученики будут выкладывать для обсуждения другими учителями и учениками. Так будет продолжаться до тех пор, пока из ученика не получится профессионал.

Требования для того, чтобы стать учеником, такие:

1. Вы не должны быть программистом и не должны быть студентом топового технического ВУЗа. Студенты МГТУ, ВШЭ, МИФИ, МФТИ, МГУ не принимаются (хотя если вы сейчас не студент этих вузов, а потом вдруг станете, выгонять мы вас не будем). Речь конечно только о технических специальностях. Этот курс — эксперимент, целью которого является вырастить профессионала с нуля, а не объяснить какую-то одну технологию человеку, который уже что-то знает.

2. Вы должны быть готовы уделять на курс до 14-ти часов в неделю (чаще всего меньше), плюс дополнительно к обязательным заданиям и статьям уделять время на рекомендуемые книги. Про чтение художественной литературы, компьютерные игры и прочую трату времени придётся забыть на какой-то период.

3. Вам потребуется безлимитный Интернет. Регулярно потребуется скачивать различные среды разработки, библиотеки и подобное. Это файлы размером зачастую в несколько сотен мегабайт.

4. Обязательным является изучение английского языка. Иногда вам придётся либо печатать учебники из Интернета, либо покупать их в бумажном виде (не всё что я потребую купить может быть найдено в Сети). Как альтернатива — вы должны будете пойти на курсы английского. Максимум через пол-года курс целиком перейдёт на английский язык, включая общение на форуме. Учебные материалы с первой же недели будут на английском языке (необходимые комментарии будут даны на русском).

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

Так же интересно, если ко мне захотят присоединиться другие учителя. Очень интересны люди, которые:

1. Являются профессионалами Java-разработки.

2. Являются профессионалами веб-разработки.

3. Профессионально занимаются тестированием.

4. Занимаются хантингом программистов и тестировщиков.

5. Веб-дизайнеры и верстальщики.

6. Системные архитекторы.

7. Фрилансеры, которые реально этим зарабатывают и знают как начать фрилансить, найти заказчиков и не боятся научить этому других.

8. Менеджеры в IT, которые знают, как построен процесс разработки приложений с точки зрения бизнеса.

9. Люди, занимающиеся маркетингом в IT.

10. Все прочие люди, профессиональные знания которых, как они считают, могут пригодиться человеку, занятому в IT-сфере.

Учитель должен будет делать всё то что я написал: отвечать каждый день на глупые вопросы на форуме, направлять учащихся на конкретные статьи, давать задания, проверять их. Подход «держите парни 20 книг, как прочитаете, отчитаетесь» не интересен. Каких-то лекций читать не надо, специальных учебных материалов готовить не надо, надо лишь направлять сообучение, указывать конкретные статьи в блогах и на сайтах, конкретные параграфы в книгах. Должна быть постоянная обратная связь, причём проект должен быть длительным. Конечно, если вы хотите рассказать только об одной какой-то теме и на этом закончить, длительным он быть не обязан, но в силу того, что мы не можем давать высокой нагрузки учащимся, даже краткий курс скорее всего окажется более длительным, чем вы ожидаете. Вероятно, кто-то из учителей сможет утолить и корыстный интерес: предложить в качестве домашнего задания реальную задачу для своего бизнеса или найти себе сотрудников, удалённых или настоящих. Учитывая, что на этом курсе скорее всего будут учиться высокомотивированные люди, я думаю, это будут хорошие сотрудники и в итоге специалисты. Ну и учитель, если проект вдруг станет успешным, всегда сможет с гордостью говорить, что это он его таким успешным сделал.

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

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

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

И ещё несколько комментариев о том, что будет в курсе по составу.

1. Не будет жести. Не будет Хаскеля и Лиспа, не будет сложных параллельных алгоритмов, не будет ассемблера и так далее. Для изучения этого куратор нужен куда в меньшей степени и при желании это ученик освоит потом сам. Основная задача — дать основное и вывести человека на уровень успешного прохождения собеседований.

2. Зато будет много надрочки на собеседования. Проходить собеседования — отдельный навык, причём для успешной карьеры чуть ли не самый важный, так что этого будет много.

3. Не будет математики. Ну вернее будет, но только самая тривиальная, чтобы человек хотя бы примерно понимал что такое O-нотация и мог решать задачки на собеседованиях на решето Эратосфена и числа Фибоначчи. Это всё совершенно не нужно IT-специалисту, но бизнес любит такие вопросы при отсеве соискателей. Глупо со стороны бизнеса, но с этим надо считаться.

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

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

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

Учителя получат доступ до форума сразу же, хотя в какой именно момент они начнут доносить свою тему, будет решено совместно по ходу курса.

Желающим стать учениками или учителями, писать мне на почту heller@heller.ru или heller@riseup.net. Если мало ли я не буду вам отвечать в течение двух дней, напишите об этом в комментарии, оба почтовых ящика иногда бывает глючат и не принимают письма.

UPD. Класс уже сформировался, так что новых учеников набирать не будем.

Октябрь 31st, 2013

TheSlowestLisp

В продолжение темы вываливаю еще один мой коротенький проект в открытый доступ: TheSlowestLisp.

В действительности это не LISP, а чудовищный кастрат Scheme, но поскольку большинство людей бесконечно далеки от функционального программирования и не знают что такое Scheme и чем различаются диалекты LISP, я сделал название производным от LISP, что с точки зрения формализма конечно не совсем корректно.

Отличительные особенности реализации:

1. Целью было написать максимально краткую и простую реализацию, не обращая внимания на то «как правильно». Весь проект был написан за вечер.

2. Еще одной целью было интенсивное использование нового стандарта C++11. Он, правда, используется довольно половинчато, т.к. я писал под MSVC2010, а там многие вещи не поддерживаются (из-за этого в коде много некрасивых for; поскольку std::for_each всё равно по сути сменяется новым range-based-for, я решил не использовать именно для него STL).

3. Обозначенные причины делают мою реализацию крайне медленной.

4. Функционал очень сильно кастрирован. Реализация построена таким образом, что расширение её представляется крайне простым занятием, то есть каждый может доточить этот LISP под себя. Исключение составляют пожалуй только макросы и континуации, которые так просто тут не реализуешь (об этом чуть ниже), а так же всякие специальные символы типа ‘, ` и ,.

5. Во много это переложение Lispy на C++, хотя нельзя сказать, что всё совсем уж такое же — C++ накладывает много своих ограничений на используемый инструментарий, плюс я реализовывал некоторые вещи по-другому.

Собственно перечень доступных функций:

Арифметика: +, — (бинарный), /, *, =.

Пары: cons, car, cdr, null?.

Предопределенная константа: nil.

Выход из REPL: exit.

Специальные формы: if, define (обычный, не MIT), lambda (только одна процедура в последнем параметре, т.е. необходим begin), set!, begin.

Типы данных: целые, вещественные, пары.

Скажу пару слов о быстродействии.

Основная проблема с быстродействием связана с неэффективным внутренним типом данных, который представляет собой разновидность класса variant, только реализованную топорно руками, а внутри везде используются switch-и.

У нормального программиста на C++ сразу должен возникнуть сигнал в бошке: switch — это плохо. На самом деле в данном конкретном случае это действительно плохо, но совсем по другой причине. Дело в том, что во внутреннем union помимо примитивных типов могут лежать так же string, vector и function, а union позволяет хранить их только в виде указателей. Это приводит к излишне частому выполнению операций new и delete, которые сами по себе тяжелы.

Использование объектного полиморфизма (есть интерфейс LispData и унаследованные от него Integer, Float, List и прочие) именно по этой причине было бы в разы эффективнее: вместо указателей можно было бы хранить собственно сами объекты. Доступ до них был бы примерно таким же быстрым, но не приходилось бы постоянно выделять и деаллоцировать память под них. То есть приходилось бы всё равно, но сильно реже.

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

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

Две проблемные возможности, которые реализовать не так просто, это уже упомянутые макросы и call/cc. Первые реализовать принципиально не сложно, но потребуются усилия. Это просто должен быть отдельный код, а не две строчки на функцию, просто в силу самой умности макросов в LISP.

call/cc можно реализовать либо с помощью CPS, что, на мой взгляд, довольно адовая техника, либо на виртуальной машине, используя стеки. И то и другое требует довольно существенной переработки, поэтому я этим заниматься не стал, хотя CPS может быть прикручу.

На этом в общем-то всё. Опять же, может быть кому и сгодится, я сам может быть иногда буду туда еще комитить.

Октябрь 30th, 2013

VKAnalyzer

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

Сейчас вот залил на GitHub первый образчик: VKAnalyzer на Python3.

Писал я эту программу, когда мне требовалось прижать одного мудака, и я искал до него аккуратные подходы. Программа делает три вещи:

1. Выводит список общих друзей для любой пары пользователей ВКонтатке.

2. Позволяет оценить реальный круг общения пользователя.

3. Отслеживает удалённых и добавленных друзей.

Первая функция работает очень просто: программа просматривает список друзей одного пользователя, затем второго и выводит общих друзей в списке.

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

Тут есть много оговорок. Например, если у пользователя B всего три друга, и все они общие с A, то это довольно значительный друг. Если у пользователя C при этом 15 общих друзей с A, но при этом у него всего 50000 друзей, то вероятно на самом деле они не такие уж и друзья.

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

Конкретный алгоритм можно выбирать.

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

Вот, например, найдём общих друзей между небезызвестным Энтео (Православный фанатик Дмитрий Цорионов), и картавым нацистом Дёмушкиным (можно кликнуть и увеличить, в скобках выводится количество друзей у персоны всего):

spy

Операция вывода круга общения занимает гораздо больше времени. Скажем, у Энтео более восьми тысяч друзей, это значит, что надо запросить информацию о восьми тысячах пользователей у vk.com. Это долго, плюс регулярно будут происходить ошибки связи и простые тормоза. Утилита умеет кешировать уже полученные данные, так что если с первого раза анализ не проходит из-за ошибок связи, то он может пройти со второго или третьего раза. Это может занимать довольно много времени, но если очень надо, то время найдётся. Для того же Энтео программа может работать до часу (включая перезапуски в случае проблем связи).

Круг общения Энтео получается таким:

spy2

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

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

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

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

Дополнительно были идеи анализировать фейсбук, твиттер, ЖЖ и подобное, но руки не дошли. Руки вообще очень до многого не дошли, так как того что реализовано в своё время мне вполне хватило.

Берите, пользуйтесь. Подробных комментариев по использованию я не оставляю, так как предполагаю, что использовать это всё равно смогут только программисты.

P.S. По непонятной мне причине urllib в Python3 отказывается работать с vk.com под Линуксом. Такое чувство, что из-за отличия в заголовках vk.com отшивает urllib. Наверняка с этим можно разобраться, но, опять же, мне это было не нужно, если кому-то надо — тот доделает.

Октябрь 15th, 2012

Hexlet University

Пару дней уже как появился новый образовательный проект — Hexlet University. Отличий от Udacity и Coursera как мне видится минимум два: во-первых, эти проекты сделаны на русском языке (мне это меньше нравится, я предпочитаю учиться на английском, но многим актуально), во-вторых этот проект несколько более открыт в том смысле, что предлагается не только учиться, но и учить. Будет интересно посмотреть что из этого получится, хотелось бы чтобы идея раскрутилась.

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

Пока на Hexlet есть всего один курс по программированию под MacOS (начинается 28-го), я в общем-то всем рекомендую присоединяться. Сам я от маков безумно далек, но думаю, что курс должен быть полезным — во всяком случае направление это очень денежное. Пожалуй из всего, что сейчас предлагается на Coursera, EdX и Udacity это самый перспективный курс в плане заработка после курса Coursera о программировании под андроиды (ссылку не могу запостить, так как Coursera в данный момент лежит). В общем я думаю, что начинание очень хорошее, всячески призываю поддерживать и присоединяться.

Октябрь 9th, 2012

CString

Увы, проект над которым я работаю, был начат еще аж в бородатом 98-ом году, и при этом использовалось MFC. От этого допотопного говна по хорошему следовало бы отказаться давно, да проект слишком большой и слишком на MFC завязан. И вот недавно понадобилось мне вспомнить почему CString не хочет конвертироваться в char* в юникодном проекте под WinCE (да, всё совсем плохо, даже стыдно от того насколько), ну и я соответственно вбил в поиск слово CString. Неожиданно нашел прекрасное:

Хотел найти какого-нибудь видео по запросу CString еще, но лучшее, что нашел, довольно уныло. (Позже, впрочем нашел что-то более интересное, но тоже так себе).

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

Май 30th, 2012

Закончил NLP

Закончился курс Natural Language Processing от Coursera. Было очень круто.

Statement of Accomplishment пока не рассылали, но по собственным расчетам мой балл получается 91,34% (принцип формирования балла там изложен в Course Logistics, так что эта цифра довольно достоверна). На самом деле довольно низко, мог бы и больше, если бы не был ленивым и тратил на каждое Programming Assignment больше часа, а не писал все на коленке в последний день перед дедлайном. Учился как типичная студентота в общем-то, увы.

Но курс очень классный — всем рекомендую. Говорили, кстати, что начинали курс слушать ≈45’000 человек, а до конца добралось менее 2’000. Идиоты, чтож. Из всего представленного на Coursera до сих это был лучший курс наравне с Probabilistic Graphical Models и Introduction to Databases.

Сам же я сейчас перестал слушать Coursera временно, и начал курс Леонарда Сасскинда по теоретической физике (ссылки в статье из Википедии). Очень интересно. Читатель Борис посоветовал в комментариях, я вначале после двух лекций как-то не осознал ценность курса, а втянувшись, вдруг понял, что ничего лучшего по физике пока не приходилось видеть. Так что тоже всем всячески рекомендую, свои прежние слова в комментариях о курсе беру обратно. Курс вроде очень хороший начиная с третьей лекции (хотя и почему первые две лекции были такими я уже понимаю), хотя конечно как там дальше пойдет загадывать пока нельзя. Но я держу пальцы скрещенными, чтобы и дальше было так же хорошо как сейчас, и я наконец-то постиг бы азы физики.

Апрель 20th, 2012

Coursera и Udacity

Продолжаю кстати слушать онлайновые курсы по Computer Science. С момента как я в последний раз о них писал, они здорово видоизменились.

Во-первых, Себастьян Тран и компания запустили собственный проект Udacity. На самом деле этот проект несколько пока разочаровывает. Я прослушал (на самом деле прокрутил довольно быстро, выполнив всего пару заданий) курсы «Building a serach engine» (CS101) и «Programming a robotic car» (CS373, его просмотрел не до конца), и впечатление сложилось негативное.

CS101 оказался на редкость примитивным и мне показалось, что слишком уж примитивны он будет даже для новичка. То есть посоветовать никому я этот курс не могу на самом деле, хотя конечно мне сложно судить — сам с программированием я познакомился много лет назад, и рассуждать что лучше для новичка, не имея преподавательской практики, я конечно не вправе. Но то что курс не тянет на «top university level», как они себя позиционируют — это по-моему очевидный факт даже для CS101. Максимум — уровень среднеобразовательной школы (единственный плюс — изучается Python, а не какой-нибудь Basic или Pascal, как в России).

Домашние задания даже нельзя назвать тривиальными. Пяток программ типа «print 2+3» за неделю — это реально смешно. То есть никакой наработки практических навыков программирования курс не дает, для меня он оказался 100% бесполезным, что странно даже для CS101 — обычно лекторы в любой курс вставляют хотя бы какие-то факультативные факты, которые и для опытного разработчика оказываются новыми. Тут не было вообще ничего.

Короче я не доволен.

CS373 был чуть лучше, но тоже не особо. Задания крайне примитивные и часто вообще не на CS, а на какие-то отвлеченные вещи. Например, домашнее задание на реализацию фильтра Кальмана сводилось к тому, чтобы догадаться о размерности перемножаемых матриц, а смысл самих матриц даже в общих чертах не объяснялся — это полностью убило мою мотивацию слушать лекции Себастьяна далее. Никакой математики почти не рассматривается, а там где она вдруг появляется, она быстро пробегается мимо как что-то очень сложное, а затем опять разжевываются тривиальные вещи.

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

А вот Coursera произвела совершенно противоположное впечатление. Во-первых, к проекту присоединился целый ряд университетов, и помимо Стэнфорда свои курсы публикуют так же Princeton University, University of Michigan, Universoty of California, Berkley и University of  Pennsylvania. Сам состав курсов тоже значительно расширился: теперь это не только Computer Science и Enterpreneurship, но и медицина, история, социология, экономика, какая-то даже математика.

Из всех курсов, увы, я оказался спобен заниматься только Natural Language Processing. Качаю и остальные, конечно, но выполнять задания не успеваю — восьмичасовой рабочий день банально не позволяет слушать большее количество лекций. Начинал слушать Probabilistic Graphical Models, но не успевал и сконцентрировался на одном только курсе.

Вот эти курсы действительно оказались близки к «top university level». Во-первых, сам материал актуальный, интересный и не тривиальный. Курс составлен очень качественно и продуманно. Но помимо лекций, важны еще и домашние задания.

Одно из последних домашних заданий требовало находить в тексте имена людей. Это на самом деле нетривиальная задача: многие слова имеют двоякий смысл, например «Victoria» может быть именем девушки, а может означать победу, и если это слово стоит в начале предложения, то проверка того имя это или нет сильно затруднено. Так же могут использоваться клички и псевдонимы, которые тоже надо вычленять из текста как имена собственные.

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

Мне это сразу напомнило курс методов оптимизации в МИФИ. Там мы градиентным методом поиска искали экстремум функции $latex f(x, y) = x^2 + y^2$. Причем я не шучу — это на полном серьезе называлось словом «лабораторная работа». В других институтах насколько я знаю ситуация с контентом курсов хоть и лучше, но тоже фатальна.

Курс NLP хорош тем, что дает реальные практические навыки в задачах, приближенных к реальным условиям (в отличие от курса CS101 Udacity, например, где мне плакать хотелось, особенно учитывая то что я когда-то немного читал учебник по Information Retrieval), и дает почувствовать масштаб реальных задач.

Еще полезный аспект — реальное применение каких-то математических концепций в Computer Science. Математика там конечно исключительно примитивная (логарифмы, вероятность, производная), но все равно забавно как применение какой-нибудь базовой теории вероятностей порой может кардинально повысить точность в сравнении с чем-нибудь совсем простым и очевидным. Если бы подобные курсы читались в технических ВУЗах, то ни у кого бы не возникало вопроса «а зачем мне это надо».

Ну и сами задания по программированию интересны. Я как-то писал, что в большинстве случаев довольно глупо требовать от учеников решения задачек — вместо этого надо выполнять проекты. Курс NLP почти целиком следует этому подходу (следовать ему целиком — сложная задача разработчика курса, и вероятно не всегда решаемая). В половине Programming Assignments не существует верного ответа, и вы можете рассчитывать лишь на некоторую точность работы вашей модели, выраженную в процентах (вернее, там почти всегда используется F1-мера, но это уже детали). У вас не получится догадаться какое должно быть решение и у вас не получится нащупать какой-то один заранее запланированный путь — вы именно сидите и думаете над реальной задачей, где решение не определено, а ваш балл получается не за ошибки в решении, а за его реальную применимость в жизни. И это очень круто (на самом деле существование решения конечно предполагается, и вам оно примерно известно из лекций, но и собственная творческая работа там довольно обширна).

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

Но это в общем-то главным образом про NLP. Остальные курсы я смотрел лишь мельком — там не везде есть Programming Assignments, но лекции тем не менее производят приятное впечатление. Так что всем рекомендую.

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

Но собственно все это я написал, чтобы как-то прорекламировать. Всем настоятельно рекомендую. Coursera — это пожалуй наиболее полезный и интересный курс, который мне до сих пор приходилось слушать. Очень жалею, что не успеваю больше.

P.S. Очень извиняюсь перед всеми, кому не успеваю отвечать на почту или ВКонтакте. Меня жутко раздражают люди, игнорирующие письма, я это считаю довольно высокомерным и не приятным поведением, но я сам теперь стал таким. Пишут мне много, и я банально не успеваюсь, особенно на фоне того

Март 23rd, 2012

3D-отладка в Firefox

Немного программистского.

Понадобилось разобраться в CSS страницы одного из проектов, над которым я работаю. Некоторое время назад я перелез с Opera на Firefox, ну и решил посмотреть что там есть для исследования таблиц стилей. Нажал на «Исследовать элемент», стал тыкать кнопочки, а там — красота. Страницы в 3D-виде, вся вложенность боксов отмечена высотами, элементы разных классов отмечены разными цветами «стен». Дико красиво, и наверное удобно (по крайней мере теоретически из трехмерной структуры страницы можно что-то и увидеть). Может быть это все конечно уже протухшая новость (верстальщики наверняка до меня знали, я же сам версткой занимаюсь раз в пол-года, а то и реже), но меня это все очень обрадовало. Вот просто несколько скриншотов, так чтобы все заценили:

Скриншоты кликабельны. Пока пробовал это только под рабочей Windows 7, дома попробую под домашней Ubuntu. Думаю, довольно приятно будет в таком виде просматривать порносайты.

Январь 27th, 2012

Перешел на Ubuntu

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

В итоге сейчас вирусы все  равно добрались до меня каким-то образом, проигнорировав настройки файрволла и антивирусы. Вирусы причем хитрыми стали: подставляют например иногда в результаты поиска Гугла ссылки на откровенные фейковые адреса ВКонтакта, с самого ВКонтакта спамят, но редко, да и подчищают потом за собой. Антивирус Касперского говорит, чтобы я не волновался: «Компьютер полностью защищен». Остальные антивирусы тоже не видят ничего криминального в моей системе.

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

Оказалась Убунта совершенно замечательной, что для никсов неожиданно. До этого я довольно долгое время был пользователем ASPLinux, но он совершенно не радовал. Для того, чтобы настроить банальный «Стрим», приходилось например пересобирать ядро. Не большая проблема, но сам факт. (Хотя если говорить именно об ASPLinux, то он был вообще тотально поганым: в конфигурациях типа «Home Standard» даже не было gcc, то есть даже невозможно было поставить ничего из тарболлов, однако я изначально был вынужден его использовать из-за того, что остальные дистрибутивы имели более серьезные проблемы с настройками русского языка, что для меня, начинающего юниксоида было значительным фактором).

А начиная с какой-то версии ASPLinux они поставили в стандартный пакет драйвер для USB ADSL-модемов Eagle USB, и Интернет у меня вообще перестал работать. А тут как раз приобрел новый ноут, с предустановленной лицензионной виндой, для которого никаких никсовых драйверов вообще не было. Так я на много лет перестал быть линуксоидом.

А сейчас я поставил Убунту, и совершенно неожиданно в ней вдруг все заработало. Не сразу, конечно: первая попытка инсталляции провалилась, так как я поставил флажки «Скачать при установке обновления и разрешить установку 3rd-party-софта», что привело к тому, что система вообще перестала запускаться из-за установленного кривого драйвера nVidia. Но когда я переустановился потом только с диска без обновления (обновления загрузил позже отдельно), все заработало вообще замечательно и пока никаких нареканий на Убунту у меня нет, только восторг: интерфейс неожиданно удобный (значительнее удобнее Винды), софт изначально предустановлен адекватный (благодаря нему я наконец понял как пользоваться Твиттером, хотя все равно не проникся), работает все крайне быстро.

Рекомендую.

Январь 13th, 2012

Стэнфордские курсы

Наверняка уже все знают, но чтобы никто точно не пропустил, тоже напишу.

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

В прошлый раз курсов предлагалось три:

  1. Artificial Intelligence
  2. Databases
  3. Machine Learning

Внимание общественности главным образом привлек Artificial Intelligence по трем причинам:

  1. Название курса «искусственный интеллект» звучит круто.
  2. Ведут курс прославившиеся ученые Peter Norwig и Sebastian Thrun (у обоих послужные списки очень обширные, но общественностью наиболее была замечена попбеда в DARPA Grand Challenge робота Stanley, разработанного командой Себастьяна).
  3. В конце обещали дать сертификат об окончании курса, что многими было воспринято чуть ли ни как диплом Стэнфорда (на деле это просто электронный документ, подписанный цифровой подписью Питера и Себастьяна, что к Стэнфорду никакого юридического отношения не имеет).

Собственно на деле курс по AI оказался наиболее слабым: слишком много времени уделялось подстановке цифр в формулы, слишком частные случаи рассматривались, слишком низкий уровень математической подготовки студентов предполагался, домашние задания сводились так же к подстановке цифр в формуле и не предполагали никакой интеллектуальной работы.

Это с одной стороны. С другой стороны как обзорный он вышел очень даже хорошим общеобразовательным. Там было дано и общее представление о регрессионных моделях, и алгоритм A*, и скрытые марковские процессы, и байесовы сети и куча всего другого. Это все сейчас постепенно становится теорминимумом для любого человека, который хочет заниматься программированием чуть на более высоком уровне чем программист 1С, и знать это такие штуки хотя бы существуют часто полезно (а подробности всегда можно посмотреть в Википедии).

Для сравнения, в МИФИ я отучился на CS четыре года и если бы не бунтовал, то был бы сейчас бакалавром. За время обучения я прошел несколько связных с AI курсов типа «Искусственные нейронные сети», «Цифровая обработка сигналов», «Анализ данных» и еще что-то  (все это очень условные названия курсов на самом деле, так, в курсе по нейронным сетям в том числе читались генетические алгоритмы как способ решения оптимизационных задач), но из всего перечисленного у нас были только регрессионные модели, да и те ограничивались простейшими видами — не было даже логистической регрессии, которая вообще самая базовая после линейной.

Итогом курса AI стало приглашение тысячи лучших студентов прислать авторам курса свое резюме. Правда, насколько я понял, рассылались приглашения только студентам из США, но мне в общем-то пофигу

Что касается курсов Machine Learning и Databases, то они оказались очень крутыми. Machine Learning слабенький в плане математики, но требует программировать на языке Octave (open-source аналог MATLAB) всякие вещи. Это довольно полезное занятие — материал лучше откладывается в мозгах и в общем-то изложенный материал становится понятным не только на уровне абстракций, но и как-то на уровне физических ощущений. Опять же как общеобразовательный курс, развивающий параллельно простые навыки работы в математических пакетах, очень он очень хорош.

Databases же вообще выше всяких похвал. С ними у меня всегда были проблемы — мне никогда не приходилось программировать ничего более-менее сложного, связанного с базами данных, а задания в соответствующем курсе в МИФИ были слишком тривиальны (уровня «вывести все университеты, на которых читается CS» без каких-либо изысков). Книжки и онлайн-лекции так же практики не представляли.

Стэнфордский курс очень краткий, сжатый, но содержит хоть какие-то интересные упражнения, при этом копает сразу на довольно глубокий уровень. Для меня это было просто то, что очень долго мне не хватало.

Кстати хотя этого и не объявлялось и не пиарилось, но курсы по Machine Learning и Databases в результате так же дали подписанные сертификаты, ни чуть не более худшие чем сертификат AI. А понимающие люди согласятся, что они и куда более серьезны.

Все эти курсы до сих пор доступны. Баллы за домашние задания уже не выставляются и сертификат не получить, но сами задания доступны, так что я бы всем заинтересованным очень рекомендовал пройти эти курсы — по базам данных вы вообще маловероятно что лучший источник найдете. Знакомство с Octave тоже может оказаться полезно. AI рекомендовать не могу — проще посмотреть список тем и почитать соответствующие статьи в Википедии. Хотя как простенький обзорный материал тоже можно использовать, но слишком уж лекции там затянуты.

(Кстати, справедливости ради надо сказать, что сам я в результате балл набрал невысокий — точно не помню сейчас, но что-то вроде 77% или около; я забил на часть домашних заданий, а что-то мне было лень считать).

В наступающем семестре Стэнфорд предлагает вообще огромную кучу курсов:

Lean Launchpad

Technology Enterpreneurship

Anatomy

Making Green Buildings

Information Theory

Model Thinking

CS 101

Machine Learning (повтор)

Software as a Service

Human-Computer Interaction

Natural Language Processing

Game Theory

Probabilistic Graphic Models

Cryptography

Design and Analisys of Algorithms

Computer Security

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

This work is licensed under GPL - 2009 | Powered by Wordpress using the theme aav1
SEO Powered by Platinum SEO from Techblissonline