Belum lama ini, berdasarkan kantor kami, kami mengadakan kursus kuliah gratis "Modern dan Efektif C ++" dan merekamnya dalam video. Kursus ini dirancang untuk baru-baru ini tiba di tim programmer, magang dan semua pendatang. Dalam artikel ini kami ingin menyoroti tujuan kursus ini, proses mempersiapkannya, untuk meringkas. Kami berharap bahwa bagi sebagian dari Anda, kuliah kami akan menarik dan Anda akan menghargai pekerjaan kami. Semoga Anda melihat laporan dengan menyenangkan!
Bagaimana ide itu muncul
Perusahaan kami PVS-Studio sedang mengembangkan penganalisa kode statis yang mengidentifikasi kesalahan dan kerentanan potensial dalam kode sumber program yang ditulis dalam C, C ++, C # dan Java. Dan bukan rahasia bagi siapa pun yang kami tertarik untuk menarik spesialis muda. Sering terjadi bahwa siswa yang ingin mendapatkan pengalaman profesional di bidang pemrograman dan yang masih kurang pengetahuan di bidang ini menjalani pelatihan praktis. Selain itu, spesialis kami yang baru tiba juga membutuhkan bantuan dengan pertumbuhan profesional. Mengingat hal tersebut di atas, diputuskan untuk menyiapkan kursus kuliah tentang pemrograman dan melakukan itu. Gagasan ini mengejar setidaknya tiga tujuan: untuk menunjukkan kepada profesional muda dan magang cara menulis kode lebih akurat, lebih efisien dan lebih aman; mempopulerkan C ++ di luar kantor dan menunjukkan bahwa bahasa itu menjanjikan dari sudut pandang pembelajaran dan bekerja lebih jauh dengannya; untuk mempopulerkan perusahaan kami sebagai perusahaan yang menarik. Setelah menentukan tujuan dan terinspirasi oleh gagasan itu, kami mulai mewujudkan impian itu.
Persiapan
Dengan diskusi lebih lanjut tentang ide kami, begitu banyak pertanyaan dan sangat sedikit jawaban mulai muncul (mengejutkan, ya?). Dalam agenda adalah: waktu dan tempat, siapa yang akan menyiapkan kursus, siapa yang akan melakukan itu, topik apa yang harus dibahas, akankah kita merekam kursus di video, bagaimana kita akan melakukannya, bagaimana mempromosikannya, dan di mana lebih baik untuk melakukannya dan masih ada yang besar jumlah pertanyaan yang kami diskusikan selama dua minggu dan diulangi seperti kata-kata: "Dan bagaimana ...?", "Dan siapa ...?", "Dan di mana ...?".
Jadi, ketika pikiran dan ide semua orang “disinkronkan”, diputuskan bahwa kursus akan dirancang untuk 12 kuliah 2 kali seminggu dari 9 Juli hingga 15 Agustus. Andrei Karpov dan Philip Handelyants terpilih sebagai dosen.
Di
saluran YouTube kami
, kami telah mengumpulkan semua video dalam daftar putar terpisah agar mudah dilihat. Kami juga memiliki
grup VKontakte , yang berisi semua informasi tentang perkuliahan. Dengan demikian, adalah mungkin untuk pergi ke halaman ceramah yang terpisah, melihat tentang apa itu, mendaftar untuk itu, dan kemudian juga menonton rekaman ceramah jika sesuatu ingin diulangi atau jika seseorang tidak dapat hadir secara langsung.
Mari kita bahas topik ceramah dan isinya.
C ++ 11 inovasi standar
C ++ 11 ... berapa banyak makna yang ada dalam lima karakter ini ... Ceramah pertama ternyata menjadi yang terpanjang dan, mungkin, informatif, karena dalam hampir dua jam Philip dan teman-teman membahas banyak pertanyaan. Jadi mereka mulai dengan melihat bahasa C ++ dan relevansi penggunaannya. Kemudian mereka langsung menuju ke perubahan standar C ++ 11. Selama bagian ini, ekstensi dari inti bahasa dipertimbangkan, yaitu:
- inisialisasi universal;
- pindahkan semantik;
- ekspresi konstan umum (constexpr) ;
- perubahan definisi tipe POD;
- daftar inisialisasi (std :: initializer_list <T>) ;
- ketik inferensi melalui otomatis dan jenis teks ;
- kisaran untuk ;
- fungsi lambda;
- sintaks fungsi alternatif;
- output dari tipe pengembalian fungsi;
- mendelegasikan konstruktor;
- default / hapus specifier untuk fungsi;
- timpa / kualifikasi akhir saat bekerja dengan polimorfisme;
- nullptr_t dan nullptr ;
- dan masih banyak lagi.
Setelah membahas ekstensi kernel, Philip berbicara tentang ekstensi ke perpustakaan standar, yang meliputi:
- memperbarui perpustakaan standar untuk mencerminkan perubahan dalam bahasa inti;
- multithreading: threads ( std :: thread ), mutexes ( std :: mutex, ... ), variabel kondisional ( std :: conditional_variable, ... );
- Pembungkus RAII ( std :: lock_guard, std :: unique_lock );
- tuple ( std :: tuple) ;
- tabel hash ( std :: unordered (_set / _multiset / _map / _multimap );
- ekspresi reguler ( std :: regex );
- pointer pintar ( std :: unique_ptr, std :: shared_ptr, std :: lemah_ptr );
- pseudo random number generator bukan rand () ;
- pembungkus tautan ( std :: reference_wrapper );
- pembungkus umum untuk fungsi ( std :: function );
- ciri-ciri ( type_traits ).
Tentu saja, perlu dipahami bahwa sejumlah besar informasi tidak dapat dibahas secara rinci dalam dua jam, sehingga beberapa poin diberi tahu secara lebih rinci, sementara beberapa memiliki fungsi sosialisasi yang lebih.
C ++ 14 inovasi standar
Kuliah kedua dikhususkan untuk meninjau inovasi dari standar C ++ 14. Tidak ada banyak perubahan, jadi pendengar “menderita” tidak selama 2 jam, tetapi hanya 40 menit :-). Seperti pada kuliah pertama, perhatian diberikan pada dua poin utama: mengubah kernel C ++ dan mengubah perpustakaan standar.
Inilah yang mereka bicarakan:
- output dari tipe return untuk fungsi tanpa secara eksplisit menentukan deklarasi akhir dari tipe return (tipe trailing return );
- decltype (otomatis) ;
- pelonggaran pembatasan untuk constexpr ;
- variabel variabel;
- inisialisasi agregat;
- literal biner
- pemisah angka;
- lambda umum;
- lambda menangkap daftar fungsi dengan inisialisasi;
- atribut [[usang]] , std :: shared_timed_mutex;
- pencarian heterogen untuk wadah asosiatif;
- literal pengguna standar (s untuk std :: string ; h, min , s , ms , us , ns untuk std :: durasi , jika , i , il untuk bagian imajiner dari std :: complex );
- std :: get sekarang bisa mendapatkan nilai dari std :: tuple by type;
- std :: make_unique ;
- std :: integer_afterence ;
- fungsi bebas std :: begin, std :: end, std :: cbegin, std :: cend, std :: rbegin, std :: rend, std :: crbegin, std :: crend ;
- std :: exchange .
Ketik inferensi dalam C ++
Setelah menyoroti inovasi standar C ++ 11 dan C ++ 14, kami fokus pada topik inferensi tipe dalam C ++. Mengapa ini tentang topik ini? Sebelum C ++ 11, beberapa orang berpikir secara seksama tentang apa itu dan bagaimana cara kerjanya, dengan pengecualian penulis "template magic" dan pengembang kompiler.
Waktu berlalu, dan sekarang programmer C ++ perlu memperhitungkan inovasi yang diterima oleh standar:
otomatis ,
penerusan tautan, jenis
catatan , daftar tangkapan lambda, ketik inferensi berdasarkan nilai balik, dll.
Inovasi telah mulai digunakan secara aktif oleh pengembang dalam kode baru, dan sangat penting untuk memahami apa artinya ini dan apa yang akan dilakukan oleh kompiler dalam situasi ini.
C ++ 17 inovasi standar
Berbicara tentang C ++ modern, tidak mungkin untuk tidak menyebutkan standar C ++ terakhir yang ada. Narasi disajikan sesuai dengan skema yang telah ditetapkan: perubahan dalam kernel, dan kemudian di perpustakaan standar, dipertimbangkan. Jadi, kami mempertimbangkan:
- output dari jenis kelas template dari konstruktor;
- throw () dianggap sebagai kecuali dan ditandai sebagai depricated ;
- noexcept telah menjadi bagian dari sistem tipe dan sekarang diperhitungkan ketika memilih kelebihan fungsi;
- copy elision ;
- konvolusi ( ekspresi lipat );
- if / switch with initializer;
- jika constexpr , binding terstruktur ;
- ruang nama bersarang;
- atribut baru [[ fallthrough ]], [[ maybe_unused ]] dan [[ nodiscard ]];
- literal heksadesimal nyata;
- static_assert menerima pesan sebagai parameter opsional alih-alih yang diperlukan;
- nama ketik sekarang diizinkan dalam opsi templat templat ;
- Aturan baru lain untuk output tipe otomatis dengan brace-initializer-list ;
- variabel sebaris ;
- otomatis dapat digunakan dalam parameter templat;
- arahan preprosesor __has_include ;
- register telah menjadi kata yang dipesan dan belum digunakan;
- std :: string_view ;
- std :: opsional ;
- std :: any ;
- std :: varian ;
- std :: byte ;
- std :: uncaught_exceptions bukannya std :: uncaught_exception ;
- boost :: filesystem dengan perubahan terisi sebagai std :: filesystem ;
- try_emplace dan masukkan_or_assign untuk array asosiatif;
- fungsi bebas std :: size , std :: kosong dan std :: data ;
- variabel templat untuk type_traits ( std :: * _ v <T ...> ).
STL: konsep, wadah, iterator
Kuliah kelima sepenuhnya dikhususkan untuk perpustakaan templat standar. Kami membahas sejarah STL, terdiri dari apa dan bagaimana cara menggunakannya. Kami berbicara lebih detail tentang kontainer standar (
vektor ,
daftar ,
forward_list ,
deque , ...), wadah adaptor (
stack ,
antrian ,
priority_queue ,
heap ) dan jenis iterator (
input ,
output ,
maju ,
dua arah ,
acak ,
berdekatan ).
STL: Algoritma, Wrappers, Objects Fungsional
Dalam kuliah ini, mereka terus mengerjakan STL. Philip berbicara tentang fakta bahwa Anda tidak perlu terlibat dalam bersepeda dan sekarang saatnya untuk mulai menggunakan algoritma STL standar. Berbagai kategori algoritma, pembungkus fungsional yang berguna (
plus ,
minus , ...) dipertimbangkan.
Analisis statis sebagai bagian integral dari pengembangan saat menulis program C ++
Philip memutuskan untuk sedikit bersantai :-), dan direktur teknis kami, Andrey Karpov, mengadakan kuliah ketujuh. Dia berbicara tentang analisis statis secara umum, dan mengapa perlu menggunakannya dalam pekerjaan. Andrei menjelaskan hubungan langsung antara menggunakan penganalisa statis dan meningkatkan kualitas kode ketika bekerja pada proyek besar. Adalah bodoh untuk berbicara tentang analisis statis tanpa contoh-contoh dari realitas pekerjaan kami, oleh karena itu, tentu saja, contoh kesalahan yang terdeteksi oleh PVS-Studio juga dimasukkan dalam perkuliahan. Kami berbicara tentang cara yang benar dan salah untuk menggunakan alat analisis kode.
Standar pengkodean PVS-Studio dan teknik umum untuk mengembangkan diagnostik C ++ yang efektif
Philip masih beristirahat, dan Andrei dan murid-muridnya melirik sedikit ke dapur internal PVS-Studio, mempertimbangkan dua topik.
Pertama, kami berbicara sedikit tentang standar pengkodean yang diadopsi oleh tim kami, dan mengapa kami memutuskan untuk merancang kode dengan cara ini, dan bukan sebaliknya.
Kedua, kami membahas beberapa metode optimasi kode mikro yang kami gunakan saat mengembangkan alat analisis. Kami membahas tentang frasa terkenal "optimasi prematur adalah akar dari semua kejahatan". Topik itu disentuh secara sepintas, tetapi Andrei segera berencana untuk mencurahkan laporan terpisah untuknya "
Optimalisasi prematur itu jahat! Optimalisasi prematur hidup panjang! " Di konferensi C ++ Rusia. Jadi kami mengundang semua orang ke konferensi yang luar biasa ini dan laporan Andrey.
Ceramah ini terutama ditujukan untuk karyawan magang perusahaan kami dan mereka yang akhirnya ingin menjadi mereka. Mengenai konten, momen-momen seperti standar pengkodean PVS-Studio dibahas di sini:
- ketentuan umum;
- Baris
- penamaan variabel;
- penamaan tipe;
- penamaan fungsi;
- perataan kode;
- tata letak tabel dari kondisi yang sulit;
- memisahkan ruang;
- optimasi prematur;
- optimalisasi ukuran dan struktur kelas;
- variabel dengan masa hidup pendek dan banyak lagi.
Metaprogramming di C ++: template, perhitungan constexpr, dll.
Philip beristirahat, mendapatkan kekuatan dan diberi tahu untuk "templat magic". Semua orang tahu bahwa pemrograman dengan setiap rilis standar baru menjadi semakin rumit dan tidak dapat dipahami, dalam basis kode jumlah "keajaiban templat" terus bertambah. Kuliah mengatur tugas untuk tetap up to date, menceritakan tentang aspek-aspek utama dari metaprogramming:
- fungsi templat;
- Kelas templat
- spesialisasi penuh dan sebagian dari templat;
- templat variabel;
- konvolusi.
Pendengar setelah 30 menit:
Tapi itu belum semuanya! Philip memutuskan untuk
menyelesaikannya dengan pembicaraan
akhir tentang perhitungan dan manipulasi tipe pada tahap kompilasi, tentang CRTP (pola templat berulang yang aneh), SFINAE, dan detektor.
Perakitan proyek C / C ++ dan pengoptimalannya
Orang-orang yang selamat dari kuliah sebelumnya diberi tahu cara minum lebih sedikit kopi dan kurang bertarung dengan pedang saat proyek mereka sedang disusun.
Aspek-aspek berikut ini diangkat:
- fase terjemahan dalam C / C ++;
- kecanduan;
- template eksternal;
- tajuk yang dikompilasi sebelumnya;
- kompilasi paralel dan terdistribusi;
- cache kompiler;
- penggantian komponen terjemahan: preprocessor, compiler, linker;
- Unit kompilasi tunggal (SCU);
- modul.
Perilaku tak terbatas, atau cara menembak diri sendiri di kaki
“Beberapa orang berpikir mereka tahu bagaimana C dan C ++ berperilaku ketika mereka bermain dengan overflow atau null pointer. Tidak, mereka tidak tahu. Dan tidak ada yang tahu. Di sini perilaku tak terbatas dimulai, dan kata "tidak terbatas" berarti bahwa kita tidak dapat membuat asumsi atau dugaan. Sangat tidak mungkin untuk menulis program di mana ada perilaku, periode. Pertimbangkan topik perilaku tidak terbatas dan beberapa contoh kode yang mengarah padanya, ”sesuatu seperti ini adalah awal kuliah 11, di mana Andrei kembali mengambil alih dari Philip dan menyoroti poin-poin penting dari topik ini, termasuk terminologi:
- perilaku tidak terbatas dan tidak spesifik;
- pergi ke luar negeri array;
- kurangnya destruktor virtual;
- hapus operator
- null pointer;
- bergeser;
- integer overflow (kesalahan 64-bit);
- integer overflow (checksum).
C ++ 20 dan masa yang akan datang
Kami tidak dapat menyelesaikan siklus kuliah kami dengan cerita tentang rilis standar C ++ 20 yang akan datang. Penekanan utama ditempatkan pada konsep (
Concepts ), perpustakaan rentang (
Ranges ), coroutine (
Coroutines ), modul (
Modul ), kontrak (
Kontrak ),
operator operator perbandingan tiga arah <=> (
operator pesawat ruang angkasa ), makro untuk pengujian fungsionalitas (
Uji fitur makro ), atribut (
Atribut ),
std :: format ,
std :: jthread dan banyak lagi ...
Jadi, ketika semua masalah organisasi diselesaikan, saatnya tiba untuk mewujudkan ide tersebut.
Implementasi
Tentu saja, kita akan menyebut tahap ini "Harapan-Realitas", karena, seperti yang biasanya terjadi, segala sesuatu yang dipikirkan pada tahap perencanaan berubah satu juta kali lebih banyak pada tahap implementasi. Secara alami, kami menyadari fakta ini dan siap (
tidak ) bahwa ada sesuatu yang salah. Masalah utama bagi kami adalah para tetangga di bawah, yang secara aktif memperbaiki tempat-tempat yang mereka sewa, dan di kantor kami datanglah waktu yang tepat (tanpa komentar), yang tidak bisa tidak memengaruhi rekaman ceramah. Dalam hal ini, hampir setengah dari kuliah dari kursus itu ditulis ulang lagi atau beberapa bagian dari video difilmkan. Dan jika dalam kasus Andrei, tidak ada yang perlu ditulis ulang, karena kuliahnya berlangsung sekitar satu jam dan kami memiliki cukup waktu bagi perusahaan untuk tidak melakukan pekerjaan instalasi dari bawah, maka kami harus menderita dari kuliah Philip, karena 1,5-2 jam per kuliah tidak setiap programmer akan bertahan hidup dan tidak setiap pekerja mampu menunggu begitu banyak tanpa bekerja. Mungkin situasi ini adalah yang paling tak terduga, kalau tidak, tidak ada masalah serius.
Sekarang mari kita bicara tentang awal kursus. Sekitar 20 peserta mendaftar untuk kuliah pertama kami, tetapi sebenarnya 11 siswa hadir. Tentu saja, kami mengerti bahwa menilai dari peristiwa pertama itu bodoh, dan memutuskan untuk menonton apa yang terjadi selanjutnya. Jumlah siswa untuk seluruh kursus terus berubah: itu meningkat atau menurun. Namun, kami menyukai kenyataan bahwa "tulang punggung" tertentu dari kelompok itu terbentuk, yang hadir pada setiap ceramah. Dari pro, Anda juga dapat menyoroti aktivitas peserta. Seperti dalam kelompok baru, pada awalnya semua orang merasa malu dan diam-diam mendengarkan ceramah, tetapi sekitar 3-4 ceramah kendala ini berlalu dan kelas berjalan dalam bentuk yang lebih aktif - pertanyaan, diskusi, komunikasi langsung setelah ceramah - dan ada kasus, ketika seseorang terus berkomunikasi dengan dosen selama 40-50 menit lagi, karena dia sangat tertarik dengan topik dan benar-benar ingin berkembang ke arah ini. Ini tidak bisa tidak bersukacita, karena kami memahami bahwa sebagian kami berkontribusi pada fakta ini (+100 ke karma).

