Categories:

Pattern-Oriented Software Architectures, Coursera & Vanderbilt University

Давно я не писала ничего про собственные опыты с онлайн-курсами. Но это не значит, что я на них забила – да ни в коем случае! Просто я сейчас углубилась дальше в специализацию по мобильным сетевым приложениям для Android, а там “чем дальше в лес, тем толще партизаны”, курсы перестали быть совсем уж “хеллоуворлдными”, и становятся всё дольше и серьёзнее, требуя немалой самоотдачи. Но самоотдача окупается, и вот ещё один курс удачно закончен:

Coursera POSA 2014

Оценку, кстати, получила забавную – 100.7% :) Не 146%, конечно – но тоже заставило несколько удивиться. О чём, впрочем, поведаю дальше, а пока расскажу, чего и как тут, собственно, изучалось.

Вообще, это второй запуск курса, с некоторым его ребрендингом. В первом запуске речь шла не про Андроид, а про распределённые приложения вообще, но тут, видимо, чтобы в полной мере вписаться в специализацию, тему курса несколько сузили. Жаль, не застала первую версию – но кто знает, вдруг ещё будут перезапускать? А в нашем же варианте были два лектора – один рассказывал про механизмы синхронизации потоков и межпроцессовой коммуникации, второй читал лекции о безопасности кода. Первый шпарил так, что большинство народа не могло смотреть курс без субтитров, судя по форуму. Я могла, но, тем не менее, учитывая темп повествования и количество мелких строк кода, мелькающих туда-сюда на экране, смотреть этот курс в спортзале на беговой дорожке или степпере совершенно нереально. Только хардкор, только планшет и транспорт, или обеденный перерыв и компьютер!

Что забавно – несмотря на название курса, про сами паттерны проектирования был разве что набор исключительно опциональных лекций в конце. В основных лекциях были разве что ссылки, по которым рекомендовалось пройти, если мы хотим узнать больше (читать как “узнать, что это за buzzword вообще”). Нет, какие-то из них я знала и раньше, благодаря замечательной книжке из серии O’Reilly Head First, но всё же, многие оказались совершенно не знакомы. Пришлось так или иначе изучать и “дополнительный материал”. Но в то же время – и за обязательный я в общем и целом благодарна, те же механизмы синхронизации и их аналоги из реального мира понравились весьма. Да, вот сейчас мне не стыдно признать – как унылый веб-быдлокодер со стажем, многих вещей я тут не знала, просто неоткуда было узнать. Но потому и не стесняюсь изучать их практически с нуля, но уже системно и вдумчиво, заполняя пробелы. И ещё одним пробелом стало меньше, чему я искренне рада.

Второй лектор, рассказывавший про политику безопасности и типичные небезопасные примеры кода в Android, в общем и целом понравился больше. Единственный минус – записи с ним звучали тише, приходилось туда-сюда дёргать переключатель громкости. А так – у мужика в общем и целом талант объяснять “на пальцах” так, чтобы все поняли, и при этом не торопиться и не считать, что большую часть материала студенты и так знают. Очень впечатлило.

Домашняя работа распределялась так: квизы по лекциям (элементарные, с сотней попыток на каждый и с указанием неправильных ответов после сабмита, кто не сделал с первого раза, тот решит “работу над ошибками” уж точно со второго), на которых можно было остановиться, если не претендуешь на окончание “с отличием”, и практические задания, которые для этого отличия (и для продолжения специализации дальше!) были жизненно необходимы. Надо отдать должное – по крайней мере тут правила были прописаны чётко и заранее, и не менялись по ходу курса, так что ДРАМЫ не было, каждый знал, на что шёл. Я шла, ясное дело, на “отличие” – и оценка для него складывалась на 70% из результата практики и на 30% из квизов (всего для получения сертификата надо было набрать стандартные 70% по курсу). Как видите, получилось. Но за что у меня добавились те самые 0.7 балла – не знаю, честно. Какой-то extra credit – но за что? Особенно учитывая, что в одном из первых заданий я слегка накосячила с локами, и, хоть и не все проверяющие заметили баг, я сама про него прекрасно знала по итогам чтения форума. Даже как-то и неудобно немного – а заслужила ли я столь хорошую оценку?

