
Saya hidup di pinggiran kumpul-kumpul teknologi. Dan di pinggiran dalam arti geografis. Dan ini berarti:
- Saya belum pernah ke konferensi profesional. Hanya karena tidak pernah diberi kesempatan seperti itu.
- Saya tidak pernah membeli kursus pelatihan: aneh bagi saya untuk membayar apa yang dapat Anda pelajari sendiri di Internet ini atau dalam buku. Tentu saja menggoda untuk memperoleh pengetahuan terkonsentrasi, yang didukung oleh tugas-tugas praktis, untuk mendapatkan sertifikat. Tetapi untuk ini saya tidak pernah punya uang atau waktu.
- Saya penganut asketisme digital: bukan atas kehendak bebas saya sendiri, tetapi sebagai produk restrukturisasi abadi di negara kita. Dalam periode singkat stabilitas keuangan, saya memperbarui elektronik secara residual. Jadi sekarang saya menulis teks ini pada Core2Duo sepuluh tahun yang lalu. Masih menunggu dataran tinggi berikutnya yang stabil pada kurva pendapatan saya.
- Tiga kali dalam hidupku aku membeli game. Di tahun 90-an. Ini adalah kaset untuk Spectrum yang sudah usang. Saya melihat pembelian perangkat lunak dengan terkejut: ketika semua orang menggunakan perangkat lunak bajakan, saya juga menggunakannya tanpa memahami esensi masalah ini. Dan kemudian, pada awal tahun 2000-an, saya sepenuhnya beralih ke Linux dan tidak ada yang bisa dibeli.
- Yang mengejutkan, saya tidak pernah kehilangan ponsel, sejak awal kemunculan komunikasi GSM. Dan mereka tidak pernah rusak atau tidak diperbaiki. Ketiga potongan rapi di rak, dan yang keempat, smartphone, terletak di saku Anda. Dia berumur lima tahun. Saya tidak punya pengalaman membeli perangkat lunak di Google Play, saya bahkan tidak tahu bagaimana melakukannya. Sang istri tahu, tetapi saya tidak tahu.
- Saya mohon penyedia untuk mencekal saya dan tidak menelepon saya dengan penawaran untuk "membeli Internet" atau paket televisi. Karena saya tidak punya TV, dan untuk internet, kecepatan minimum sudah cukup untuk saya. Saya meminta Anda untuk tidak memberi tahu saya tentang tarif baru untuk komunikasi seluler, karena saya memilih yang termurah yang tersedia.
- Saya belum pernah melihat orang asing berbahasa Inggris langsung. Dan dia tidak pernah berbicara dengan orang asing dengan suara. Kesempatan seperti itu tidak pernah diberikan di sudut beruang saya, meskipun itu akan menarik. Saya perlahan memompa bahasa Inggris saya, tetapi saya hanya membutuhkannya untuk membaca literatur.
Mungkin cukup. Siapa saya, dan apa yang saya lakukan di Habrahabr? Faktanya adalah bahwa saya ... saya seorang yang selamat permanen. Dengan kata lain, pengembang full-stack modern. Oh, aku bisa membayangkan bagaimana profiler program mengerutkan kening sekarang! Fullstack ... Apa yang bisa saya katakan kepada mereka? Guys, saya akan senang memompa keterampilan dalam satu arah. Saya akan senang, seperti Anda, untuk membenamkan diri dalam topik ini dan menjadi guru yang sangat terspesialisasi. Tetapi, sayangnya, kenyataannya adalah bahwa di daerah seseorang di lokasi terpencil harus mencengkeram pekerjaan apa pun, hanya saja untuk tidak pergi atau menjadi sopir taksi.
Bahasa apa yang harus saya tangani dan berikan yang sudah jadi? Jika Anda membuat pilihan pada timeline, Anda mendapatkan daftar berikut:
Ya, saya sendiri takut dari gado-gado ini. Pelemparan mempesona seperti apa? Benarkah itu Web - analisis kekuatan - akuntansi stok - permainan ... Pembangkit listrik tenaga nuklir, kartografi, teleponi. Penulis, apakah Anda serius? Benar-benar! Hidup akan terjepit - Anda tidak bangun terlalu banyak.
Tepi transisi
Untuk merasakan ambang transisi dari proyek ke proyek, Anda dapat mempertimbangkan dua garis paling bawah dari tabel di atas. Untuk proyek ini, dari garis kedua dari belakang "Kartografi dan navigasi, pengembangan seluler untuk Android", kami hanya akan melakukan dengan tautan.
Dan untuk melengkapi gambar, beberapa publikasi lagi:
Dan tentang garis paling bawah dari tabel "Web Development and Telephony" akan saya bahas nanti dalam teks ini.
Jadi, proyek aplikasi seluler Android yang menjanjikan untuk peralatan navigasi khusus ditutup dengan tajam. Kemarin, pengembang menulis kode backend dalam C ++ dan bagian depan dalam QML, memasang kode asli ke Jawa melalui JNI, dan hari ini ia harus dengan panik mencari lowongan pengembang C ++ di situs jarak jauh. Pasar C ++ modern sedemikian rupa sehingga untuk menemukan majikan di Rusia dengan C ++ di situs jarak jauh adalah sukses besar. Semua pengusaha ingin melihat programmer C ++ di kantor. Bulan dalam pencarian adalah nol total. Sudah waktunya untuk berlatih kembali, manfaat dari latar belakang memungkinkan.
Definisi
Pengembang Fullstack (perwakilan dari keluarga spesialis di sekitar) adalah karakter mitos, objek keinginan majikan yang ingin mengoptimalkan produksi perangkat lunak ke tim yang terdiri dari satu orang. Pengembang Fullstack memiliki kemampuan magis: ia memiliki memori tanpa dasar, karena ia tahu semua bahasa dan teknologi modern; aparatus konseptual global diintegrasikan ke dalam otak, unggul dalam mengatur proses pemikiran Vladimir Lenin, Albert Einstein dan Leonardo da Vinci; pemikiran sistemik dari spesialis semacam itu mampu men-debug apa pun secara langsung di otak, tanpa menggunakan alat debugging. Bersahaja, ditenagai oleh sinar matahari.
Transisi ke tugas baru
Tiba-tiba, pengguna haar itsar datang kepadaku dan membawanya ke timnya. Dia memiliki beberapa tugas yang tergantung, dan saya menerapkan layanan web prototipe untuk pengujian. Sesuai rencana, layanan web memberi tahu pengguna tentang berbagai peristiwa melalui berbagai saluran komunikasi, termasuk panggilan telepon. Akibatnya, situs QrCall.org muncul, tentang yang sudah ditulis di Habrahabr: Pergi ke sana - saya tidak tahu di mana .
Ke depan, saya akan segera menulis tenggat waktu: diskusi dan penulisan tugas teknis memakan waktu dua minggu, butuh satu setengah bulan untuk membuat implementasi pertama dan hasil produksi.
Untuk memahami, hingga saat ini, layanan web ini terlihat seperti ini (versi pengembang):

