Bagaimana Java berbeda dari bahasa populer lainnya? Mengapa Java adalah bahasa pertama yang dipelajari? Mari kita membuat rencana yang akan membantu Anda mempelajari Java dari awal dan menggunakan keterampilan pemrograman dalam bahasa lain. Kami mencantumkan perbedaan antara membuat kode produksi di Jawa dan mengembangkan dalam bahasa lain. Mikhail Zatepjakin membaca laporan ini pada sebuah pertemuan untuk para calon peserta
magang di Yandex dan pengembang pemula lainnya - pertemuan Java Junior.
- Halo semuanya, nama saya Misha. Saya seorang pengembang dari Yandex.Market, dan hari ini saya akan memberi tahu Anda mengapa belajar Java dan bagaimana melakukannya secara efektif. Anda dapat mengajukan pertanyaan yang masuk akal: mengapa saya akan mengatakannya, dan bukan pengembang yang kuat dengan pengalaman bertahun-tahun? Faktanya adalah bahwa saya sendiri mempelajari Jawa baru-baru ini, sekitar satu setengah tahun yang lalu, jadi saya masih ingat bagaimana itu dan apa jebakannya.
Setahun yang lalu, saya mendapat magang di Yandex.Market. Mengembangkan backend untuk "I take", untuk Market itu sendiri, Anda mungkin menggunakannya. Sekarang saya terus bekerja di sana, di tim lain. Kami membuat platform analitik Yandex.Market untuk mitra bisnis.

Mari kita mulai. Mengapa belajar Java dari sudut pandang praktis? Faktanya adalah bahwa Java adalah bahasa pemrograman yang sangat terkenal. Dia memiliki komunitas yang sangat besar.
Sebagai contoh, ada semacam indeks TIOBE, indeks populer dari popularitas bahasa pemrograman, dan Java menempati posisi pertama di sana. Juga, di situs dengan lowongan, Anda mungkin akan melihat bahwa sebagian besar lowongan hanya tentang Jawa, yaitu, berkembang di Jawa, Anda selalu dapat menemukan diri Anda pekerjaan.
Karena komunitasnya sangat besar, pertanyaan Anda akan dijawab di beberapa Stack Overflow atau situs lain. Dan saat berkembang di Jawa, Anda sebenarnya menulis kode menggunakan JVM, sehingga Anda dapat dengan mudah beralih ke Kotlin, Scala, dan bahasa lain yang menggunakan JVM.

Apa yang baik dari sudut pandang ideologis Jawa? Ada berbagai bahasa pemrograman. Mereka memecahkan masalah yang berbeda, Anda tahu itu. Misalnya, dengan Python, sangat bagus untuk menulis skrip baris tunggal untuk menyelesaikan tugas cepat.
Pada pro, Anda dapat sepenuhnya mengontrol kode yang dapat dieksekusi. Misalnya, kami mengendarai mobil, kendaraan tak berawak Yandex, kode mereka tertulis di pro. Mengapa Jawa memiliki hal seperti itu - Pengumpul Sampah. Ini membersihkan RAM dari objek yang tidak perlu. Hal ini dimulai secara spontan dan membuat stop-the-world, yaitu, menghentikan sisa program dan pergi untuk menghitung objek, membersihkan memori dari objek. Jika hal seperti itu akan berhasil dalam drone, itu tidak keren. Drone Anda akan lurus, pada saat ini untuk menghapus memori dan tidak melihat jalan. Karena itu, drone ditulis pada pro.

