• 0.66

  • +1.10

  • ,

Наконец стал разработчиком [volume 2] спустя девять месяцев работы.

Добрый день.

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

На первом месте работы (название фирмы приводить не буду, скажу только, что это была outsource-компания) мне довольно быстро надоело. Все было там хорошо, но только серьезных java-проектов не было, гораздо больше было C#/.net-проектов. К тому же за пол года я устал копаться в opensource-коде (удовольствие явно ниже среднего). Библиотеки и инструменты, с которыми я успел познакомиться, самые стандартные: java, groovy, tomcat, hibernate, немного spring, много linux, очень много субд oracle и postgreSQL.

Но, одним жарким летним утром мне позвонили из компании, которая делает клиент-серверное приложение для очень большой букмекерской конторы, и предложили работу. Деньги были больше, задачи интереснее. Конечно я сразу согласился. Самое смешное, что за пол года до этого я проходил у них собеседование (когда искал работу в первый раз) и они мне отказали. Но теперь я был чуть опытнее и немного наглее. Поэтому следующие несколько месяцев я проработал там. Однако я быстро понял, в чем состоит отличие между клиент-серверными приложениями и web-приложениями. Я хотел заниматься именно последними. Здесь мы не очень плавно переходим к следующей части повествования. Инструменты, с которыми я успел поработать в этой фирме: java, SWT.

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

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

С уважением
Сергей Алещенко

Наконец стал разработчиком.

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

  • В образовании я продвинулся довольно далеко, закончил самый большой университет Санкт-Петербурга. Правда совершенно по другой специальности: механика деформируемого твердого тела. На момент начала прохождения JavaRush учился на 3-ем курсе аспирантуры РАН (специальность — численная механика).
  • Даже и не помню, почему я решил начать заниматься именно на JavaRush. Я давно хотел всерьез заняться разработкой, но чтение «талмудов» по языкам только отбивало охоту. Надо было найти принципиально другой подход, и я опробовал первые десять уровней курса. Видимо благодаря ним я и решился на незамедлительное приобретение безлимитной подписки с участием в реальном проекте.
  • Учеба шла довольно медленно, но я не переставая двигался вперед. Прошел 31 уровень с процентом решенных задач близким к 100. На это у меня ушел ровно один год.
  • Настало время стажировки. Тестовое задание я с треском провалил. Нужно было написать небольшое web-приложение, но сделать этого я не успел, поскольку на тот момент даже не знал слов типа «Spring», «Hibernate», «Tomcat» и т.п. Ждать следующего набора на стажировку мне не хотелось, и я самостоятельно написал 5-6 web-приложений аналогичных тестовому заданию. Их довольно много в сети, есть даже пошаговые видео-мануалы.
  • Отдельным и очень важным пунктом хотелось бы выделить рассылку резюме и прохождение собеседований.
    В первую очередь хочу сказать, что если Вы, дорогой читатель, рассылаете меньше, чем 10-15 резюме в день, то Вы — ленивая задница. Надеюсь с этим разобрались.
    Также надо быть готовым к тому, что Вам придется каждый раз напоминать о себе телефонным звонком в ту фирму, куда Вы выслали резюме. Что касается собеседований — то с вероятностью, близкой к 100 процентам, вы получите какой-нибудь хардкорный тест, аналогичный тем, которыми изобилует Quizful и прочие ресурсы. Я категорически рекомендую потренироваться на таких тестах.
    На поиск работы у меня ушло 3 недели. За это время я прошел четыре очных собеседования и два — по скайпу. Отказов были десятки. На последнем, заочном собеседовании, меня и взяли на работу.
  • Теперь немного о работе.
    Я попал в довольно крупную фирму (порядка 100-120 разработчиков). Очень широкий спектр задач и разнообразных проектов (в зависимости от заказчика), начиная от frontend'а и заканчивая суровым и беспощадным backend'ом и datamining'ом. Собственно, меня сразу задействовали в etl-проектах, и я занялся загрузкой и обработкой массивов данных для целого ряда зарубежных заказчиков. Платформа и все инструменты, которые я использую, являются opensource'ными. Почти все из них написаны на Java и Groovy (если кто-то не знаком с Groovy — замечательная штука, рекомендую). Конечно, периодически приходится копаться в исходниках, ибо все это дело очень тяжеловесное, и его нужно регулярно допиливать, оптимизировать и исправлять. Работаю я около месяца. За это время мне так интенсивно «ездили по мозгам», что я проглотил объем информации, на самостоятельное усвоение которой у меня ушло бы года 2-3 по меньшей мере.
  • И последнее. Этот пункт сэкономит Вам уйму времени, когда Вы будете готовиться. За время обучения я купил несколько книг: Философия Java (Брюс Эккель), Алгоритмы: построение и анализ (Кормен, Лейзерсон, Ривест, Штайн) и еще несколько по базам данных и архитектуре компьютера.
    Знаете что? Забейте. Я серьезно, забейте. Я не дочитал ни одной книги до конца. Чтение книг — очень полезное занятие, но не в этом случае.
    Я постараюсь объяснить свою точку зрения: в данный момент Ваша цель — устроиться работать программистом. Для этого не нужны глубокие знания в программировании, на развитие которых и нацелено прочтение книг. В данный момент Вам нужен вполне определенный набор практических навыков и умений. Выковыривать их из книг — занятие крайне неблагодарное и утомительное. Гораздо лучшими помощниками в этом деле будут JavaRush или, если есть возможность — участие в каком-нибудь opensource-проекте. Что-то полезное Вам вряд ли удастся сделать, но хотя бы послушаете умные разговоры коллег по проекту — может чего-нибудь нахватаетесь. Хотя участие в проектах вовсе не обязательно. А если потребуются глубокие знания в чем-нибудь, то вы спокойно найдете их в книге и сразу же используете для своих задач. При этом нет никакой нужды глотать всю книгу целиком.