Jadi, kita perlu melompat dari C ++ ke PHP7 dan tool stack sesuai dengan realitas modern. Tidak ada waktu untuk penumpukan (C) Putin. Straustrup, Schildt, Gottschling, Salter dan Klepper ditempatkan di rak paling jauh. Sejalan dengan penulisan TK, saya ingat bahwa mereka menciptakannya di PHP7. Permintaan "Apa yang baru di PHP7" memberikan beberapa artikel di Habrahabr dan di blog pemrograman. Ya, ruang nama dan impor, jenis baru operator ternary dan setiap gula sintaksis, tipe skalar dan lainnya seperti mereka, kelas anonim, penutupan akhir, generator ... Untuk sebagian besar, semuanya akrab. Sekali lagi saya perhatikan sendiri bahwa PHP adalah kesenangan surgawi dibandingkan dengan kelebihannya.
Pemilihan alat
Teleponi
Paling khawatir tentang implementasi telepon di masa depan. Apakah saya akan menguasai? Segera jelas bahwa Anda harus bekerja dengan SIP, tetapi bagaimana? Sebuah memori menggantung di otak saya yang dulu saya mainkan dengan beberapa klien SIP konsol, dan bahkan dapat memanggil nomor telepon dan membuat panggilan. Untuk mengatasi masalah ini sudah cukup. Dalam kasus ekstrem, Anda harus bingung dengan Asterisk. Saya memanggil seorang juru sinyal yang akrab, menjelaskan esensi masalah, meminta Anda untuk mengingatkan saya apa jenis klien konsol yang bisa saya rasakan. Putusan ini tidak ambigu - ini adalah Linphone dan konsol linphonec-nya . Tetapi menekan nomor di konsol tidak cukup. Anda masih harus memutar file suara ke handset virtual. Instal Linphone, buka konsolnya, lihat kemungkinannya. Jadi, dimungkinkan untuk beralih dari perangkat suara ke file. Ini bagus. Dan di konsol ada perintah putar yang meluncurkan file audio untuk diputar. Pada prinsipnya, tidak ada lagi yang dibutuhkan.
Meskipun tidak, masih ada masalah panggilan bersamaan. Saya membahasnya dengan itsar , dia mengatakan bahwa peringatan panggilan jarang terjadi, hanya berbaris. Batasi durasinya. Oh baiklah Jika demikian, maka tidak ada lagi pertanyaan tentang telepon.
Kerangka PHP dan manajer paket
Selanjutnya, Anda perlu memutuskan kerangka kerja mana yang membuat proyek aktif, dan pada saat yang sama Anda harus berurusan dengan manajer paket Composer. Sebelumnya, saya hanya melihat Composer dan menginstal Yii2 tanpa komponen melaluinya, karena dalam Yii2 semua yang dibutuhkan sudah termasuk. Nah, tidak peduli kerangka mana yang saya pilih, Komposer akan tetap dibutuhkan. Saya membaca cara menginstalnya. Aku yakin itu berhasil.
Berikutnya adalah pertanyaan pada framework. Saya mengetahui bahwa pada tahun 2019, Yii2 tidak lagi relevan, dan Yii3 macet di semacam negara perantara. Apa yang tersisa Untuk Zend dan Symfony, saya belum matang, jadi praktis tidak ada pilihan - hanya Laravel . Saya membaca dokumentasi, melihat manual, memesan buku oleh penulis berbahasa Rusia (ternyata sangat masuk akal, apa yang diperlukan untuk memulai). Setelah Codeigniter kuno dan Yii yang tidak relevan, kerangka Laravel mudah dipahami, Anda dapat langsung melihat bagaimana ide pemrograman telah berkembang dalam desain aplikasi web. Segala sesuatu yang diimpikan telah diimplementasikan, dijalankan dan ditumbuhi dengan pendekatan standar. Ya, proyek ini direncanakan tidak dimuat, jadi saya bisa membeli beberapa kelengkungan Nubian dalam implementasinya.
Saya menempatkan Laravel "secara default", menyarankan Komposer untuk memutuskan sendiri versi Laravel mana yang saat ini relevan. Dia menempatkan 5.5. Nah, biarkan versi ini menjadi, ini lebih run-in dari 5.8, sehingga akan lebih mudah untuk menyelesaikan masalah. Kami tidak mengejar inovasi.
NPM
Beberapa komponen Laravel, misalnya, sistem mix CSS build dan minification (add-on untuk Webpack), memerlukan runtime server JavaScript Node.Js dan pengelola paket npm berbasis JavaScript. Stabil Debian Linux yang saya gunakan sudah memiliki paket npm . Namun, ini adalah versi yang cukup lama, dan tidak cocok untuk infrastruktur Laravel 5.5. Saya mencari cara menginstal dari sumber pihak ketiga, saya menemukan deb.nodesource.com, saya menginstalnya. Hmm, aneh, dalam paket yang sama, npm diinstal bersama dengan Node.Js. Ini bukan cara Unix sama sekali, tapi oh well. Hal utama yang berhasil.
Tata letak
Gagasan proyek QrCall.org adalah untuk memanggil pengguna melalui kode QR . Dan ini berarti bahwa pengunjung akan memasuki situs dari perangkat seluler, menggunakan kamera yang mana kode QR ini akan dipindai. Pada saat yang sama, pendaftaran pengguna, pengaturan peringatan, dan pencetakan kode QR mungkin dilakukan dari komputer desktop. Jadi, tata letak adaptif sangat diperlukan.
Saya segera melihat generasi konten seluler / desktop di server dengan menganalisis UserAgent. Ini bukan pendekatan kami untuk 2019. Di sini kerangka kerja Bootstrap CSS pasti akan membantu kami. Secara umum, tata letak aplikasi web adalah topik besar, terpisah, besar, yang harus ditangani oleh spesialis terpisah. Bagi saya dalam pengembangan web tidak ada yang lebih rumit daripada memilih dengan tata letak. Saya sudah lama mengerti bahwa saya telah memaksakan kretinisme. Saya menghabiskan banyak waktu untuk membuat indentasi lainnya, atau untuk menyelaraskan beberapa elemen. Tetapi kami tidak memiliki sumber daya untuk pembuat kode, jadi Anda harus melakukan apa yang Anda bisa, diharapkan hasilnya halus dan indah.
Pertanyaannya adalah: versi Bootstrap mana yang harus saya gunakan? 3 atau 4? Ternyata Bootstrap segera dibundel dengan Laravel 5.5, dan ini adalah versi 3.x. Tidak ada waktu untuk mencari tahu cara membuat ulang lingkungan di Bootstrap 4, jadi saya meninggalkan versi 3. Pada akhirnya, ratusan ribu situs menggunakan Bootstrap 3 di Internet, yang berarti ini adalah teknologi yang layak untuk digunakan.
Yang paling menarik adalah hasilnya ternyata membuat tata letak adaptif tidak hanya untuk bagian "terbuka" dari situs, tetapi juga untuk akun pribadi Anda.
Seperti apa tampilan halaman di versi desktop:

