понедельник, 7 ноября 2016 г.

Первый экзамен

Вчера состоялся мой первый экзамен на курсе Петра Арсентьева "Программирование на Java".
Пётр ошибочно полагал, что до Java я изучал программирование  на Паскале. Поэтому все его вопросы были направлены в основном на отличия между Java и Паскалем (например, про динамические и статические массивы). Я же Паскаль видел только краем глаза, да и то издалека, и до Java изучал C. Поэтому не сразу понимал, что от меня хочет услышать Пётр, отвечал сбивчиво и задавал много уточняющих вопросов. Другими словами, "тупил". ))
Но, вроде как, сдал. Перешёл на второй модуль курса (а всего их 14). 

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

В качестве итогового задания по первому модулю курса Пётр попросил написать программу, которая объединяет два отсортированных массива в один, который также должен быть отсортирован.
Сначала я хотел сделать одновременную сортировку с объединением (т.е. брать по одному элементу из каждого source-массива (источника), сравнивать их и класть в destination-массив (результирующий). Но, по здравом размышлении, решил, что написать такой код сложнее, чем написать классу, копирующий 2 массива в один и прикрутить к нему имеющийся у меня класс-сортировщик (сортирует методом перестановки или, как ещё называют, "пузырьковым" методом).
Итоговый алгоритм получился таким:
1) копируем первый source-массив в destination-массив;
2) следом за ним копируем в destination-массив второй source-массив;
3) после этого сортируем destination-массив.

Получился код в духе Java-way и в ООП-стиле - из уже имеющихся классов создал новую программу. Написал только один новый класс Copier - для копирования двух массивов в третий. Ну, и, соответственно junit-тест писал только для класса Copier, т.к. тесты для всех остальных классов уже были написаны в другой программе.

На правах рекламы буду в каждом сообщении указывать ссылку на свой GitHub.
В ближайшее время добавлю на GitHub в chapter_001 ещё 2 программы из первого модуля и создам новый каталог chapter_002 для программ второго модуля.

До        После

среда, 2 ноября 2016 г.

00:00 - developing

Уже второй день подряд к 00:00 часам заканчиваю писать программы. Если  и дальше так продолжится, то пора будет вводить новый термин, обозначающий стиль такой разработки: 00:00 - developing. ))

Где-то на GitHab будут лежать все мои "две" учебные программы. ))

Что интересного заметил в курсе программирования на Java:

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

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

Странным мне представляется подход к написанию программ, при котором для программы сначала пишется Junit-тест, а потом уже код, который этот тест должен проверить. Это похоже на поэтапное написание класса с методом main()
Так как я пока не могу сходу написать программу или тест без ошибок, то одновременное написание программы и теста для неё усложняет написание программы, т.к. приходится придумывать "заглушки" для кода, увеличивает в 2 раза количество ошибок и сильно усложняет их поиск.
Поэтому я пока что пишу тесты к программе в таком порядке: сначала пишу программу и класс с методом main() и отлаживаю её, а потом уже на основе кода из метода main() делаю тесты к работающей программе.

Эх, поскорее бы пройти начальные модули курса и приступить к более серьёзным вещам, чем расчёт площади треугольника. ))

До        После

вторник, 1 ноября 2016 г.

Очередной выверт мозгов

Java  в очередной раз выворачивает мне мозг.
Вчера весь вечер вникал в приведённый на курсе Петра кусок из программы для расчёта площади треугольника. В конце-концов, как это работает я разобрался. Только не понял, зачем было так всё усложнять:
1\ есть класс "точка" с координатами (х, у):
- в этом классе указывается, что: this.x = x, а this.y = y: (надо, кстати разобраться с этими this. , а то что-то везде их пишут, а что это - не рассказывают),
- в этом же классе пишется метод, рассчитывающий длину стороны по формуле Герона;
- этот метод принимает в качестве параметра второй объект-"точку" с координатами (x, y).
2\ далее, есть класс, в котором будет вызываться метод расчёта длины стороны из одного объекта-точки и передавать ему в качестве аргумента второй объект-точку;
3\ создаются два объекта-точки: точка-А и точка-Б;
4\ создается метод, который будет вызывать метод расчёта из объекта точка-А и передавать ему в качестве аргумента объект точка-Б...

