четверг, 30 июня 2016 г.

A programmer: We can be heroes. But not today.

С утра почему-то ворвалась в мозг песня "Heroes" Дэвида Боуи: "We can be heroes just for one day" - хотелось, чтобы это было обо мне сегодня.


Итак, чуда не произошло, и на обучение Java я не прошел. Мои результаты тестирования не разглашаются. Могу только сказать о процедуре: 82 вопроса за 60 минут. Если результат удовлетворительный, то еще часовое тестирование - сегодна из группы 8 человек на второй этап отправились 2. Если повезет и им, то - собеседование с техническими экспертами, которые и будут принимать решение о зачислении на обучение (всего набирают 10 человек). Нынешние неудачники могут в следующий раз попробовать пройти такую же процедуру не раньше, чем через полгода.

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

Как обычно, несколько статей:

 - Как стать программистом (часть 1). Понятно, что это и реклама тоже, но все-таки...

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

 - Лучшие IT-курсы западных вузов по версии хабрасообщества 2016 года

вторник, 28 июня 2016 г.

A programmer: Test preparation

Главное на этой неделе - тест по Java, который я буду проходить для того, чтобы попасть на программу обучения в одну IT-кампанию. Поэтому сейчас увеличиваю свою активность в этом направлении - 13 часов за прошлую неделю (всего 114).



Готовлюсь по-разному. Но буквально вчера-позавчера нашел два хороших ресурса:

 - Программирование на  Java - видеокурс (вообще-то я смотрю его тут).

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

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

суббота, 25 июня 2016 г.

A programmer: Java #3: Exceptions

Я договорился-таки о прохождении тестирования по Java, причем у меня еще есть неделя для подготовки. Плюс уточнил, что будет на тестировании:
 - ООП;
 - Основы Java;
 - Ввод/вывод;
 - Коллекции;
 - Многопоточность;
 - SQL.

При этом последние два дня застрял на обработке исключений. Итак, что это такое?

Исключение (Exception) - это событие, которое прерывает нормальную работу программы (попытка деления на ноль, попытка обратиться к элементу массива, который не существует, обращение к несуществующему файлу и т.д.).

Когда происходит ошибка в методе, создается "объект исключения" (exception object), содержащий информацию об ошибке (метод "бросает исключение" (throwing an exception)), и система ищет метод, который может исправить ситуацию ("обработчик исключений" (exception handler)). Этот метод представляет собой блок кода, в котором записано, что нужно делать в данном случае. Это происходит следующим образом:

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

 - Система просматривает call stack в обратном порядке (от последнего к самому первому), ища совпадение типа объекта исключения с типом, указанном в обработчике.

 - Когда совпадение найдено, система (JVM) передает управление в соответствующим метод. Если нужный метод не найден, то выполнение системы и программы прекращается (часто - с выводом call stack'а на экран).

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

Для идентификации исключений в Java существует набор классов, описывающих их. Высший класс в иерархии - Throwable, (java.lang.Throwable) остальные наследуются от него. Его прямыми наследниками являются классы  Exception и Error, от которых унаследованы все остальные исключения, также от них можно наследовать собственные классы исключений.

Эти классы отличаются тем, что в классе Exception описаны проверяемые исключения (checked - те, которые зависят от программы), а в Error - не проверяемые (unchecked). Однако, существуетодин наследник класса Exception, который описывает непроверяемые исключения - класс RuntimeException (исключения времени выполнения).

Что касается программы действий в каждом случае exception handler'а), есть три способа ее задать.

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

Если некоторый код программы должен быть выполнен в любом случае, то он помещается в блок finally {} после всех catch'ей. Также после try можно в круглых скобках указать ресурс (обычно поток), который обязательно должен быть закрыт в случае ошибки, чтобы не происходило утечки ресурсов - опция доступная в 7 и 8 версих Java.

Второй вариант - указать возможные типы ошибок в сигнатуре самого метода с помощью ключевого слова throws. Это будет означать передачу обработки исключения в данном методе в метод, который его вызвал. Соответственно, в том методе должна быть конструкция try-catch или throws.

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

Отличный материал по теме есть здесь.
Полезно также читать официальные The Java Tutorials.
Коротко и ясно написано также здесь.
Вопросы и ответы для собеседования по исключениям в Java есть здесь.

А еще нашел сайт с тестами по Java. Отдельно теста по исключениям там нет, но в целом интересно. Разумеется, с ответами, объяснением и обсуждениями.

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


P.S.: И еще пару ресурсов:

"Как стать профессиональным разработчиком: практическое руководство"

"Качественный код - слагаемые"

воскресенье, 19 июня 2016 г.

A programmer: Do it now!

 Есть очень небольшой прогресс: 9,5 часов за прошедшую неделю (всего 101). Учитывая необходимость работать быстрее, этого недостаточно и формально, и содержательно. Было бы очень плохо упустить возможность.
 

Из последнего - прочитатл пост в каком-то блоге. Ничего особенного, но там рекоммендовали вместо Г. Шилдта ("Java 8. Полное руководство" и "Java: руководство для начинающих") читать К. Хорстманн, Г. Корнелл "Java. Библиотека профессионала" (в 2-х томах). Скачал, читаю параллельнос Шилдтом :).