Dan di sini dia ada di tampilan seluler:

Pengembangan
Bagaimana kerangka kerja itu akan digunakan? Saya memiliki pendekatan ini: untuk penggunaan maksimum semua komponen freverka yang sudah jadi, tetapi dengan satu syarat: jika ada pemahaman yang baik tentang cara kerja komponen ini. Seperti yang dikatakan oleh seseorang yang sudah mengenal Zen Laravel, "Ini bukan tentang fakta bahwa dokumentasi ditulis dalam bahasa non-Rusia, tetapi tentang fakta bahwa bahkan dalam bahasa Inggris asli untuk kerangka kerja itu tidak selalu bersifat indikatif." Karenanya, saya percaya bahwa jika Anda tidak dapat dengan cepat menemukan komponen atau metode, lebih baik melakukan sesuatu yang lebih sederhana dengan metode Anda sendiri daripada menulis kode yang kurang dipahami oleh Anda sendiri.
Apa yang saya bicarakan? Kerangka kerja Laravel adalah kerangka kerja besar dengan banyak abstraksi diimplementasikan dan dengan pendekatan sendiri untuk struktur kode. Ini memiliki hal-hal sederhana yang telah lama dan berhasil digunakan baik di Laravel dan kerangka kerja lainnya. Ada hal-hal yang kompleks tetapi dapat dimengerti, misalnya, implementasi antrian (yang harus digunakan untuk telepon). Tetapi ada hal-hal mendasar yang benar-benar kompleks yang tidak dapat Anda tembus. Misalnya, ini adalah wadah Layanan bundel + Penyedia layanan + Fasad. Sejauh ini, saya telah mengerti bagaimana cara secara otomatis membuat Penyedia Layanan, menempatkannya dalam wadah Layanan dan mengacaukan fasad ke semuanya. Tetapi untuk apa itu perlu dilakukan - saya belum menyadari. Sepertinya pendekatan ini memperpendek kode, Anda dapat merujuk ke abstraksi dan metodenya dalam gaya statis, tanpa menggunakan kata kunci baru (meragukan merit). Dan penggunaan fasad memudahkan pengorganisasian pengujian otomatis aplikasi web, dan sebagai efek samping dari semua kenyamanan ini, saat menggunakan penyedia layanan, injeksi ketergantungan otomatis. Secara umum, meskipun tidak ada pemahaman, paling mudah bagi saya untuk melakukan dengan kelas pembantu biasa, yang saya lakukan.
Teknologi
Jadi, untuk meringkas di atas, saya mendapat tumpukan teknologi yang cukup tradisional berikut ini:
- OS: Linux (Saya memilih Debian Stable)
- Bahasa: PHP7
- Kerangka Kerja: Laravel
- Frontend Whistles: Bootstrap 3 + Vue.js
- Database: MariaDB (alias MySQL)
- Server Web: NGinx
- Telephony: SIP + linphonec / linphonecsh
- VCS: Git
Ya, bukan tumpukan yang paling modis dan canggih. Tapi kita perlu melakukan bisnis, dan tidak berlatih membungkus lingkungan dalam wadah Docker dan tidak untuk mempromosikan gagasan pengembangan JS-only.
Antrian
Antrean adalah bidang subjek yang sangat spesifik, dan dalam antrian tim besar biasanya dijawab oleh spesialis terlatih yang memastikan pengoperasian antrian di ratusan server. Dalam kasus kami, ratusan server tidak diamati, sehingga perlu menggunakan antrian sesederhana mungkin dan untuk bisnis. Oleh karena itu, sebagai repositori pekerjaan, saya memutuskan untuk menggunakan mesin database relasional MySQL yang sudah digunakan dalam proyek. Ada beberapa godaan untuk melakukannya dengan bijak, misalnya, berdasarkan Redis, tetapi tidak ada waktu untuk berurusan dengan basis data NoSQL ini.
Selama pengembangan, permintaan muncul untuk tugas yang tidak dapat diselesaikan secara langsung menggunakan antrian MySQL, tetapi yang akan diselesaikan menggunakan Redis. Masalahnya adalah bahwa setelah berhasil menyelesaikan tugas, tugas tersebut dihapus dari antrian, dan tidak ada cara untuk memeriksa apakah, misalnya, tugas tertentu selesai dalam 10 menit terakhir? Saat menggunakan penyimpanan Redis, ini bisa diimplementasikan melalui Rate Limitting, tetapi ketika menggunakan MySQL, ini tidak mungkin. Oleh karena itu, saya harus mengimplementasikan fungsi seperti itu hanya berdasarkan analitik dari log tindakan. Untungnya, log tindakan merupakan bagian tak terpisahkan dari sistem informasi kecil kami.
Layanan Berbayar
Saat menempatkan situs di Internet, Anda harus membayar berbagai layanan. Hosting dan nama domain hampir selalu merupakan pembayaran wajib. Kami mengambil hosting dengan harga murah, membayar untuk 2Gb RAM, pada tingkat 1Gb untuk database, sisanya - untuk OS dan eksekusi skrip. Ada 2 core mikroprosesor dalam tarif, meskipun saya pikir satu akan baik-baik saja dengan beban kami. Ruang disk dalam 20GB lebih dari cukup untuk proyek kami. Selama proses penyebaran, kompilasi dari linphonec diperlukan , karena pada desktop pengembang saya ada Linux Debian yang lebih kuno daripada di gambar mesin virtual yang disediakan oleh hoster, dan paket standar dari repositori berisi versi kuno dari program ini dengan beberapa "fitur" yang tidak menyenangkan. Jadi, untuk mengkompilasi linphonec, 2Gb tidak cukup untuk saya. Keajaiban templat di C ++ menghabiskan memori seolah-olah itu tidak ada di dalam dirinya sendiri, jadi saya harus mengatur swap, setelah itu perakitan selesai dengan sukses.
Telepon SIP juga tidak pernah gratis, tetapi karena ada beberapa operator telepon IP besar di Rusia yang saling bersaing dan menawarkan tarif yang sangat murah. Satu-satunya momen yang tidak dapat dipahami adalah ketika memesan tarif, operator yakin bahwa tarif akan menjadi per detik, tetapi ternyata itu per menit. Tetapi ini harus ditangani secara terpisah.
Dalam realitas modern kami, Anda tidak dapat bergantung pada kenyataan bahwa ada layanan email-mailing gratis. Dan dalam kasus kami, buletin email diperlukan untuk mengirim berbagai peringatan. Dalam pengalaman saya, semua upaya untuk mengatur pengiriman banyak surat melalui Yandex.Mail atau melalui Google.Mail hanya mengarah pada kenyataan bahwa server email penerima, setelah tiga atau empat huruf, menandai pesan sebagai spam. Artinya, masalah muncul sudah pada tahap debugging, belum lagi produksi. Karena itu, saya harus repot dengan layanan Mailgun, di mana surat-surat dikirim dengan cepat dan tanpa masalah. Hanya ada satu kesalahpahaman dengan Mailgun: di beberapa artikel mereka menulis bahwa mereka memberi gratis mengirim 10.000 surat sebulan. Dan di situs web Mailgun sendiri tertulis entah bagaimana licin yang saya pahami sebagai 10.000 surat sejak saat pendaftaran. , , .
Mailgun . , , . , , SMTP. Laravel Mailgun, .
, . INPUT . . , SSH, . — DROP INPUT. , , .
SIP-, SIP- , , nf_conntrack_sip . , NAT, nf_nat_sip , , .
, . . — , , MySQL. — , . zip-, , , . — . rsync.
, — , borg . , .
GIT , , . . , , , ( ), - ( git , artisan ). /etc/sudoers , , .
, Laravel , . , , . , .
, ! — . ? : ! , CI . , , CI-, -.
. , ? ! - ? , ! . , .
, Laravel, CSS- Bootstrap 3 Bootstrap 4. - Bootstrap 4 Bootstrap 3, flex- , Bootstrap 3 , . Bootstrap 4, , .
, , HTTPS. , , . HTTP HTTPS, Let's Encrypt HTTPS - NGinx , .
, . , , . , , logrotate , .
. , , . -, . , . , , . , Laravel , , , . , , , .
Ringkasan
, " " " ". , . , , , , : , , , ( , , ).
? "". ? -, , . , , , , . , .
, , " , , " , . . ++ , . : , " ", , , , , . -. - , . , , . - : , - , , , .
— , - , , , . , proof-of-concept, , , , . , — , .
, - . , , . , - , , -. , , , ...
? : -, , , , , .