Пётр пишет, что это правильный код в духе ООП, метод расчёта длины стороны в нём более лаконичен и т.д. Как это работает, я разобрался. Но не понял, для чего нужно было всё так усложнять? Почему нельзя было сделать проще: в один метод расчёта длины стороны передавать в качестве аргументов координаты двух точек? Такой метод можно вызвать столько раз, сколько точек вершин у фигуры, а в качестве аргументов можно передавать ему массив с координатами точек.
Зачем было городить такой "огород" из объектов? Ладно, в задаче всего 3 точки, а если их будет 6, 12 или 24? Никак не могу понять, в чём тут выгода по сравнению с одним методом... Точки и их координаты постоянно "летают" от одного объекта в другой. Очень сложно отследить их "траекторию".

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

До        После




понедельник, 31 октября 2016 г.

Git, TrackStudio, Maven & Junit - выходные

Первая лекция из курса Петра Арсентьева традиционно была посвящена...
Даже не так. Начну с того, что ей предшествовало.
А предшествовал первой лекции тот факт, что перед тем, как начинать что-то изучать на курсе нужно научиться работать с TrackStudio: создавать там себе проекты и задачки, назначать по ним ответственных и комментировать ход их выполнения. Для этого в курсе имеется инструкция в картинках. на перевод которой с... ну, мягко скажем, непонятного русского языка на понятный язык, у меня ушло около пяти часов... Изучение TrackStudio проходило в следующем цикле:
1\ читаем пункт инструкции,
2\ пытаемся в TrackStudio найти что-то похожее на ту кнопочку, на которую нужно нажать по инструкции,
3\ если не получилось, то повторяем п.2 до тех пор, пока не получится что-то похожее на картинку из инструкции,
4\ если получилось, пишем в инструкцию перевод этого пункта на русский язык (правильное название кнопочки и места, где она на самом деле находится),
5\ переходим к следующему пункту инструкции и возвращаемся к началу этого цикла...

Раздосадованный таким началом, написал Петру длинное письмо в духе того, что его инструкция к TrackStudio больше похожа на машинный перевод с китайского на русский, чем на инструкцию.
Занимался этим всю субботу. Бессмысленно и беспощадно потраченное время. Минус 5 часов из жизни. Остаток светового дня субботы (до 01:00 AM воскресенья) наслаждался книгой по Java.

В воскресенье было ещё интереснее. ))

Здесь самое время вернуться к тому, с чего я начал этот пост: первая лекция из курса Петра Арсентьева традиционно была посвящена базовым вещам: что такое Java и т.д.. Первое задание было тоже традиционным: написать программу Calculator, которая должна вывести в терминале "Hello World"... ЧТО?! 
Почему Calculator  должен писать в консоль "Hello World"? Calculator должен производить указанные ему арифметические действия с переданными ему числами.
Что запрещало назвать программу как-нибудь "HelloWorld", "Program" или "MyFirstProgram"?
Если это какая-то Java-традиция называть первую программу калькулятором, вне зависимости от того, что она на самом деле делает, то нужно же предупреждать об этом. Эффект на меня был произведён примерно такой же как от фразы: давайте выпустим новый автомобиль и назовём его стиральной машинкой.

Дальше ещё интереснее.

