level18.lesson05.task03

package com.javarush.test.level18.lesson05.task03;

/* Разделение файла
Считать с консоли три имени файла: файл1, файл2, файл3.
Разделить файл1 по следующему критерию:
Первую половину байт записать в файл2, вторую половину байт записать в файл3.
Если в файл1 количество байт нечетное, то файл2 должен содержать бОльшую часть.
Закрыть потоки. Не использовать try-with-resources
*/


import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;

public class Solution {
    public static void main(String[] args) throws Throwable {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String name1 = reader.readLine();
        String name2 = reader.readLine();
        String name3 = reader.readLine();

        FileInputStream stream = new FileInputStream(name1);
        FileOutputStream out1 = new FileOutputStream(name2);
        FileOutputStream out2 = new FileOutputStream(name3);

        byte[] buffer = new byte[stream.available()];
        stream.read(buffer);

        int count = stream.available();
        int count2 = stream.available()%2==0 ? stream.available()/2 : stream.available()/2 + 1;
        int count3 = count-count2;

        out1.write(buffer, 0, count2);
        out2.write(buffer, count2, count3);

        stream.close();
        out1.close();
        out2.close();
        reader.close();

    }
}


Помогите разобраться, в чём ошибка? Вроде всё предельно просто, но не проходит
  • ,

Ответы на вопросы к собеседованию Level31

1 Может ли объект File соответствовать файлу, которого еще нет?
Да, если передать в конструктор значение директории.

String dirPath = "/";
File f = new File(dirPath);
File[] files = f.listFiles();

Так делают
например для того, чтобы получить массив файлов.

public class MyClass {
    public static void main(String[] args) {
        boolean isObject = false;

        
        File file = new File("/");
        if (file instanceof Object){
            isObject = true;
        }
        boolean isFile = file.isFile(); // Tests whether the file denoted by this abstract pathname is a normal file.
Это из документации
        System.out.println(isObject + " "+ isFile);

    }
}

Вывод: true false
File наследуется от object. Ответ: да
Жду комментариев.
2 Как преобразовать объект File к типу Path?
Метод toPath();
toPath(); //Returns a java.nio.file.Path object constructed from the this abstract path.

3 Зачем нужен класс Files?
Взяли за основу класс File, добавили в него немного нового, переименовывали методы, а в конце еще и разделили на два. Так что теперь есть два новых класса – Path и Files. Path – это, фактически новый аналог класса File, а Files – это утилитный класс (по аналогии с классами Arrays & Collections), в него вынесли все статические методы класса File. Так «правильнее» с точки зрения ООП.
Немного из документов:
public final class Files
extends Object
This class consists exclusively of static methods that operate on files, directories, or other types of files.
In most cases, the methods defined here will delegate to the associated file system provider to perform the file operations.

4 Какие классы для архивации вы знаете?
Неплохая статья на эту тему и выдержка из нее: crypto.pp.ua/2010/06/arxivaciya-v-java/
Для работы с архивами в спецификации Java существуют два пакета – java.util.zip и java.util.jar соответственно для архивов zip и jar. Различие форматов jar и zip заключается только в расширении архива zip. Пакет java.util.jar аналогичен пакету java.util.zip, за исключением реализации конструкторов и метода voidputNextEntry(ZipEntry e) класса JarOutputStream. Ниже будет рассмотрен только пакетjava.util.jar. Чтобы переделать все примеры на использование zip-архива, достаточно всюду
в коде заме¬нить Jar на Zip
5 Как добавить директорию в архив?
Для себя я понял этот вопрос, как добавление пустой директории в готовый архив. Никаких рабочих примеров я не нашел. Вот код: (Он наглядно показывает, что можно в архив положить любой файл, а вот с пустой директорией… я не знаю как ответить, постить на StackOverFlow не стал, за такой вопрос заминусят точно) Если у кого есть предложения, то напишите.

public class Main {
    public static void main(String[] args) {
        String[] myFiles = {"D:\\forJava\\MyArtifactName\\packForTest\\res2.txt",
                "D:\\forJava\\MyArtifactName\\packForTest\\res.txt",
                "D:\\forJava\\MyArtifactName\\packForTest\\res4.txt",
                "D:\\forJava\\MyArtifactName\\packForTest\\testDir\\"
                };
        String zipFile = "D:\\forJava\\MyArtifactName\\packForTest\\res.zip";
        ZipUtility zipUtil = new ZipUtility();
        try {
            zipUtil.zip(myFiles, zipFile);

        } catch (Exception ex) {
            // some errors occurred
            ex.printStackTrace();
        }
    }
}