Tugas apa yang dipecahkan Java? Ini terutama bahasa untuk mengembangkan program besar yang telah ditulis selama bertahun-tahun, puluhan atau ratusan orang. Secara khusus, banyak backend di Yandex.Market ditulis dalam Java. Kami memiliki tim yang tersebar di beberapa kota, masing-masing sepuluh orang. Dan kode ini mudah dipelihara, telah didukung selama sepuluh tahun atau lebih, dan pada saat yang sama orang-orang baru datang, mereka memahami kode ini.
Karakteristik apa yang harus dimiliki suatu bahasa agar kode di atasnya mudah didukung dan agar mudah dikembangkan dalam tim besar. Pertama-tama, ini harus berupa kode yang mudah dibaca, dan harus mudah untuk mengimplementasikan solusi arsitektur yang kompleks di atasnya. Artinya, seharusnya mudah untuk menulis abstraksi tingkat tinggi di atasnya, dll. Semua ini hanya memberi kita Java. Ini adalah bahasa yang berorientasi objek. Sangat mudah untuk mengimplementasikan abstraksi tingkat tinggi dan arsitektur kompleks di atasnya.
Ada juga banyak kerangka kerja dan pustaka untuk Java, karena bahasanya sudah lebih dari 15 tahun. Selama ini, semua yang dapat ditulis telah ditulis di atasnya, jadi ada banyak perpustakaan untuk semua yang dapat bermanfaat bagi Anda.

Menurut saya, keterampilan utama apa yang harus dimiliki seorang ahli jav pemula? Pertama-tama, ini adalah pengetahuan tentang bahasa inti Java. Lebih lanjut itu adalah kerangka kerja Injeksi Ketergantungan. Pembicara berikutnya, Kirill akan lebih banyak membicarakan hal ini. Saya tidak akan terlalu mendalam. Selanjutnya adalah pola arsitektur dan desain. Kita harus dapat menulis kode yang indah secara arsitektur untuk menulis aplikasi besar. Dan ini adalah semacam SQL atau ORM untuk tugas-tugas database. Dan ini lebih banyak tentang backend.

Ayo pergi! Inti Jawa. Di sini saya tidak akan terutama menemukan Amerika - Anda perlu tahu bahasa itu sendiri. Apa yang harus Anda perhatikan. Pertama, Java merilis banyak versi dalam beberapa tahun terakhir, yaitu, pada 2014-2015, yang ketujuh, kemudian yang kedelapan, kesembilan, kesepuluh, banyak versi baru dirilis, dan mereka memperkenalkan banyak hal baru yang keren, misalnya, Java Stream API , lambda, dll. Hal-hal keren yang sangat keren yang digunakan dalam kode produksi, yang ditanyakan saat wawancara dan yang perlu Anda ketahui. Karena itu, Anda tidak boleh mengambil buku dari rak di perpustakaan Java-4 dan belajarlah. Rencana seperti itu: pelajari Java-8 atau lebih tinggi.
Kami dengan cermat memperhatikan inovasi seperti Stream API, var, dll. Mereka diminta saat wawancara dan terus-menerus digunakan dalam produksi. Artinya, Stream API jauh lebih keren daripada siklus, secara umum, hal yang sangat keren. Pastikan untuk memperhatikan.
Dan ada banyak hal seperti iterator, Pengecualian, dan sebagainya. Apa yang tampaknya tidak penting bagi Anda saat Anda menulis beberapa kode kecil sendiri. Anda tidak membutuhkan Pengecualian ini, siapa yang membutuhkannya? Tetapi mereka pasti akan diminta saat wawancara, mereka pasti akan berguna bagi Anda dalam produksi. Secara umum, ada baiknya memperhatikan Pengecualian, iterator dan hal-hal lainnya.