Думаю, дай, гляну следующий видео-урок, там наверняка будет что-то про этот модный "калькулятор" рассказываться. Я не ошибся. В следующей лекции был мельком показан код "написанной нами ранее" программы Calculator, которая принимала в качестве аргумента строку и три раза выводила её на экран... И при чём тут был "Hello World"?
Но "HelloWorld" нужно было не просто написать, а ещё добавить в проект Maven и сделать его модульным. Maven? ЧТО ЭТО?! Он здесь откуда взялся? Это ж была только первая лекция по основам Java, в которой про Maven не было ни слова.
Поискал по видео-урокам Петра, нашёл урок о том, что такое Maven. Просмотрел ещё часа 3 видео с других курсов, чтобы понять, что это такое. Установил, настроил. Идём дальше.

Лекция №2 "Типы данных". Задание после лекции: написать тест к калькулятору. ШТА?! Какие тесты? Что это такое? Откуда это? Как их писать?.. Ещё несколько часов просмотра на youtube видео-уроков на тему тестирования Java-программ. Узнал, что существует множество инструментов для автоматического тестирования Java-программ. Какой из них нужно использовать в курсе Петра? Полез опять смотреть его видео. Увидел в одной из строчек кода знакомое по просмотренному на youtube слово Junit. Ещё несколько часов просмотра на youtube чужих видео-уроков на тему Junit...

К 24:00 воскресенья имею:
- git-репозиторий на GitHub;
- модульный проект;
- подключенный и настроенный Maven;
- установленный Junit;
- Calculator, который производит прописанные в нём вычисления с определёнными (инициализированными) в нём самом переменными;
- тест для Calculator.


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

Написал Петру свои замечания и обратил его внимание на то, что его курс называется "Java с нуля до профессионала". Пётр позвонил мне в воскресенье вечером, сказал, что исправит все недостатки курса к концу ноября...
Только мне от этого что? Я этот этап курса уже прошёл. И два дня непродуктивно потеряны. Домашние дела не сделаны. Кот не вымыт. Английский заброшен. Курс "Научное мышление" - тоже. Спорт? Его туда же. Вместо изучения и практики Java изучал и практиковал Maven и Junit. Дошло до того, что когда в воскресенье вечером сел писать Calculator, то понял, что напрочь забыл всё, что прочитал на первых 100 страницах в книге по Java. В голове только git, Maven и Junit. Придётся начинать сначала...

Теперь в полной мере понимаю смысл поговорки: шаг вперёд и два назад...

До        После

пятница, 28 октября 2016 г.

Господа, рекомендую

Как говорится: господа гусары, рекомендую.
Книга К. Сьерра, Б. Бейтс "Изучаем Java" - это реально стоящая вещь! В ней и только в ней мне, наконец-таки удалось получить ответ на такой элементарный вопрос, как "что такое класс и метод?". При чём, об этом рассказывается в очень доступной форме и на первых же страницах книги.
После прочтения первых 50 страниц книги я уже смог ОСОЗНАННО написать свою первую программу на Java с циклом for().
Короче, MAST READ для начинающих программистов, у которых возникли проблемы с переключением мозгов на "философию Java". ))
В общем, я пою и пляшу от радости, как в индийских фильмах. Можно вздохнуть свободно. Ведь теперь я понимаю основы Java. Отныне, этот язык для меня больше не является "китайской грамотой". А вышеуказанную чудо-книжку - читать, читать и ещё раз читать!

До        После

четверг, 27 октября 2016 г.

Перестроение сознания