Вопрос о последней testDir, ее то как раз в получившийся архив JVM не кладет, со всеми остальными txt – файлами норм получается.
ZipUtility.java:

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipUtility {

    private static final int BUFFER_SIZE = 4096;

    public void zip(List<File> listFiles, String destZipFile) throws IOException {
        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(destZipFile));
        for (File file : listFiles) {
            if (file.isDirectory()) {
                zipDirectory(file, file.getName(), zos);
            } else {
                zipFile(file, zos);
            }
        }
        zos.flush();
        zos.close();
    }

    public void zip(String[] files, String destZipFile) throws IOException {
        List<File> listFiles = new ArrayList<File>();
        for (int i = 0; i < files.length; i++) {
            listFiles.add(new File(files[i]));
        }
        zip(listFiles, destZipFile);
    }

    private void zipDirectory(File folder, String parentFolder, ZipOutputStream zos) throws  IOException {
        for (File file : folder.listFiles()) {
            if (file.isDirectory()) {
                zipDirectory(file, parentFolder + "/" + file.getName(), zos);
                continue;
            }
            zos.putNextEntry(new ZipEntry(parentFolder + "/" + file.getName()));
            BufferedInputStream bis = new BufferedInputStream(
                    new FileInputStream(file));
            long bytesRead = 0;
            byte[] bytesIn = new byte[BUFFER_SIZE];
            int read = 0;
            while ((read = bis.read(bytesIn)) != -1) {
                zos.write(bytesIn, 0, read);
                bytesRead += read;
            }
            zos.closeEntry();
        }
    }

    private void zipFile(File file, ZipOutputStream zos)
            throws  IOException {
        zos.putNextEntry(new ZipEntry(file.getName()));
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
                file));
        long bytesRead = 0;
        byte[] bytesIn = new byte[BUFFER_SIZE];
        int read = 0;
        while ((read = bis.read(bytesIn)) != -1) {
            zos.write(bytesIn, 0, read);
            bytesRead += read;
        }
        zos.closeEntry();
    }
}

Код отсюда:
www.codejava.net/java-se/file-io/zip-directories

6 Зачем нужны Properties?
Properties – это файл свойств. Структура его: ключ – значение. Для работы с такими файлами в Java есть класс Properties, он унаследован от HashTable<Object, Object>
Есть статья про манипуляции с ним
www.mkyong.com/java/java-properties-file-examples/

7 В каком виде хранятся данные в файле .properties?
Ключ – значение.
8 Можно ли изменять данные в объекте Properties после загрузки их из файла?
Если он унаследован от HashMap, тогда можно, только потом нужно будет изменения в этот файл отписать. Для этого есть метод setProperty.
Вот код:

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * Created by Роман on 12.09.2016.
 */
public class LoadAndSetProperties {