Struktur data. Tanpa struktur, tidak ada tempat, akan lebih bagus jika Anda tidak hanya tahu bahwa ada set, kamus, lembar. Dan juga implementasi struktur yang berbeda. Sebagai contoh, kamus yang sama di Jawa memiliki banyak implementasi, termasuk HashMap dan TreeMap. Mereka memiliki asimtotik yang berbeda, mereka diatur secara berbeda di dalam. Anda perlu tahu perbedaannya, kapan yang digunakan.
Ini juga akan bagus jika Anda tahu bagaimana struktur data ini bekerja di dalamnya. Artinya, tidak mudah untuk mengetahui asimptotiknya - berapa banyak taruhannya bekerja, berapa banyak bagian yang bekerja, dan bagaimana struktur di dalamnya bekerja - misalnya, apa itu ember di HashMap.
Anda juga perlu memperhatikan pohon dan grafik. Ini adalah hal-hal yang tidak terlalu banyak dalam kode produksi, tetapi mereka dicintai dalam wawancara. Oleh karena itu, Anda harus dapat berkeliling pohon, grafik lebar, kedalaman. Ini semua adalah algoritma sederhana.
Segera setelah Anda mulai menulis kode apa pun yang entah bagaimana besar, kompleks, menggunakan pustaka, kode multi-kelas, Anda akan menyadari bahwa sulit bagi Anda tanpa membangun sistem dan menyelesaikan dependensi. Ini terutama Maven dan Gradle. Mereka memungkinkan Anda untuk mengimpor perpustakaan ke proyek Anda benar-benar dalam satu baris. Yaitu, Anda menulis xml baris tunggal dan mengimpor ke proyek perpustakaan. Sistem hebat. Mereka hampir sama, gunakan Maven atau Gradle.
Berikutnya adalah beberapa sistem kontrol versi. Saya merekomendasikan Git karena populer, ada banyak tutorial. Hampir semua orang menggunakan Git, hal yang keren, tanpa itu di mana pun.
Dan - beberapa lingkungan pengembangan. Saya merekomendasikan IntelliJ Idea. Ini sangat mempercepat proses pengembangan, banyak membantu Anda, setiap kode boilerplate menulis untuk Anda, secara umum, keren.

SQL Sedikit tentang backender. Faktanya, ini adalah kasus yang lucu. Dua hari sebelum wawancara magang kedua saya, seorang gadis SDM menelepon saya dan mengatakan bahwa dalam dua hari mereka akan bertanya kepada saya SQL dan HTTP, saya perlu belajar. Dan saya tidak tahu tentang SQL atau tentang HTTP tentang apa pun. Dan saya menemukan situs yang sangat keren -
SQLZOO . Di atasnya, saya belajar SQL selama 12 jam, dalam arti, sintaks SQL, cara menulis pertanyaan SELECT, BERGABUNG, dll. Sebuah situs yang sangat keren, saya sangat merekomendasikannya. Sebenarnya dalam 12 jam saya belajar 90% dari apa yang saya ketahui sekarang.
Ini juga bagus untuk mengetahui arsitektur basis data. Ini semua jenis kunci, indeks, normalisasi. Tentang itu ada serangkaian posting di Habré.

Di Jawa, selain SQL, ada segala macam sistem pemetaan Object-relational seperti JPA. Ada beberapa kode. Pada metode pertama, beberapa kode SQL adalah SELECT id name FROM info.users WHERE id IN userIds. Dari basis data pengguna, dari tabel, pengidentifikasi dan nama mereka diterima.
Selanjutnya, ada semacam mapper yang mengubah objek dari basis menjadi objek Java. Dan ada metode ketiga di bawah ini, yang sebenarnya mengeksekusi kode ini. Semua ini menggunakan JPA dapat diganti dengan satu baris, yang ditulis di bawah ini. Dia melakukan hal yang sama - temukan All ByIdIn. Yaitu, dengan nama metode, itu menghasilkan permintaan SQL untuk Anda.
Hal yang sangat keren. Ketika saya tidak tahu SQL, saya sendiri menggunakan JPA. Secara umum, perhatikan. Jika Anda terlalu malas untuk belajar SQL - fire. Dan, secara umum, api!