Думаю, пора закругляться. Все, кто дочитал до конца — молодцы. Желаю всем сохранять позитивный настрой и уверенно двигаться к намеченным целям.


С уважением
Сергей Алещенко

Продолжение

Вопрос общего характера про потоки ввода/вывода.

Всем привет. У меня есть пара вопросов про чтение и запись в текстовый файл, возникших видимо от недопонимания происходящего. Думаю, не мне одному это будет интересно. Буду выкладывать код, которые не работает, по крайней мере у меня.
Вот простая задача level19.lesson10.home07:


/* Длинные слова
В метод main первым параметром приходит имя файла1, вторым - файла2
Файл1 содержит слова, разделенные пробелом.
Записать через запятую в Файл2 слова, длина которых строго больше 6
Закрыть потоки

Пример выходных данных:
длинное,короткое,аббревиатура
*/

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        FileReader fileReader = new FileReader("input.txt");    // Пока указал имена файлов явно
        FileWriter fileWriter = new FileWriter("output.txt");

        BufferedReader reader = new BufferedReader(fileReader);

        String line;
        List<String> sourceLines = new ArrayList<String>();


        while ((line = reader.readLine()) != null)    // Чтение файла построчно
            sourceLines.add(line);

        for (int i = 0; i < sourceLines.size(); i++) {
            String[] splitedWords = sourceLines.get(i).split(" ");    // Разбиваем строку на слова

            for (int j = 0; j < splitedWords.length; j++) {    // Перебираем слова
                char[] charWord = splitedWords[j].toCharArray();    // Каждое слово преобразуем в массив символов
                if (charWord.length > 6) {    // Если длина массива больше 6 то:
                    System.out.println(charWord);    // Вывод в консоль только для проверки
                    fileWriter.write(charWord);    // Почему записи в файл не происходит???
                }

            }
        }

        br.close();
        fileReader.close();
        reader.close();
    }
}

Почему записи в файл не происходит? Также пытался записать данные с помощью других классов. Например:


public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        FileReader fileReader = new FileReader("input.txt");
        FileWriter fileWriter = new FileWriter("output.txt");

        BufferedReader reader = new BufferedReader(fileReader);
        BufferedWriter writer = new BufferedWriter(fileWriter);     // Здесь отличие

        String line;
        List<String> sourceLines = new ArrayList<String>();


        while ((line = reader.readLine()) != null)
            sourceLines.add(line);

        for (int i = 0; i < sourceLines.size(); i++) {
            String[] splitedWords = sourceLines.get(i).split(" ");

            for (int j = 0; j < splitedWords.length; j++) {
                char[] charWord = splitedWords[j].toCharArray();
                if (charWord.length > 6) {
                    System.out.println(charWord);
                    writer.write(charWord);    // И здесь тоже
                }

            }
        }

        br.close();
        fileReader.close();
        reader.close();
    }


level19.lesson03.task05

Очень хотелось сделать самому, но не идет.

import java.util.HashMap;
import java.util.Map;

/* Закрепляем адаптер
Адаптировать Customer и Contact к RowItem.
Классом-адаптером является DataAdapter.
Инициализируйте countries перед началом выполнения программы. Соответствие кода страны и названия:
UA Ukraine
RU Russia
CA Canada
*/

public class Solution {
    private static Map<String, String> countries = new HashMap<String, String>();

    static {
        countries.put("UA", "Ukraine");
        countries.put("RU", "Russia");
        countries.put("CA", "Canada");
    }

    public static class DataAdapter implements RowItem {
        private Customer customer;
        private Contact contact;

        public DataAdapter(Customer customer, Contact contact) {
            this.customer = customer;
            this.contact = contact;
        }

        @Override
        public String getCountryCode() {
            String country = customer.getCountryName();
            String result = null;

            for (Map.Entry<String, String> pair : countries.entrySet())
            {
                if (pair.getValue().equals(country))
                {
                   result =  pair.getKey();
                }
            }

            return country;
        }

        @Override
        public String getCompany() {
            return customer.getCompanyName();
        }

        @Override
        public String getContactFirstName() {
            return contact.getName().split(", ")[1];
        }