Java взорвала мой мозг.
Ещё вчера я писал программы на C, а сегодня пытаюсь то же самое делать на Java:
- структура программы отличается,
- термины другие,
- слово "функция" - табу,
- типы данных похожи, но другие,
- методы, объекты, классы, библиотеки   - что из них что и почему называются именно так, а не так, как в C? Википедия пишет какую-то чушь про комнаты и ящики... Пока понял, что: метод - это операция (или функция), которую производим с данными, класс - это тоже самое, что и объект  - набор данных и методов (часть кода, обособленная от других его частей?), а библиотека - набор классов с методами,
- UTF-16 вместо UTF-8? На курсах программирования на C говорили, что UTF-8 - это святое, а всё остальное - ересь. Как мне теперь дальше жить с этим?
- инкапсуляция - свойство объекта (класса?), при котором содержащиеся в нём данные могут обрабатываться и изменяться классами и методами только внутри этого объекта (т.е. данные этого участка кода принадлежат только ему?),
- создание новых строк при их сложении! (сколько плюсов поставили, столько новых строк и создастся о_0), 
- чтобы написать "Hellow World" теперь не достаточно main() и printf(), теперь всё это должно быть помещено в class HelloWorld {}...,
- нельзя просто взять и вызвать функцию printf() нужно указать полный путь к этому методу: System.out.printf(). А кроме неё есть ещё print(), println() и ещё с пару десятков других print-ов...,
- получение программой данных с терминала - это вообще ад и содомия какая-то. Согласно одному из методов, для этого нужно написать целую мини-программу. В соответствии с другим методом, всё чуть проще, но не настолько, как в C. Короче говоря, взять что-то с терминала не так легко, как положить что-то туда. Плюс, ещё нужно не забыть закрыть поток, из которого читали данные. Но при этом не нужно закрывать его слишком рано, т.к. в следующий раз, когда программе (всей или только этому классу?) потребуется ещё что-нибудь прочитать оттуда, то она уже не сможет этого сделать, т.к. поток будет закрыт,
- нужно постоянно помнить, какие слова пишутся с большой буквы, а какие - с маленькой...,
- вместо include < > теперь что-то другое (уже не помню, что);
- компиляция и запуск из терминала - шаманство какое-то по сравнению с gcc
- Eclipse - вроде всё понятно, но пока не представляю, как создать программу в блокноте...
При просмотре видео-лекции вроде бы всё понятно и логическая структура языка хорошо прослеживается. Но, когда попытался сделать что-то сам, то не смог этого без подглядывания в лекции. Ощущения такие, как будто я всю жизнь учил английский, а переехал на ПМЖ в Германию или Францию. Буковки вроде бы те же, но складываются и произносятся по-другому. ))
Напрягает какая-то путаница с определениями терминов и громоздкими конструкциями вызова методов. По ходу просмотра лекций на каждую фразу преподавателя у меня возникает  вопрос: почему это сделано именно ТАК. Но об этом, в отличие от курса программирования на C, ничего не рассказывается.
Приведу аналогию с обучением иностранному языку:
Можно учить человека сразу грамматике и правильному произношению и объяснять, почему именно правильно задавать вопрос "что ты делал вчера?" в виде "what did you do yesterday?".
А можно просто сказать ученикам: если хотите поинтересоваться, чем ваш собеседник занимался вчера, то скажите ему "ват-дид-ю-ду-естэди" или напишите на бумажке "what did you do yesterday?" и вас обязательно поймут.
Вот курс "программирование на Java для начинающих" от компании "Специалист" очень похож на второй вариант обучения. Не рекомендую смотреть его неподготовленным.

Чтобы исправить ситуацию решил первой прочитать книгу К. Сьерра, Б. Бейтс "Изучаем Java" и иметь под рукой книгу Хорстманн, Кей С., Корнелл, Гари "Java. Библиотека профессионала".

До        После




среда, 26 октября 2016 г.

Starting Java

Началось.
Вчера я успешно закончил курс программирования на C и приступил к изучению программирования на Java. Решать несколько дней задачи на C я не стал, т.к. решил, что чем быстрее изучу Java, тем раньше начну искать работу по новой специальности. Кроме того, не вижу большого смысла в закреплении основ языка C, т.к. не нашёл нормальных бесплатных курсов по изучению профессионального (углублённого) программирования на C, в которых рассказывалось бы о том, как работать в C с графикой, видео, аудио и т.п. вещами.
Лучше буду больше задач решать на Java. Кстати, синтаксисы C и Java очень похожи. Так что изучение основ C не должно пройти даром.
Насколько я понял из того, что рассказывают об обучении программированию более опытные чем я товарищи, моё желание сосредоточиться на изучении одного языка не лишено смысла.
До выходных планирую изучать основы Java, git и Eclipse. В субботу-воскресенье начну проходить платный курс Петра Арсентьева. Что называется, "отсчёт пошёл". ))

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