Musim semi Siapa yang pernah mendengar hal seperti kerangka kerja Spring? Lihat berapa banyak dari Anda? Untuk alasan yang bagus. Musim semi adalah persyaratan setiap pekerjaan kedua untuk Java backend. Tanpa itu, tidak ada tempat untuk dikembangkan. Apa itu Spring? Ini terutama kerangka Ketergantungan Injeksi. Pembicara berikutnya juga
akan membicarakan hal ini. Namun singkatnya, ini adalah hal yang memungkinkan Anda untuk lebih mudah mengimpor dependensi dari satu kelas ke kelas lainnya. Artinya, pengetahuan tentang dependensi disederhanakan.
Spring Boot adalah bagian dari Spring yang memungkinkan Anda meningkatkan aplikasi server dengan satu klik. Anda pergi ke THID, klik beberapa tombol, dan sekarang aplikasi server Anda telah dinaikkan di localhost 8080. Artinya, Anda belum menulis satu baris kode, tetapi sudah berfungsi. Hal yang sangat keren. Jika Anda menulis sesuatu sendiri, tembak!
Musim semi adalah kerangka kerja yang sangat besar. Ini tidak hanya membangkitkan Anda aplikasi server dan menyelesaikan Ketergantungan Injeksi. Ini memungkinkan Anda untuk melakukan banyak hal, termasuk membuat metode REST API. Artinya, Anda menulis beberapa metode, letakkan anotasi Dapatkan pemetaan di atasnya. Dan di sini Anda sudah memiliki beberapa metode di localhost yang menulis Hello world untuk Anda. Dua baris kode, dan itu berfungsi. Hal yang keren.
Musim semi juga membuat tes menulis lebih mudah. Tanpa pengujian dalam pengembangan besar dengan cara apa pun. Kode perlu diuji. Untuk ini, Java memiliki perpustakaan JUnit 5. yang keren dan umumnya JUnit, tetapi versi terbaru adalah yang kelima. Ada segalanya untuk pengujian, segala macam pernyataan dan hal lainnya.
Dan ada kerangka kerja Mockito yang mengagumkan. Bayangkan Anda memiliki beberapa fungsi yang ingin Anda uji. Fungsionalitas melakukan banyak hal, termasuk di suatu tempat di tengahnya memasuki "VKontakte" dengan Anda, misalnya, pengidentifikasi, dan menerima nama depan dan belakang pengguna "VKontakte" dengan ID. Mungkin, Anda tidak akan masuk VKontakte dalam tes, ini aneh. Tetapi Anda perlu menguji fungsionalitasnya, sehingga Anda kelas ini, menggunakan Mockito, membuatnya jadi mok, tiruannya.
Anda akan mengatakan bahwa ketika suatu permintaan datang dengan ID ini dengan ID seperti itu, ia mengembalikan beberapa nama belakang, misalnya, Vasya Pupkin. Dan itu akan berhasil. Artinya, Anda akan menguji semua fungsi untuk mok satu jenis kelas. Hal yang sangat keren.

Pola desain. Apa ini Ini adalah pola untuk memecahkan masalah pembangunan yang khas. Dalam pengembangan, tugas yang sama atau serupa sering muncul yang akan bagus untuk diselesaikan dengan baik. Oleh karena itu, orang-orang datang dengan praktik terbaik, beberapa pola, bagaimana menyelesaikan masalah ini.
Ada situs web dengan pola paling populer - refactoring.guru, Anda dapat membaca, mencari tahu pola apa, membaca banyak teori. Masalahnya adalah itu praktis tidak berguna. Faktanya, pola-pola tanpa latihan bukanlah manfaat khusus.
Anda akan mendengar tentang beberapa pola seperti Singletone atau Builder. Siapa yang mendengar kata-kata ini? Banyak orang. Ada pola-pola sederhana yang bisa Anda terapkan sendiri. Tetapi sebagian besar polanya: strategi, pabrik, fasad - tidak jelas di mana menerapkannya.
Dan sampai Anda melihat dalam praktiknya di beberapa kode asing tempat di mana pola ini diterapkan, Anda tidak akan dapat menerapkannya sendiri. Karena itu, latihan sangat penting dengan pola. Dan hanya membaca tentang mereka di refactoring.guru tidak super membantu, tetapi Anda harus melakukannya.