Нашел вот еще:

 - Разные практические штуки на info.javarush.ru. Есть, в частности, ответы на вопросы по разным темам тут.

 - Форум javatalks.ru - есть несколько интересных тем. В частности,

 - http://www.javable.com/eng/docs/ - Разные материалы (доки и статьи) по Java/

четверг, 16 июня 2016 г.

A programmer: Java #2: Getters, Setters, Constructors, Overloading

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

Дело в том, что на JavaRush, как оказалось, не вполне понятная последовательность изложения (типа "а вот тут еще вот такая штука есть"), поэтому указанные вещи не вписывались в систему. А вот с помощью уже упоминавшегося видеокурса "Java для тестировщиков" эти вещи сложились в целостную картинку.

Все те вещи, о которых пойдет речь - следствия ООП. Так, например, если для инкапсуляции в классах выставлены ограничения доступа, то для того, чтобы этот доступ все-таки при необходимости получить, используются сеттеры и геттеры. Геттер - метод getNum(), например, - выдает вовне значение переменной, которая определена внутри класса, а сеттер - setNum(), соответственно, - позволяет извне это значение установить.

Конструкторы - это методы, создающие объекты данного класса. Дело в том, что когда я изучал создание объекта и конструкторы раньше, было неочевидно, что при создании нового объекта без передаваемых параметров вызывается конструктор (например, Class a = new Class()). Неочевидно не только потому, что не объяснили, но и потому, что он в классе есть по умолчанию и в коде не обязательно прописан. Соответственно, в изложении учебного материала конструкторы появляются как бы "вдруг", только когда надо в создаваемом объекте указать параметры.

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

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

вторник, 14 июня 2016 г.

A programmer: Java #1: OOP basics

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

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

 - Объясните что такое полиморфизм простыми словами ?
 - ООП. Полиморфизм
 - Java-course. Полиморфизм
 - Объектно-ориентированное программирование. Полиморфизм
 - Полиморфизм для начинающих
 - Java. Урок 24. Полиморфизм

Последний оказался самым полезным (вместе со вчерашним видео).

Итак, основы объектно-ориентированного программирования:

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

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

Инкапсуляция означает сокрытие реализации поведения объекта (за счет ограничения прав доступа к ней). То есть нам достаточно знать, что делает объект, но как он это делает, нам не важно.

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

Как-то так. А вообще картинка прошлого поста объясняет.

понедельник, 13 июня 2016 г.

A programmer: With a little help of my friends

Нашел статью, где Стив Джобс объясняет объектно-ориентированное программирование: "Steve Jobs Tells the Best Definition of Object-Oriented Programming"


На прошедшей неделе программированием все-таки удалось немного позаниматься. Мне знакомые бросили ссылку на вакансию стажера по Java Script, я написал им резюме, на следующий день мне перезвонили, уточнили мои знания и предпочтения и предложили пройти тестирование для участия в обучении по Java – если подучусь до конца месяца и буду чувствовать в себе силы. Если попаду туда, то буду учиться 3 месяца. Конечно, жаль было бы упускать такой шанс, поэтому и занялся программированием более активно (если так можно выразиться в моем случае). Таким образом +4 часа за прошлую неделю, итого - 91,5 часов.

Содержательно надо подтягивать/доучивать все, начиная от ООП. Пока несколько застрял на «полиморфизме», зато нашел еще несколько ресурсов:
 - «Уроки для начинающих» - пока не углублялся.
 - Программа курса «Java Core» - вот этот видеокурс я сейчас слушаю, достаточно неплохо, поэтому вот видео:


Дальше – надо уточнить требования, попробовать найти тесты в интернете и т.д. По-хорошему у меня есть неделя-полторы. Вперед!

воскресенье, 5 июня 2016 г.

A programmer: Time out

Снова не работал, а увеличивал долг до 25,5 часов. Откровенно говоря, и на следующей неделе вряд ли что-то предвидится. Поэтому лучше просто взять тайм аут и сосредоточиться на других вещах.

Вот, правда, пару задач нашел в ВК:

 - Задача про воду, накапливающуюся между стенам.
 - Как написать своего сапёра на Java за 15 минут.