    public static void main(String[] args) {

        Properties prop = new Properties();
        InputStream input = null;
        try {

            input = new FileInputStream("D:\\forJava\\MyArtifactName\\packForTest\\config.properties");

            // load a properties file
            prop.load(input);

            // get the property value and print it out


            prop.setProperty("database", "ddfdfdfdfdf");
            System.out.print(prop.getProperty("database"));
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            if (input != null) {
                try {
                    input.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

Вывод: ddfdfdfdfdf
9 Зачем нужен класс FileReader?
Java Docs:
public class FileReader

extends InputStreamReader

Convenience class for reading character files. The constructors of this class assume that the default character encoding and the default byte-buffer size are appropriate. To specify these values yourself, construct an InputStreamReader on a FileInputStream.
FileReader is meant for reading streams of characters.
Класс для чтения символов файлов. Конструкторы этого класса предполагают, что кодировка символов дефолтная и дефолтный размер буфера являются подходящими. Чтобы задать эти значения самостоятельно, следует построить InputStreamReader над FileInputStream. FileReader предназначен для считывания потоков символов.
10 Зачем нужен класс FileWriter?
public class FileWriter
extends OutputStreamWriter

Convenience class for writing character files. The constructors of this class assume that the default character encoding and the default byte-buffer size are acceptable. To specify these values yourself, construct an OutputStreamWriter on a FileOutputStream.
Whether or not a file is available or may be created depends upon the underlying platform. Some platforms, in particular, allow a file to be opened for writing by only one FileWriter (or other file-writing object) at a time. In such situations the constructors in this class will fail if the file involved is already open.
FileWriter is meant for writing streams of characters.
Класс для записи символов файлов. Конструкторы этого класса предполагают, что кодировка символов дефолтная и дефолтный размер буфера являются приемлемым. Чтобы задать эти значения самостоятельно, следует построить OutputStreamWriter над FileOutputStream. Является ли файл доступен для записи, зависит от используемой платформы. Некоторые платформы разрешают держать файл для записи только одним FileWriter (или другого объекта записи файла), в одно время. FileWriter предназначен для записи потоков символов. Для написания потоков необработанных байтов, используйте FileOutputStream.
Эти классы (FileReader и FileWriter) специально ориентированы для работы с текстом и строками.
  • ,

добавление пустой директории в zip Архив

В общем есть такой вопрос в собеседовании к Level31
номер 5: Как добавить директорию в архив?

Для себя я этот вопрос понял, как добавление пустой директории в уже готовый zipАрхив

Вот код.

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

Main:

public class Main {
    public static void main(String[] args) {
        String[] myFiles = {"D:\\forJava\\MyArtifactName\\packForTest\\res2.txt",
                "D:\\forJava\\MyArtifactName\\packForTest\\res.txt",
                "D:\\forJava\\MyArtifactName\\packForTest\\res4.txt",
                "D:\\forJava\\MyArtifactName\\packForTest\\testDir"
                };
        String zipFile = "D:\\forJava\\MyArtifactName\\packForTest\\res.zip";
        ZipUtility zipUtil = new ZipUtility();
        try {
            zipUtil.zip(myFiles, zipFile);

        } catch (Exception ex) {
            // some errors occurred
            ex.printStackTrace();
        }
    }
}


ZipUtility.java:

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipUtility {

    private static final int BUFFER_SIZE = 4096;

    public void zip(List<File> listFiles, String destZipFile) throws IOException {
        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(destZipFile));
        for (File file : listFiles) {
            if (file.isDirectory()) {
                zipDirectory(file, file.getName(), zos);
            } else {
                zipFile(file, zos);
            }
        }
        zos.flush();
        zos.close();
    }

    public void zip(String[] files, String destZipFile) throws IOException {
        List<File> listFiles = new ArrayList<File>();
        for (int i = 0; i < files.length; i++) {
            listFiles.add(new File(files[i]));
        }
        zip(listFiles, destZipFile);
    }

    private void zipDirectory(File folder, String parentFolder, ZipOutputStream zos) throws  IOException {
        for (File file : folder.listFiles()) {
            if (file.isDirectory()) {
                zipDirectory(file, parentFolder + "/" + file.getName(), zos);
                continue;
            }
            zos.putNextEntry(new ZipEntry(parentFolder + "/" + file.getName()));
            BufferedInputStream bis = new BufferedInputStream(
                    new FileInputStream(file));
            long bytesRead = 0;
            byte[] bytesIn = new byte[BUFFER_SIZE];
            int read = 0;
            while ((read = bis.read(bytesIn)) != -1) {
                zos.write(bytesIn, 0, read);
                bytesRead += read;
            }
            zos.closeEntry();
        }
    }

    private void zipFile(File file, ZipOutputStream zos)
            throws  IOException {
        zos.putNextEntry(new ZipEntry(file.getName()));
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
                file));
        long bytesRead = 0;
        byte[] bytesIn = new byte[BUFFER_SIZE];
        int read = 0;
        while ((read = bis.read(bytesIn)) != -1) {
            zos.write(bytesIn, 0, read);
            bytesRead += read;
        }
        zos.closeEntry();
    }
}

Java-конференция Joker 2016

14-15 октября в Петербурге уже в четвертый раз состоится Java-конференция Joker 2016, которая соберет более 1000 разработчиков уровня Senior/Middle. Конференция ориентирована на участников, которые хорошо разбираются в Java.



Спикеры конференции – ведущие мировые эксперты из США, Европы и России, такие как Алексей Шипилев, Барух Садогурский, Евгений Борисов и многие другие. Полный список спикеров и докладов вы найдете на сайте конференции: jokerconf.com/

Кроме того, в рамках конференции пройдет специальная программа для начинающих разработчиков и студентов, изучающих Java. Подробности о Joker Student Edition: jokerconf.com/se.html
  • ,

Хочу критику кода (новичок)

После того как бесплатные уроки кончились, а оплатить подписку я не мог (и пока не могу). Я стал смотреть разные видео на ютьюбе. Ну и в общем пришел к тому, что захотелось по практиковаться на чем-то. Хотел было попробовать андройд, но мой слабый комп не тянет (15 минут запускается эмулятор и еще 10 минут компилируется проект) Пришлось сделать выбор в пользу JavaFX. Его API мне показался не сложным и решил попробовать написать тетрис. Кое как мне удалось примерно понять идею того, как он должен работать (гуманитарий). Стал пробовать писать, долго доходил до понимания некоторых алгоритмовю. Позже в паблике JavaRush нашелся человек, который дает мне советы в некоторых моментах логики. В общем сам по себе тетрис можно сказать работает (остался один баг с вращением), но он еще не дописан до конца. Я бы хотел услышать критику имеющегося кода и разные советы. Он может казаться нагроможденным иногда. Я создал 4 класса- первые два это классы фигуры и поля, третий класс контроллер, содержащий логику и последний класс, где вызывается обновление и рендерится целиком все поле по таймеру. Проект Идеи в репозитории github.com/ZackFox/TetrisJava/tree/master/src/sample
  • ,

level06.lesson11.bonus02

Приветствую, коллеги. Компилируется без ошибок, работает, тест не проходит, никак не могу найти проблему.
Спасибо всем за внимание.

package com.javarush.test.level06.lesson11.bonus02;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/* Нужно добавить в программу новую функциональность
Задача: У каждой кошки есть имя и кошка-мама. Создать класс, который бы описывал данную ситуацию. Создать два объекта: кошку-дочь и кошку-маму. Вывести их на экран.
Новая задача: У каждой кошки есть имя, кошка-папа и кошка-мама. Изменить класс Cat так, чтобы он мог описать данную ситуацию.
Создать 6 объектов: дедушку(папин папа), бабушку(мамина мама), папу, маму, сына, дочь.
Вывести их всех на экран в порядке: дедушка, бабушка, папа, мама, сын, дочь.

Пример ввода:
дедушка Вася
бабушка Мурка
папа Котофей
мама Василиса
сын Мурчик
дочь Пушинка

Пример вывода:
Cat name is дедушка Вася, no mother, no father
Cat name is бабушка Мурка, no mother, no father
Cat name is папа Котофей, no mother, father is дедушка Вася
Cat name is мама Василиса, mother is бабушка Мурка, no father
Cat name is сын Мурчик, mother is мама Василиса, father is папа Котофей
Cat name is дочь Пушинка, mother is мама Василиса, father is папа Котофей
*/

public class Solution
{
    public static void main(String[] args) throws IOException
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String gfatherName = reader.readLine();
        Cat catGFather = new Cat(gfatherName);

        String gmotherName = reader.readLine();
        Cat catGMother = new Cat(gmotherName);

        String fatherName = reader.readLine();
        Cat catFather = new Cat(fatherName,null, catGFather);

        String motherName = reader.readLine();
        Cat catMother = new Cat(motherName, catGMother, null);

        String sonName = reader.readLine();
        Cat catSon = new Cat(sonName, catMother, catFather);

        String daughterName = reader.readLine();
        Cat catDaughter = new Cat(daughterName, catMother, catFather);

        System.out.println(catGFather);
        System.out.println(catGMother);
        System.out.println(catFather);
        System.out.println(catMother);
        System.out.println(catSon);
        System.out.println(catDaughter);
    }

    public static class Cat
    {
        private String name;
        private Cat mother;
        private Cat father;

        Cat(String name)
        {
            this.name = name;

        }

        Cat(String name, Cat mother, Cat father)
        {
            this.name = name;
            this.mother = mother;
            this.father = father;
        }


        @Override
        public String toString()
        {
            if ((mother == null)&&(father == null))
                return "Cat name is " + name + ", no mother"+", no father";
            else if (mother == null)
                return "Cat name is " + name + ", no mother"+", father is " + father.name;
            else if (father ==null)
                return "Cat name is " + name + ", mother is " + mother.name+", no father";
            else
                return "Cat name is " + name + ", mother is " + mother.name+", father is " + father.name;



        }
    }

}

Подбор сайтов для оттачивания навыков в программировании