Mengapa diperlukan pola? Biarkan Anda memiliki Pengguna kelas. Dia memiliki Id dan Nama. Setiap Pengguna harus memiliki Id dan Nama. Kelas kiri atas.
Apa cara menginisialisasi Pengguna? Dua opsi dapat berupa konstruktor atau setter. Apa kerugian dari kedua pendekatan tersebut?
Konstruktor. Pengguna baru (7, "Bond"), ok. Sekarang katakanlah kita tidak memiliki kelas Pengguna, tetapi beberapa yang lain, dengan tujuh bidang angka. Anda akan memiliki konstruktor di mana ada tujuh angka berurutan. Tidak jelas apa angka-angka ini, yang mana dari mereka milik properti mana. Konstruktornya tidak bagus.
Opsi kedua adalah setter. Anda jelas menulis: setId (7), setName ("Bond"). Anda memahami properti apa yang termasuk bidang mana. Tetapi setter memiliki masalah. Pertama, Anda bisa lupa memunculkan sesuatu, dan kedua, objek Anda ternyata bisa berubah. Ini bukan utas yang aman dan sedikit mengurangi keterbacaan kode. Oleh karena itu, orang-orang datang dengan pola keren - Builder.

Tentang apa ini? Kami akan mencoba untuk mengumpulkan keuntungan dari kedua pendekatan - baik setter dan konstruktor - dalam satu pendekatan. Kami membuat objek tertentu, Builder, yang juga akan memiliki bidang Id dan Name, yang itu sendiri akan dibangun berdasarkan setter, dan yang akan memiliki metode Build yang mengembalikan Anda Pengguna baru dengan semua parameter. Kami mendapatkan objek dan setter yang tidak berubah. Keren!
Apa masalahnya? Di sini kita memiliki Builder klasik. Masalahnya adalah kita masih bisa lupa mengisi beberapa bidang. Dan jika kita lupa mengisi pengenal, dalam hal ini di Builder itu akan diinisialisasi ke nol, karena tipe int tidak dapat dibatalkan. Dan jika kita membuat Nama "Bond" dan lupa mengunjungi pengenal, kita akan memiliki Pengguna baru dengan id "0" dan nama "Bond". Tidak keren.
Mari kita coba melawan ini. Di Builder, ubah int ke int sehingga nullable. Sekarang semuanya bagus.

Jika kami mencoba membuat Pengguna dengan nama "Bond", lupa untuk memberikan ID, kami akan mendapatkan pengecualian null pointer, karena ID tidak nullable, tetapi Builder memiliki null, khususnya pengecualian pointer.

Tapi kita masih bisa lupa untuk meletakkan nama, jadi kita lampirkan objek replay ke nol. Sekarang, ketika kita membangun objek kita dari Builder, itu memeriksa bahwa bidang tidak dapat dibatalkan. Dan itu belum semuanya.
Mari kita lihat contoh terakhir. Dalam hal ini, jika kami entah bagaimana menetapkan null dalam runtime ID, dan akan sangat bagus untuk mengetahui segera bahwa Anda melakukan ini dan tidak keren bahwa Anda membuat kesalahan saat ini.

Anda harus melempar kesalahan bukan pada saat membuat Pengguna, tetapi ketika Anda menetapkan null ke pengenal. Oleh karena itu, kita di Builder akan mengubah setter Integer ke int, dan dia segera bersumpah di sini bahwa melemparkan nol.
Singkatnya, apa gunanya? Ada pola Builder yang paling sederhana, tetapi bahkan implementasinya memiliki beberapa seluk-beluk, jadi sangat keren untuk melihat implementasi pola yang berbeda. Setiap pola memiliki lusinan implementasi. Ini semua sangat menarik.

Bagaimana kita menulis Builder dalam kode produksi? Inilah Pengguna kami. Kami menggantung rotasi Builder dari perpustakaan Lombok di atasnya, dan itu sendiri menghasilkan kami Builder. Artinya, kita tidak menulis kode, tetapi Java sudah percaya bahwa kelas ini memiliki Builder, dan kita bisa menyebutnya seperti ini.
Saya sudah mengatakan bahwa di Jawa ada perpustakaan untuk hampir semuanya, termasuk Lombok, perpustakaan keren yang memungkinkan Anda untuk tidak menulis platplate. Builder, DAPATKAN.