        @Override
        public String getContactLastName() {
            return contact.getName().split(", ")[0];
        }

        @Override
        public String getDialString() {

            return "callto://" + contact.getPhoneNumber().replaceAll("[()-]", "");
        }


        public static void main(String[] args)
        {
            Customer customer = new Customer() {
                public String getCompanyName() {
                    return "JavaRush Ltd.";
                }

                public String getCountryName() {
                    return "Ukraine";
                }
            };
            Contact contact = new Contact() {
                public String getName() {
                    return "Ivanov, Ivan";
                }

                public String getPhoneNumber() {
                    return "+38(050)123-45-67";
                }
            };

            RowItem rowItem = new DataAdapter(customer, contact);
            System.out.println(rowItem.getCountryCode());
            System.out.println(rowItem.getCompany());
            System.out.println(rowItem.getContactFirstName());
            System.out.println(rowItem.getContactLastName());
            System.out.println(rowItem.getDialString());
        }
    }

    public static interface RowItem {
        String getCountryCode();        //example UA
        String getCompany();            //example JavaRush Ltd.
        String getContactFirstName();   //example Ivan
        String getContactLastName();    //example Ivanov
        String getDialString();         //example callto://+380501234567
    }

    public static interface Customer {
        String getCompanyName();        //example JavaRush Ltd.
        String getCountryName();        //example Ukraine
    }

    public static interface Contact {
        String getName();               //example Ivanov, Ivan
        String getPhoneNumber();        //example +38(050)123-45-67
    }
}



Main только для проверки. Все какие танцы с бубном знаю — уже оттанцевал.

level13.lesson11.bonus01


package com.javarush.test.level13.lesson11.bonus01;

/* Сортировка четных чисел из файла
1. Ввести имя файла с консоли.
2. Прочитать из него набор чисел.
3. Вывести на консоль только четные, отсортированные по возрастанию.
Пример ввода:
5
8
11
3
2
10
Пример вывода:
2
8
10
*/

import java.io.*;
import java.util.*;

public class Solution
{
    public static void main(String[] args) throws IOException {
        // напишите тут ваш код
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        List<Integer> numbers = new ArrayList<Integer>();
        Scanner in = new Scanner(new File(reader.readLine()));

        while (in.hasNextInt()) {                           // Заполняем List числами, прочитанными из файла
                numbers.add(in.nextInt());
        }


        for (int i = 0; i < numbers.size(); i++) {          // Удаляем все нечетные числа
            if ((numbers.get(i) % 2) != 0) {
                numbers.remove(i);
            }
        }


        for (int i = 0; i < numbers.size(); i++) {           // Сортировка по возрастанию
            for (int j = i + 1; j < numbers.size(); j++) {
                if(numbers.get(j) < numbers.get(i)) {
                    int temp = numbers.get(i);
                    numbers.set(i, numbers.get(j));
                    numbers.set(j, temp);
                }
            }
        }


        for (int i = 0; i < numbers.size(); i++) {           // Вывод результата
            System.out.println(numbers.get(i));
        }

        in.close();
        reader.close();

    }
}


Всем привет. Не могу понять, почему сервер не принимает. Подскажите кто чем может.
  • ,

level07.lesson06.task01


package com.javarush.test.level07.lesson06.task01;

/* 5 различных строчек в списке
1. Создай список строк.
2. Добавь в него 5 различных строчек.
3. Выведи его размер на экран.
4. Используя цикл выведи его содержимое на экран, каждое значение с новой строки.
*/

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;

public class Solution
{
    public static void main(String[] args) throws Exception
    {
        //Напишите тут ваш код

            //Напишите тут ваш код

            Reader r = new InputStreamReader(System.in);
            BufferedReader reader = new BufferedReader®;

            ArrayList<String> list = new ArrayList<String>();
            for (int i = 0; i < 5; i++) {
                String s = reader.readLine();
                list.add(s);
            }

            System.out.println(list.size());

            for (int j = 0; j < list.size(); j++) {
                System.out.println(list.get(j));
            }

        }

    }


Добрый день.
Не могу разобраться, сервер выдает сообщение: «Задача работала слишком долго и была закрыта». Задача вроде простая. Объясните мне, тупому.
  • ,

level07.lesson04.task02


package com.javarush.test.level07.lesson04.task02;

import java.io.BufferedReader;
import java.io.InputStreamReader;
/* Массив из строчек в обратном порядке
1. Создать массив на 10 строчек.
2. Ввести с клавиатуры 8 строчек и сохранить их в массив.
3. Вывести содержимое всего массива (10 элементов) на экран в обратном порядке. Каждый элемент - с новой строки.
*/

public class Solution
{
    public static void main(String[] args) throws Exception
    {
        //Напишите тут ваш код

        String[] list = new String[10];

        for (int i = 0; i < 8; i++) {
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            list[i] = reader.readLine();
        }

        for (int j = list.length - 1; j >= 0 ; j--) {
            System.out.println(list[j]);
        }

    }
}


Решительно не понимаю, но сервер не ест.