  1. Codewars
  2. Codewars — отличный сервис для закрепления навыков программирования на Ruby, JavaScript, Java, Python, Clojure, CoffeeScript, C#, Haskell. Представлены как алгоритмические задачи, так и практические задачи, связанные с шаблонами проектирования. После каждой решенной задачи вы можете посмотреть на другие решения, рассортированные по рейтингу в зависимости от их красоты и использования лучших практик в программировании.
  3. Leetcode
  4. Leetcode — сайт с алгоритмическими задачками для подготовки к техническим собеседованиям в такие крупные фирмы, как Google и Facebook. Возле каждой задачи есть обсуждение, в котором так или иначе может фигурировать решение к этой задаче. Можно использовать различные языки программирования: C, C++, Java, Python, C#, JavaScript, Ruby, Bash.
  5. Programming Praxis
  6. Programming Praxis — блог, включающий целый ряд интересных задач, решения которых можно проверить на нескольких языках программирования.
  7. TopCoder
  8. TopCoder — активное сообщество программистов, которые любят решать головоломки. Много активных соревнований, некоторые из них включают денежные призы.
  9. C Puzzles
  10. C Puzzles предоставляет вам головоломки по программированию, характерные для языка Си (со всеми его причудами). Поскольку многие языки являются Си-подобными или напрямую выведенными из него, даже если вы не знаете язык Си как свой родной, велика вероятность, что вы поймете эти головоломки.
  11. Project Euler
  12. Цитата с главной страницы: «Project Euler — ряд бросающих вызов математических/программистских задач, которые предполагают наличие математической интуиции для их решения». Ресурс включает в себя как относительно простенькие, так и по-настоящему сложные задачки.
  13. Codeforces
  14. Полноценный русскоязычный аналог уже упомянутого Topcoder.
  15. Сборник задач от CppStudio
  16. Задачки в основном на проверку знаний С++, однако реализуемы и на других языках программирования.
  17. Timus Online Judge
  18. Timus Online Judge — это крупнейший в России архив задач по программированию с автоматической проверяющей системой. Основной источник задач для архива — соревнования Уральского федерального университета, Чемпионаты Урала, Уральские четвертьфиналы ACM ICPC, Петрозаводские сборы по программированию.
  • ,

Как стать программистом (часть 4) — установка необходимого ПО

Первая часть статьи: определяемся с пулом технологий
Вторая часть статьи: основные источники информации
Третья часть статьи: дополнительные, но важные источники информации

Выбери среду разработки и установи на свою рабочую машину всё необходимое ПО


выбор среды разработки
Если ты выбрал JavaRush, там тебе расскажут и покажут, что нужно установить для того, чтобы ты мог писать и запускать Java-программы на своем компьютере. Причем расскажут задолго до платных уровней, так что рекомендуем =). Тем не менее, кратко расскажем и здесь, что нужно делать.

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