Yang paling gigih diberikan sertifikat.
Ringkasan
Indikator kunci dari efektivitas usaha kami adalah pencapaian tujuan. Sudahkah menjadi lebih mudah untuk bekerja untuk spesialis dan magang muda di tim kami dalam hal sosialisasi dan peningkatan keterampilan profesional? Jelas - ya, karena kuliah didasarkan pada contoh-contoh spesifik yang ditemui programmer kami saat bekerja. Selain itu, bentuk pelatihan ini berkontribusi pada percepatan proses adaptasi dalam tim untuk karyawan baru. Bisakah kita mempopulerkan bahasa C ++ di luar kantor? Terus terang, kami pikir ada 50/50. Di satu sisi, ada orang yang sangat tertarik yang tidak hanya menghadiri kuliah kami, tetapi juga merevisinya nanti, mencari informasi tambahan tentang topik tertentu, dan datang bersenjata lengkap untuk kuliah berikutnya. Ya ada persiapan! Ada suatu kasus ketika hujan turun deras dan seorang lelaki datang basah agar tidak ketinggalan pelajaran. Ini saya mengerti - semangat! Di sisi lain, awalnya ada lebih banyak orang yang ingin mengikuti kursus kami "dari luar" daripada di akhir. Saya punya setidaknya tiga alasan untuk ini:
- Basis CA adalah siswa, dan, mungkin, setelah mendaftar untuk kursus, mereka memiliki ide tertentu tentang topik tersebut, tetapi harapan mereka tidak sesuai dengan kenyataan, karena, meskipun fakta bahwa kursus tersebut mencakup aspek umum pemrograman di C / C ++, banyak masalah sempit dan terspesialisasi.
- Kursus berlangsung di puncak musim panas (ya, kami tahu bahwa tahun ini bukan argumen, terutama jika Anda tinggal di Rusia tengah). Banyak yang meninggalkan kota dan tidak dapat menghadiri kursus, bahkan jika mereka tertarik.
- Ada pemrogram tenaga kerja yang tahu segalanya tanpa kursus kami :)
Sebagai kesimpulan, saya ingin mengatakan bahwa kami mempertimbangkan gagasan untuk membuat kursus pemrograman kecil kami sendiri untuk menjadi sukses, karena pengalaman ini membantu perusahaan kami mengoptimalkan beberapa proses kerja internal dan dengan jelas menunjukkan standar kami kepada pelamar masa depan.
Jika Anda memiliki pertanyaan, mungkin bahkan saran atau ide, jangan ragu untuk meninggalkan komentar - kami akan berbicara :). Dan ya, terima kasih sudah membaca artikel ini.
Tautan ke pilihan laporan:
Vkontakte "Modern dan Efektif C ++" dan
YouTube . Kami akan berterima kasih jika Anda membaginya di jejaring sosial.