Теперь про сами практические задания. В общем и целом – они мне понравились больше, чем на прошлом курсе. Тут не было оценки “по кофейной гуще”, в смысле, по логам приложения – всё было, в общем-то, куда обстоятельнее. Каждую неделю на GitHub курса выкладывалось по 4 диры с кодом:


  1. Само задание

  2. Автоматизированные тесты к заданию

  3. Копия задания для проверки чужих решений

  4. Копия тестов для проверки чужих решений

Почему так? Чтобы не было читерства вида “модифицировал другой файл, поэтому у меня тесты проходят, а у остальных там хоть трава не расти”. И хоть формально задания оценивались и через peer review (ибо других способов отследить качество кода и ругать студентов за wtf-чики, увы, пока не придумано), фактически одним из очень важных критериев оценки был результат работы тех самых автоматизированных тестов, хоть и не через автогрейдер. Фактически – описание курса говорило чистую правду, оценка выставлялась по сочетанию автоматизированного и ручного тестирования. И это хорошо, пусть и довольно напряжно, ибо каждый студент должен был выставить оценку аж пяти своим соученикам.

Что до самих заданий – первые несколько были просты до элементарности, уровня “запустить тред, остановить тред – отлично, задание окончено”. Потом уже стало интереснее, как на “игрушечных” примерах (симулятор палантиров, в которые может смотреть ограниченное число толкиеновских существ, ыыыы!), так и на реальных андроид-приложениях. Основные темы – потокобезопасность, синхронизация, обмен данными между процессами, всяческие activities и services – и попутно полезные паттерны типа Strategy и Factory, просто для облегчения жизни кодера. В общем и целом – если выдержать хотя бы до середины, то то, о чём резво шпарит преподаватель, на практических примерах становится куда понятнее. Хотя какое-то время материал заданий и отставал от материала курсов где-то на неделю – что, впрочем, не недостаток, а хороший повод освежить знания.

Но, хоть я и похвалила лекции по безопасности, задание на посвящённой ей седьмой неделе было, простите мне мой французский, откровенно мудацким. Было дано приложение – модифицированный вариант “курсового проекта” из первого курса серии – и в нём намеренно было допущено несколько уязвимостей. Надо было проанализировать код приложения и 1) решить квиз, отметив, в каких строках из вариантов на выбор есть проблемы 2) пофиксить часть из этих уязвимостей. И вот всё бы ничего, но – поскольку квиз был не по лекциям, а практический, в нём не сообщалось, какие варианты ответов были ошибочными, а какие – нет. Только итоговый результат. А учитывая, что строк было чуть более чем дофига, а вопрос звучал как “найдите строки, которые генерируют уязвимости, или просто не лучшим образом написаны” – под это определение подходила едва ли не половина stack trace любого вызова. Так или иначе, за четыре попытки я достигла результата, всего на полбалла отстоявшего от максимального. И тут уже плюнула, полезла на форум, где народ конкретных номеров строк, конечно, не давал, но мог временами делать подсказки и хинты, типа, “всего N бажных строк, из них столько-то одного типа и столько-то – другого”. Только после этих хинтов я, наконец, ещё через пару попыток таки получила максимальную оценку. И это ещё был не худший вариант – как докладывает народ с мест, были и попытки решения квиза брутфорсом, за 50+ попыток! Хотя при этом как раз практическая часть, где эти самые баги надо фиксить, оказалась совершенно элементарной. И в чём, спрашивается, сакральный смысл подобного?

Отдельных экзаменов или проектов не было – как-то я даже и пожалела слегка. Но, в общем и целом – если первый курс я назвала достаточно серьёзным курсом по software engineering, то вот этот второй – ещё более серьёзный в этом плане, однозначно. Если кто-то хочет писать под Андроид, не ограничиваясь однообразным “формоклепательством” – такие курсы нужно проходить, однозначно. И, поскольку я таки эту операционную систему люблю, и хочу под неё писать – я не жалею о потраченных времени и ресурсах. Искренне надеюсь, что и коллеги меня поддержат!

UPD. Пока писался пост - оценку поправили, теперь там просто 100%. Ну и ладно, собственно :)