Тем не менее, сегодня ты вряд ли встретишь профессионального Java-программиста, который работает без удобной интегрированной среды разработки (IDE, Integrated Development Environment) — специальной программы, которая позволяет писать код, распределять его по файлам и пакетам, подсвечивает код, исполняет код, указывает на ошибки… Хотя нет, ты можешь найти таких программистов в университетах и курсах. Только они обычно называются не «разработчики», а «преподаватели».

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

Для Java-разработчиков стандартами де-факто являются такие IDE как Eclipse и IntelliJ IDEA. Несколько лет превалировал Eclipse, но IDEA постепенно её догоняет. Первая среда хороша тем, что абсолютно бесплатна и к ней написана масса плагинов. Вторая существует в платной и бесплатной версии. Для твоих нынешних потребностей возможностей бесплатной версии хватает с головой. Кроме того, IDEA лояльнее к новичку, и, судя по отзывам, наиболее удобна программистам. Именно из-за того, что она такая классная, JavaRush рекомендует использовать именно IDEA. Специально для неё мы написали очень удобный плагин: ты его подключаешь и можешь делать задания курса и проверять их прямо из IDE, даже на сайт не заходя. Справедливости ради упомянем еще одну популярную IDE — NetBeans. Тоже неплохое решение, хотя чуть менее удобное, чем IDEA. И гораздо менее красивое.

Этому пункту и выводы не нужны. Просто установи всё вышеуказанное на свой компьютер и вперед. Или начни с JavaRush, там всё расскажут. Да, можно разок попробовать написать и запустить программу без IDE. Для понимания.

Первую часть статьи читайте здесь.
Вторую часть статьи читайте здесь.
Третью часть статьи читайте здесь.

Вакансия Java, Москва

Некоторое время не имею отношения к Java, хотя Android приходится интересоваться. Но попадаются запросы от знакомых, всё-таки технологии Java самые востребованные на рынке.

Вакансия Разработчик
Обязанности:
· Доработка существующего функционала основного приложения (комплексная автоматизация бизнес-процессов розничных и логистических бизнесов).

· Разработка нового функционала для приложений, постанавливаемых заказчикам (связка Java плюс Oracle в различных вариантах разных версий и не только).