Английский идёт по плану: утром - видео-курсы, днём - аудио-курсы. Временами новые темы даются легко. Временами - со скрипом. Аудио-лингвальный курс очень помогает в плане произношения. Спасибо "школе разведчиков".

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

До        После

понедельник, 24 октября 2016 г.

Java

Скоро, скоро уже приступлю к изучению Java...
На Stepic.org записался на курс "Основы программирования для Linux". Что называется, "синдром плюшкина". Хочется сразу успеть изучить всё и везде. Уже от нескольких курсов пришлось отказаться, т.к. не было времени на их изучение и выполнение тестовых заданий. Посмотрим, получится ли изучить этот курс.

Из курса программирования на C осталось просмотреть только один последний модуль по работе с файлами и итоговое занятие. Планирую ещё 1-2 дня порешать задачи на C для закрепления пройденного материала и буду переходить к Java.

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

До        После

среда, 19 октября 2016 г.

Интересное

Нашёл несколько интересных статей и видео по Java и карьере начинающего разработчика. Выложу здесь ссылки:
1. Выступление Стаса Лозенко: "Level up для джуниора: конкретные шаги":
Стас рассказывает про то, как можно за пол года изучить программирование на Java до уровня, при котором можно претендовать на должность middle-developer, какие книжки обязательны к прочтению и, как создать своё портфолио начинающему разработчику.
Дума, что по мере освоения Java я буду не раз ещё возвращаться к этому видео.

2. Статьи Стаса Лозенко по Java.
Пока что их не читал. Но обязательно займусь этим до начала курса программирования на Java.

3. Выступление Сергея Немчинского: "Как создаются и поддерживаются Enterprise системы":
Сергей рассказывает о том, как правильно разрабатывать и поддерживать Enterprise системы,  с чем при этом придётся столкнуться разработчику, что при этом нужно делать, а чего делать нельзя, приводит перечень часто применяемых анти-паттернов.

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

5. Вводная лекция Сергей Немчинского по джедайским техникам Максима Дорофеева:
В видео Сергей рассказывает: про особенности работы мозга человека, о том, что нельзя хранить в оперативной памяти много информации, что мозг человека состоит из двух неравнозначных частей ("обезьянки" и "человека"), что "обезьянка" любит развлекаться, а "человек" не любит работать, что "человек" может "дрессировать" "обезьянку" и перекладывать на неё часть своей работы.


Буду пополнять пополнять этот пост по мере обнаружения всяких интересностей.

До        После

вторник, 18 октября 2016 г.

Рекуррентные вычисления

Вчера на курсе программирования на C изучали рекуррентные вычисления на примере создания программы для печати чисел Фибоначчи. Было очень интересно и познавательно. Осталось научиться вспоминать о возможности таких вычислений при написании подобных программ самостоятельно. ))

На курсе английского изучаем модальные глаголы. Мне эта тема показалась немного запутанной, как будто ведущая чего-то не договаривает. Посмотрим, что будет дальше. Если в видео-курсе ничего толком не объяснят, то придётся почитать ещё какую-нибудь книжку.
Помнится, лет 15 назад изучал английский по книге А.Н.Драгункина (тогда ещё не было "этих ваших "интернетов"). Вроде бы там про правила употребления глаголов было очень доступно расписано.

Книжку по программированию не открывал уже дня 3-4. Надо это исправить.

На выходных по наступлению "мягкого" дэдлайна прошёл очередной модуль курса "Научное мышление".

До        После