Ada pola arsitektur - yang terkait tidak hanya dengan satu kelas, tetapi dengan sistem secara keseluruhan. Ada prinsip yang begitu keren dalam desain sistem: Prinsip Tanggung Jawab Tunggal. Apa yang dia bicarakan? Fakta bahwa setiap kelas harus bertanggung jawab atas beberapa fungsinya. Dalam hal ini, kami memiliki Pengendali yang berkomunikasi dengan pengguna, objek JSON. Ada Facade, yang mengubah objek-JSON menjadi model, yang akan terus bekerja dengan aplikasi Java. Ada Layanan di mana ada logika kompleks yang bekerja dengan model-model ini. Ada Objek Akses Data, yang menempatkan model ini ke dalam basis data dan menghapusnya dari basis data. Dan ada database itu sendiri. Dengan kata lain, tidak semua ini berada di kelas yang sama, tetapi kami membuat lima kelas yang berbeda, dan ini adalah pola lain.

Ketika Anda memiliki lebih atau kurang Java yang dipelajari, sangat bagus untuk menulis beberapa jenis proyek Anda sendiri, di mana akan ada database, bekerja dengan API lain, dan yang akan menyediakan aplikasi server Anda dengan klien REST API. Akan sangat bagus untuk memasukkan hal seperti itu ke dalam resume, ini adalah akhir yang keren untuk pelatihan Anda. Dengan ini, Anda bisa pergi dan mendapatkan pekerjaan.

Ini adalah contoh aplikasi server saya. Pada tahun kedua, saya menulis makalah dengan teman-teman. Mereka menulis aplikasi seluler untuk mengatur acara. Di sana, pengguna dapat masuk melalui VKontakte, meletakkan titik-titik di peta, membuat acara, memanggil teman-teman mereka, menyimpan gambar acara, dll.
Apa yang saya lakukan dalam proyek ini? Menulis aplikasi server pada Boot Musim Semi tanpa menggunakan SQL. Saya tidak kenal dia, saya menggunakan JPA. Apa yang bisa dia lakukan? Masuk ke VK melalui OAuth-2. Ambil token pengguna, pergi dengannya ke VK, periksa apakah ini adalah pengguna asli. Terima informasi tentang pengguna melalui VKontakte. Itu terampil menyimpan informasi dalam database, juga melalui JPA. Menyimpan gambar dan file lainnya dengan terampil dalam memori komputer, dan menyimpan tautan ke dalam database. Saya belum tahu bahwa ada objek CLOB dalam database, jadi saya melakukannya dengan cara ini. Ada REST API untuk pengguna, aplikasi klien. Dan ada tes unit untuk fungsionalitas dasar.
[...] Contoh kecil keberhasilan belajar saya tentang Java. Pada tahun pertama saya di universitas, mereka mengajari saya C # dan memberi saya pemahaman tentang pemrograman OOP - apa kelas, antarmuka, abstraksi, mengapa mereka diperlukan. Itu banyak membantu saya. Tanpa ini, belajar Java cukup sulit, tidak jelas mengapa kelas diperlukan.

Pada tahun kedua saya di universitas, mereka kembali memberi Java core, tetapi saya tidak berhenti di situ, pergi belajar Spring sendiri dan menulis makalah, proyek saya sendiri, yang saya bicarakan di atas. Dan dengan semua ini, saya melanjutkan magang di Yandex, menjalani wawancara, masuk ke Yandex.Market. Di sana saya menulis backend untuk Beru, ini adalah pasar kami, dan untuk Yandex.Market itu sendiri.
Setelah itu, enam bulan lalu, saya pindah ke tim lain di dalam Pasar yang sama. Kami melakukan analisis untuk mitra bisnis. Kami berada di platform analitis, kami bertiga ada di backend, jadi saya memiliki pengaruh yang sangat besar terhadap proyek ini. Ini sangat menarik, sebenarnya. Artinya, kami benar-benar memberikan data pasar - penjualan, kategori mana, model mana, untuk mitra bisnis, perusahaan besar terkenal. Dan hanya ada tiga dari kita, kita menulis kode ini, dan itu sangat keren.
Terima kasih Tautan yang bermanfaat:
-
"Java 8. Panduan untuk pemula .
"-
Struktur data .
-
SQLZOO .
-
Normalisasi basis data .
-
Pola desain .
-
Pola Desain .
-
Kode Bersih .
—
Effective Java .