Требования:
Обязательно:
Знание и навык работы с Java Core
Умение быстро разбираться в «чужом» коде
Опыт работы с DSCM (системы контроля версий Git, Mercurial).
Желательно:
Опыт работы с задачами для retail или управления складами. Разработка и поддержка приложений уровня предприятий (Enterprise level).
Опыт продолжения работ по разработке продукта с анализом «чужого» кода. В качестве компаний, с большой вероятностью предоставивших кандидату такой опыт являются банки, retail сети.
Способность выполнять рутинную работу в достаточно большом объеме по разбору кода, поиску отклонений, их исправлению, разработанного компанией-производителем основного продукта и приложений к нему.
Знание и навык работы с системой управления баз данных Oracle PL\SQL или любой другой промышленной СУБД
Знание Pro*C.
Знание MS Reports, Oracle Reports.
Условия:
· м. Парк Победы

· Оформление по ТК РФ

· График работы 5\2

· Официальная зарплата, индивидуально по итогам собеседования.
  • ,

Как стать программистом (часть 3)

Первая часть статьи: определяемся с пулом технологий
Вторая часть статьи: основные источники информации
Четвертая часть статьи: Выбери среду разработки и установи на свою рабочую машину всё необходимое ПО

Как стать программистом

Дополнительные, но важные источники информации: форумы


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

  1. ru.stackoverflow.com/questions/tagged/java — старый и полезный форум. Есть раздел на русском, но куда более обширной является его английская версия.
  2. toster.ru/tag/java/info — аналог Stackoverflow от создателей знаменитого Habrahabr
  3. javatalks.ru/ — чисто «джавистский» форум.
  4. help.javarush.ru/ — специальный форум для обсуждения задач JavaRush и не только.
  5. www.reddit.com/r/learnjava/ — тут тоже никто не будет смеяться над вопросами новичков.

Еще дополнительные источники информации: книги и справочники.
Онлайн-справочники по программированию

  1. docs.oracle.com/javase/7/docs/api/ — официальная документация. Сухая, непростая. Тем не менее, рекомендуется постепенно к ней привыкать, причем с самого начала. На английском.
  2. www.tutorialspoint.com/java/java_documentation.htm — простой справочник. Тоже на английском.

Книги по программированию

Самые простые и доступные по изложению книги по программированию. Как справочники не использовать!

  1. Head First in Java — мировой бестселлер серии Head First издательства O’Reilly. Написана с юмором и большим количеством лирических отступлений. Если чувствуешь себя неуверенно — рекомендуем.
  2. Книга Якова Файна «Программирование на Java для детей, родителей, бабушек и дедушек». На русском, рассчитанная в первую очередь на юных программистов, но не только.

Более фундаментальные издания для начинающих. Учебно-справочного толка.

  1. Кей Хорстманн «Java SE 8. Базовый курс» — неплохой учебник.
  2. Герберт Шилдт «Java 8. Полное руководство» — очень полный справочник.
  3. Брюс Эккель «Философия Java» — местами очень полезно. По ней есть викиучебник — wikijava.it-cache.net/index.php?title=Глава_1_Thinking_in_Java_4th_edition

Наконец-то краткое подведение итогов (исходя из всех трех частей статьи):

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

Исходя из этого, у нас три пути:

Путь первый. Максимально эффективный.

Онлайн-курсы JavaRush + info.javarush + документация Java + форумы + книга + справочник + видео

  1. Основной источник знаний — интерактивные курсы JavaRush. Они здорово сэкономят твое время, так как в них, помимо лекций и проверяемых задач есть ссылки на хорошие источники дополнительных знаний. Плюс на курсе тебя будут учить искать информацию и составлять резюме. Ты будешь сосредоточен на главном — программировании, а не где найти источник информации. Но когда нужно искать, тебе придется искать.
  2. Регистрируемся на форумах.
  3. Покупаем/загружаем одну-две книги. Можно одну из самых простых, вторую — справочник.

Путь второй. Всё еще эффективный. Но очень дорогой.

  1. Основной источник знаний — дорогие курсы или персональный наставник. Он делает то, что JavaRush — объясняет теорию, говорит, где можно найти дополнительную информацию, выдает и проверяет задания. Только за гораздо большие деньги. И еще человеческий фактор прибавь. К слову, многие наставники рекомендуют JavaRush в качестве дополнения к их урокам ;).

Второй и третий пункт — те же, что и в первом пути.

Путь третий. Тернистый.

Если ты готов потратить очень много времени, приложить массу усилий, но совсем не готов к материальным тратам — тебе нужны бесплатные онлайн-курсы, микс из онлайн-видеокурсов и форумов. Выше — ссылка на массу полезных тебе материалов. Можешь пройти первые 10 уровней по JavaRush, скачать пару книг и поселиться на YouTube. А на форумах консультируйся насчет твоих решений.

Первую часть статьи читайте здесь.
Вторую часть статьи читайте здесь.
Четвертую часть статьи читайте здесь
  • ,

Как стать программистом (часть 2)

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

как стать программистом

Итак, ты определился с технологиями и целью. Что дальше?


Выбери 2-3 основных источника знаний по Java, а также с десяток дополнительных. Но не забывай «гуглить», если что-то не ясно.

В первую очередь тебе нужно изучить Java Core — основа языка, от неё уже можно отталкиваться. Настало время подумать, как именно ты будешь учиться.

Самостоятельно или с наставником?

Наставник
Наставник — это здорово, но вряд ли кто-то будет бесплатно с тобой возиться и учить. А если платно… Время хорошего разработчика стоит немало. Плохой же тебе не нужен — чему он тебя научит? Тем не менее, если у тебя есть человек, готовый тебя консультировать, заручись его поддержкой.

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

Теперь перемоем косточки дорогим курсам Java.

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

В последние годы появилась масса доступных курсов, они обойдутся слушателю примерно в 100 долларов за месяц. Допустим, ты решил на них пойти, какой специалист-преподаватель там тебя ждет? Размышления на эту тему снова загоняют нас на DOU: иди туда и снова оцени зарплаты Java-разработчиков. Скорее всего ты понимаешь, что учить программистов должен не джуниор, а хотя бы «просто» Software Engineer. Средняя зарплата, например, у киевского специалиста этого уровня — 2000 долларов. Допустим, в группу набрали 20 человек. Это само по себе не очень хорошо, слишком большая нагрузка на преподавателя: он просто не сможет физически уделить внимание коду каждого студента.

Чаще всего учебная группа состоит из десятка учащихся. Все вместе они платят 1000 долларов в месяц. Школа, которая ведет курсы, помимо специалиста, должна оплачивать аренду помещений, оборудование, коммунальные счета. И желательно хоть что-то заработать (вряд ли вы найдете много филантропов при платных школах). В самом лучшем случае учителю достанется долларов 500. При этом он тратит 2-3 вечера в неделю на лекции и еще массу времени на проверку задач. По идее, чтобы научиться программировать, человек должен писать программы каждый день, минимум — 5 раз в неделю. Сколько кода сгенерирует за неделю один ученик? А десять? Добросовестный преподаватель должен всё это проверить и проконсультировать студента, что правильно, а что не так. Это — прорва времени.

Это мы ведем к тому, что нанимать хорошего специалиста на недорогие курсы — абсолютно нерентабельно. В самом лучшем случае, Once in a blue moon, как говорят «у них» или «когда рак на горе свистнет», как говорят у нас, ты попадешь на «фаната», которому жутко нравится не только программировать, но и преподавать. Поэтому он нашел себе такую не слишком выгодную подработку. Не денег ради, кайфу ради.

Следующий вариант — онлайн-курсы, платные или бесплатные.

online courses
Большинство платных онлайн-курсов — это те же самые «очные», только лекции проходят через интернет. Недостатки практически идентичные — не лучшие преподаватели, крайне мало времени уделяется практическим занятиям студента и проверке его кода. А вот бесплатные курсы можешь использовать в качестве дополнительных источников. Их можно найти, например, на Youtube — они представляют собой видеоуроки. Если знаешь английский, попробуй найти пару-тройку курсов на западных ресурсах, например, Coursera.

Неплохие видеоуроки Java на Youtube:
www.youtube.com/playlist?list=PLY4rE9dstrJzKUZHdGgECOjJLaZBcUdCC
Новичкам от почти новичка: www.youtube.com/channel/UCK5d3n3kfkzlArMccS0TTXA
Еще курс, немного не структурирован, но многие темы разобраны неплохо: www.youtube.com/channel/UCg1x1VDcSzviGGH995gHnjw
Когда немного освоишься в программировании, какие-то темы можно смотреть здесь: habrahabr.ru/company/golovachcourses/blog/218841/
habrahabr.ru/company/golovachcourses/blog/215275/

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

Онлайн-курсы Java для начинающих

На английском языке, все рассчитаны на тех, кто ещё не программировал.
courses.caveofprogramming.com/courses/java-for-complete-beginners
www.coursera.org/learn/java-programming
www.edx.org/course/introduction-programming-java-part-1-uc3mx-it-1-1x-0

И тут одна загвоздочка…

Курсов и видеороликов много, из них можно почерпнуть очень много всего полезного. Однако при самостоятельном обучении возникает одно «но», очень принципиальное «но». Дело в том, что в программировании самое важное — программировать, то есть писать программы, а не изучать теорию. При самостоятельном обучении придется подбирать себе задачи самому, чтобы усвоить те или иные принципы. Новичку это непросто. Допустим, ты нашел источник упражнений: некоторые книги и бесплатные курсы содержат условия задач. Отлично, поехали решать!.. И тут кроется самая большая сложность: кто будет проверять правильность решения? Ты, наверное, удивишься, но даже если программа запускается и выдает правильный ответ, это вовсе не значит, что она работает правильно! Это может быть сладкой иллюзией. Что же делать? Новые технологии и всемирная паутина знают ответ на этот вопрос. И этот ответ — javarush.ru

javarush

Интерактивные курсы Java с автоматической проверкой задач



Мы разработали самый классный курс для изучения Java. И многие уже знают как он называется — JavaRush. Мы им гордимся, поскольку он из таких новичков, как ты, которые растеряно задают вопрос «что же делать, куда бежать, столько информации вокруг!» помогает делать программистов, готовых к первой работе. Самые главные «фичи» курса:

  • В нем есть продуманная структура. Поскольку его создавал практик, который отлично ориентируется в реалиях рынка, том, что нужно знать и уметь, в курсе отобрано только самое главное и в нужном порядке! Это очень важно для новичка. Для тебя, наверное, тоже, раз ты читаешь эту статью и пытаешься понять, как тебе действовать.
  • Курс на 80% состоит из практических заданий. За время обучения тебе придется решить более 1200 задач. Какие бывают задачи на JavaRush:

1. Маленькие «учебные» на закрепление пройденного в лекциях.
2. Хитрые задачи «на вырост». По уровню сложности они не отличаются от задач на закрепление, но специально помещены в курсе раньше, чем определенный кусок теории, необходимый для их решения. Это мобилизирует и заставляет человека гуглить и искать недостающий пазл теории. Всё как в настоящей работе.
3. Головоломные. Эти ребята заставляют включать голову на полную. Тебе нужно найти не теорию для решения, но само решение, алгоритм. Короче, хорошенько подумать. Это как задачи на сообразительность или задачи повышенной сложности из учебников.
4. Мини-проекты. Полезные большие задачи, разбитые на подзадачи для понимания, каким образом ведется разработка крупных проектов. Ты сам сделаешь несколько игр и полезных программ, которые можно применять в реальной жизни и дорабатывать.

  • И — самое важное — в курсе есть автоматическая проверка правильности решений! Вы можете решать задачи на странице курса или в IDE (интегрированная среда разработки, если еще не знаешь, что это такое, скоро узнаешь). Причем проверка эта происходит в считанные секунды. Это просто огромное преимущество JavaRush!
  • Курс на русском языке и лекции в нем поданы в виде текстового квеста, в котором ты будешь переходить с уровня на уровень, наращивая скиллы — скучно не будет!
  • В курсе даны ссылки на полезные дополнительные материалы, однако скилл гугления также намеренно прокачивается.
  • Вокруг JavaRush за 4 года существования образовалось огромное сообщество. В нем люди обсуждают задачи, решения, проблемы, делятся информацией.
  • Специальный сайт для решения и обсуждения задач: help.javarush.ru/
  • Основной курс состоит из 40 уровней, 10 из них — полностью бесплатны. Во время первого этапа обучения ты поймешь, подходит ли тебе JavaRush, так что тебе никто не продаст «кота в мешке», ты будешь точно знать, что покупаешь. К тому же цена всего курса очень доступна. Столько же ты заплатишь за два месяца обучения на «дешевых очных курсах». Ссылка на подписки на курс с ценами.
  • После прохождения курса (или большей его части) ты можешь записаться на стажировку — это совместная работа над настоящим серьезным проектом. Они проходят регулярно, и для этого тебе не нужно будет переезжать куда-либо. Успешное прохождение стажировки — красивая и не пустая строчка в твоем резюме со ссылкой на готовый проект.

Подробная статья о JavaRush — javarush.ru/24.html

Первую часть статьи читайте здесь
Третью часть статьи читайте здесь.
Четвертую часть статьи читайте здесь.