Ogohlantirish: Sizning dasturiy martaba

Qanday qilib dasturlashning qorong'i o'rmonlarida yo'qolmaslik kerak

Men kodlash faoliyatimni endigina boshlayotganimda, meni bezovta qilayotgan narsa, til / texnologiyani tanlash edi. Nimani o'rganishim kerak, qaerdan boshlashim kerak? Dasturchi sifatida birinchi ishimni olish uchun nimani bilishim kerak? O'sha paytlarda (deyarli 10 yil) Coursera, Udemy yoki SoloLearn yo'q edi. Men o'zimning muvaffaqiyatli ishimga olib boradigan aniq yo'nalishni, to'liq yo'lni aniqlay olmadim. 21-asr kosmonavtining yuqori maoshli, to'yimli, mehribon ishi - dasturchi.

Shu kabi muammolar hanuzgacha mavjud: yangi boshlanuvchilar tanlovda qolmoqdalar, yaxshi dasturchi bo'lish uchun to'g'ri yo'l yo'q va hamjamiyat yangi savollarga javob berishda "iltimos, pitn gut lang ???" kabi iliq emas. . Muvaffaqiyatli dasturiy martaba sari yo'l avvalgidan ham noaniq. Siz (agar siz boshlang'ich bo'lsangiz, C ++ / C ++ 11 / C ++ 14 / C ++ 17, Java, C #, Kotlin, PHP (nima?), Python, Node.js, JavaScript, (kuting) , burchakli, reaktsiya yoki Vue bilanmi?) va boshqalar.

Til, texnologiya yoki ko'nikmalarmi?

Asosiy savolingizga javob berish uchun avval sizdan so'rashim kerak. Nima xohlaysiz? Siz mobil ilovalar, veb-sayt, Facebook kabi veb-sayt yoki Medium-ga o'xshash veb-sayt yaratishdan xursandmisiz yoki Photoshop-ga o'xshash ish stolini yaratmoqchimisiz? Ehtimol siz to'liq o'yinni rivojlantirishga tayyormisiz? Mobil? Ish stoli?

"Texnika kompaniyasida dasturiy ta'minot muhandisi sifatida yollanish uchun nimani bilishim kerak?" Deb javob berishning eng oqilona usuli bu texnik suhbatdan muvaffaqiyatli o'tish uchun o'zlashtirish kerak bo'lgan asosiy ko'nikmalarni aniqlashdir. Birinchidan, biz narsalarni tartibga solishimiz kerak, dasturlash olamiga, uning mamlakatlari va shaharlariga, madaniyati va urushlariga, g'alabalari va yo'qotishlariga sho'ng'ib chiqaylik. Etarlicha sabr-toqat qilmaydiganlar uchun "Kodirovka suhbatiga tayyorgarlik ko'rish" bo'limiga o'ting.

Dasturlash olamini o'rganish bizni uchta asosiy platformaga olib keladi:

  1. Internet (Google Search, Facebook, Amazon, Twitter va boshqalar)
  2. Ish stoli (Dropbox, Photoshop, Visual Studio, Skype va boshqalar)
  3. Mobil (SoloLearn, Instagram, Uber va boshqalar)

Yuqoridagi xizmatlarning aksariyati deyarli barcha platformalarda mavjud, masalan, Skype ish stoli, mobil va (yomon bajarilgan bo'lsa ham) veb-ilova, Twitter bu veb va mobil ilova va boshqalar.

Internet

Internetning o'zi bu nuqtai nazardan juda katta tushunchadir, uni yoritib berish uchun biz uni eng oldingi va orqa tomon deb atashimiz kerak. Front-end - bu ko'rgan narsangiz, orqa tomon - bu ko'rgan narsangizni ko'rish uchun kerak bo'lgan narsa. Shunga qaramay, old qism - bu tashqi ko'rinish va his qilish, orqa tomon - bu foydalanuvchi so'rovlarini qayta ishlaydigan, ma'lumotlar bazasi so'rovlarini qayta ishlaydigan va hokazo dasturni ishlaydigan serverlar.

Foydalanuvchi interfeysi. Agar siz tashqi ko'rinish va his qilishni o'rganmoqchi bo'lsangiz, ya'ni juda go'zal veb-saytlar yaratsangiz, ular foydalanuvchilarga oshiq bo'ladi, siz HTML (tashqi ko'rinish), CSS (tashqi ko'rinish va ko'rinish), JavaScript (hissiyot) xususiyatlarini bilishingiz kerak. Bu hozircha yetarli emas, hozirda toza JavaScript-ni ishlatish etarli emas, shuning uchun hozirgi kunda taniqli Angular, React yoki Vue-ni tanlashingiz kerak. Qaysi birini tanlashni ko'proq sizga yoqadigan kompaniya, Google yoki Facebookga bog'liq? Agar siz Google-ni xohlasangiz, Angular-ga o'ting va agar Facebook-ni yoqsangiz React-ga o'ting. Agar siz ulardan birortasini (g'alati) yoqtirmasangiz, Vue bilan boring. Oddiy! Bundan tashqari, siz HTTP protokolining ichki ishlanmalari kabi ba'zi asosiy tushunchalarni o'zlashtirishingiz, veb-serverlar bilan tanish bo'lishingiz kerak (hech bo'lmaganda Apache yoki Nginx kabi nomlardan qo'rqmasligingiz kerak). Dastur ishlab chiqaruvchisi bo'lish siz orqa tarafdan ma'lumotlarni taqdim etish (foydalanuvchilarni obodonlashtirish) uchun ma'lumotlarni olishni anglatadi, shuning uchun API nima ekanligini, JSON nima ekanligini (va nima uchun XML-dan yaxshiroq) minimal darajada tushunish kerak. (Agar biron-bir narsa notanish bo'lib ko'rinsa, ushbu yozuv oxiridagi Adabiyotlar qismini tekshiring).

Internetdagi ko'plab memlardan biri, front-end va back-end o'rtasidagi farqni tasvirlaydi

Orqa tomon. Ko'rinmaydigan haqiqat, aytilmagan hikoya. Qadimgi kunlarda, PHPni bilish sizni o'zingizni orqa tomondan ishlab chiquvchi deb atash uchun etarli edi, keyin Microsoft ASP.NET ni taqdim etdi. Node.js kelib, narsalarni eng yaxshi tartibiga keltirgunga qadar ular bir-biri bilan jang qilishdi. Voqealar asosida rivojlanishga oid ba'zi tushunchalar Node.js-da eng yaxshisidir, shuning uchun agar siz uni tanlasangiz, sizning loyihangizga ijobiy ta'sir ko'rsatasiz.

Orqa tomonning chalkash tomoni bu tilning xilma-xilligi, shuning uchun siz istagan tilni orqa-oxirida ishlatishingiz mumkin, nuqta, "back-end" bu "so'rovlar bazasi, ma'lumotlarni qayta ishlash, ma'lumotlarga javob berish" uchun qisqa nom. Mijozga va uni imkon qadar samarali bajaring "va" to'g'ri "tilni / texnologiyani / ma'lumotlar bazasini tanlash afzal emas. Ba'zi bir ishlab chiquvchilar MySQL yoki PostgreSQL kabi Relational Databases bilan ishlayotganda, yangi kelganlar qorong'u tomonni, NoSQL ni (Cassandra yoki MongoDB kabi) tanlashadi. Tanlov haqiqatan ham siznikidir, ammo menda oddiy formulalar mavjud. Ma'lumotlaringiz uchun qat'iy sxemangiz bormi va yaqin kelajakda u deyarli o'zgarmaydi? Relational Database-ni tanlang. Bir daqiqada milliondan ortiq tashrifingiz bormi? NoSQL-ga o'zgartirish (og'riq bilan). Mahsulotingiz tezda o'zgaradimi? NoSQL-ni tanlang. Aytaylik, siz tomonni tanladingiz, endi qanday aniq texnologiyani tanlashingiz kerak? Sizga Microsoft-ni yoqadimi va Windows-ning serverlari bormi? MsSQL-ni tanlang. Sizga Oracle yoqadimi? Oracle-ni tanlang. Siz Oracle bilan yaxshimisiz, lekin siz bir vaqtning o'zida Microsoft-dan nafratlanasizmi? MySQL-ni tanlang. Haqiqatan ham hech kimga ozor berishni xohlamaysizmi? PostgreSQL-ni tanlang.

NoSQL juda qiyin. Bu, albatta, sizning xizmatingizga va ma'lumotlar arxitekturasiga bog'liq. Sizda shunchaki hujjatlar va ular orasida zaif aloqa bormi? MongoDB-ni tanlang. Siz kalit qiymatli juftliklarning ulkan to'plamini saqlashingiz kerakmi? Redis-ni tanlang. Siz grafikka o'xshash tuzilma bilan ishlamoqdasiz (Facebook do'stlari grafigi, Google bilim grafigi va boshqalar)? Neo4j-ni tanlang. Haqiqatan ham sizga nima kerakligini aniq bilmayapsiz, lekin barchangiz sizga kerakligini his qilasizmi? ArangoDB-ni tanlang.

Ma'lumotlar bazasi barcha kerakli ma'lumotlarni o'z ichiga olgan holda, siz o'zingizning mijozlaringiz so'rashlari va ma'lumotlar bazasiga o'qish / yozishi mumkin bo'lgan API-ni belgilashingiz kerak. Bu erda eng foydali variant - Node.js, garchi siz PHP yoki ASP.NET yoki Ruby yoki Python-ga o'tishingiz mumkin bo'lsa-da, shaxsiy maslahatim Node.js bo'ladi. Facebook PHP-ni o'zining orqa qismida PHP dan foydalanadi. Ular PHPning katta qismini C ++ da qayta yozdilar. Ba'zilar Python-dan foydalanishadi, boshqalari Ruby-ni afzal ko'rishadi. To'g'ri, siz deyarli har qanday tilni orqa tomondan ishlatishingiz mumkin, masalan, Google C ++, Java va Python (Go bilan birga) dan foydalanadi. Ma'lumotni past darajadagi ishlov berish uchun C ++ eng mos keladi, masalan, foydalanuvchi do'stlari tavsiyalarini yangilash kabi orqa fonda ishlaydigan Java uchun eng yaxshi variant. Ma'lumotni tahlil qilish yoki tabiiy tilni qayta ishlash yoki hozirgi kunda mashhur bo'lgan AI bilan bog'liq bo'lgan vazifalar uchun siz Python-dan foydalanasiz.

Shunga qaramay, turli tillar, ramkalar, ma'lumotlar bazalaridan tashqari, ba'zi asosiy tushunchalarni ham o'zlashtirishingiz kerak.

  • Keshlash. CPU keshidan boshlab (har xil darajadagi) va brauzer keshi bilan yakunlanadi. Google Search yoki Facebook kabi yuqori yuklanish xizmatlari uchun hamma joyda foydalaniladigan keshlash juda muhimdir.
  • Serverlar. Siz bu apparat bilan bog'liq deb o'ylashingiz mumkin (agar ma'lumotni saqlash va ishlov berishda bir qism sifatida ishlash uchun bir nechta kompyuterni qanday sozlashni bilsangiz juda yaxshi bo'ladi), chunki orqa tomonda ishlab chiquvchi server veb-serverni anglatadi. Hozirgi kunda ommabop veb-server Nginx bo'lib, uni qanday sozlash va sozlashni bilish kelajakdagi harakatlaringizda juda katta foyda keltiradi.
  • Soketlar. Tarmoq dasturlashining asosi. Siz tarmoq orqali yuboradigan / qabul qiladigan barcha narsalar rozetkalar orqali amalga oshiriladi. Soket dasturlashning past darajadagi tafsilotlarini bilish sizning mahorat inventarizatsiyangizda yaxshi bonusdir (TCP soketlari, UDP rozetkalari va WebSockets nima ekanligini farqi juda katta ortiqcha).
  • Ma'lumotlar bazasini loyihalash. Qaysi MBBTni tanlamasligingiz yoki ishlashingiz kerak bo'lishidan qat'iy nazar, ma'lumotlar bilan ishlash sizning asosiy vazifalaringizdan biri bo'ladi. To'liq rasmni ko'rish, ma'lumotlar va ma'lumotlar bloklari orasidagi aloqalarni vizual ravishda ko'rish qobiliyati bu sizning butun dasturiy karerangiz davomida egallagan mahoratdir.
  • Xavfsizlik. Yuqorida aytib o'tilgan boshqa tushunchalar singari, bu juda kengdir. Siz ulardan hech birini to'liq o'zlashtira olmaysiz, shuning uchun siz hech bo'lmaganda oddiy matn kabi emas, balki parolli xeshlarni saqlash kabi eng yaxshi amaliyotlar bilan tanishishingiz kerak. API token orqali so'rovlarni tekshirish, har bir so'rov uchun foydalanuvchi ruxsatlarini tekshirish va boshqalar.

Ish stoli

Biz ish stoli ilovasini aslida uni ish stoliga aylantiradigan qismi haqida gaplashamiz. Stol usti platformalarida ma'lum mahorat to'plamiga ehtiyoj sezadigan ko'plab dasturlar mavjud, masalan, Photoshop rasmlar bilan ishlamoqda va agar siz Photoshop kabi biror narsa yozmoqchi bo'lsangiz, rasmga ishlov berish algoritmlari va texnikasini bilish shartdir. Agar siz Dropbox kabi biror narsa yozmoqchi bo'lsangiz, soket dasturlarini bilish majburiydir. Kompilyatorni qanday qilib muhandis qilishni bilish Visual Studio singari kompilyatorni yoki IDEni yaratishni istaydi. Biz o'ziga xos xususiyatlarga tegmaymiz, agar ish stolida ishlashni xohlasangiz, sizga qanday tillarni o'rganish kerakligini ko'rib chiqaylik.

Dasturchilar ish stoli dasturlari uchun tillar haqida gap ketganda, C ++, Java yoki C # ni tanlash qiyin kechadi. To'g'ri tanlov qilish uchun oddiy formula mavjud: agar siz Microsoft-ni yoqtirsangiz, C # -dan foydalaning. Agar sizga Oracle yoqsa, Java-dan foydalaning. Agar dasturlash tili ma'lum bir kompaniyaga tegishli bo'lmasligi kerak deb o'ylasangiz, C ++ dan foydalaning. Agar bu ko'p yordam bermasa, keling, quyi platformalarni muhokama qilaylik. Agar siz faqat Windows foydalanuvchilari uchun dastur yozsangiz, C # eng yaxshi tanlovdir. Bu juda ravshan, chunki ikkalasi ham Microsoft mahsulotlaridir va ular eng yaxshi tarzda mos keladi. Garchi C # ishlab chiqaruvchilari .Net Core chiqqandan so'ng, C # Linux muhitida ishlatilishi mumkinligini ta'kidlasalar ham, men shaxsan Linux bilan ishlashni istasangiz, C ++ bilan ishlashni maslahat beraman. Gap shundaki, C ++ u erda joylashgan barcha operatsion tizimlarda juda yaxshi ishlaydigan o'zaro platformali dasturlash tili sifatida yaratilgan (ha, hatto MacOS). Xo'sh, ushbu kontekstda o'zaro faoliyat platforma sizning har bir aniq OS uchun dasturingizning "turli xil" ijro etuvchilarini yuborish uchun C ++ loyihangizni barcha operatsion tizimlarda alohida-alohida tuzishingiz kerakligini anglatadi. Rostini aytganda, C ++ da biron bir GUI yo'q. Buning uchun eng katta bahona bu "C ++" - hardkorlarni ishlab chiqaruvchilar uchun, va hardcore ishlab chiquvchilari "Terminal" (buyruq satri interfeysi) dan boshqa hech narsa ishlatmaydilar ". Biroq, mehribon ishlab chiquvchilar bir joyga yig'ilib, C ++ ga juda mos keladigan eng yaxshi xoch-platformali GUI kutubxonasini yaratdilar.

Va nihoyat, C ++ dasturining murakkabligi va sizning foydalanuvchilaringiz uchun to'liq GUI tajribasiga ega bo'lish uchun Qt kabi alohida kutubxonani ulashingiz va siz turli xil OS uchun mahsulotingizning turli xil ishlaydigan fayllarini kompilyatsiya qilish va jo'natishni istamasligingizdan g'azablansangiz, Java-ga o'ting. . Java o'zining virtual mashinasiga ega, bu esa bajariladigan faylni etkazib berishni osonlashtiradi. Sizning ilovangiz JVM (Java Virtual Machine) o'rnatilgan har qanday OS-da bir xil darajada ishlaydi.

Mobil

Java haqida gapirganda, birinchi navbatda, Android haqida fikr keladi. Kotlin dunyoga tanilishidan ancha oldin, Java dasturlari Android dasturlarini amalga oshirish uchun haqiqatan ham til edi. Bugungi kunda Kotlin ishlab chiquvchilarning qalbini o'ziga jalb qiladi va Android platformasi uchun ilovalarni ishlab chiqishda yanada yaxshi tajribaga ega bo'lishga imkon beradi. Shunday qilib, agar siz Android dasturlarini qilmoqchi bo'lsangiz, Java va Kotlin-ni tanlashingiz kerak. To'g'ri tanlov qilish uchun sahna ortiga qarash kerak. Gap shundaki, Google Oracle-ga unchalik yoqmaydi. Google-ning Android-da Oracle Java va Java-ga egalik qiladi, shuning uchun bu erda biroz moslashuvchan bo'lish uchun Google engil tomonni (yoki sizga qorong'u tomonni) tanlash kerak edi va Kotlinni "voy, agar bo'lsa Java-dan foydalaning. biz bu ajoyib tilni qo'llab-quvvatlaymiz ”. Men shaxsan siz Kotlin bilan boshlashingizni maslahat beraman, agar siz Android-ning ishlab chiqaruvchisi karerangizni endigina boshlayotgan bo'lsangiz, bozordagi malakali dasturchi bo'lish uchun Java-da ilgari ishlatilgan dasturlarni qo'llab-quvvatlashingiz kerak, shuning uchun Java-ni bilish sizning rezyumelaringizda yaxshi bonus bo'ladi.

Va nihoyat, iOS. ILand. Umuman boshqacha hikoya. Uzoq vaqt davomida Objective-C iOS uchun dominant til bo'lib kelgan va mutlaqo halol bo'lish uchun, Objective-C-ni o'zlashtirish jiddiy yondoshish, qat'iy ko'rinish va ba'zi bir qat'iyatlilikni talab qiladi. Bu juda kam miqdordagi Objective-C ishlab chiqaruvchilarining asosiy muammosi edi va Apple nihoyat Swift-ni tanlab to'g'ri harakatni amalga oshirdi. Objective-C-ga qaraganda Swift-ni o'zlashtirish osonroq, bu iOS dasturchilarining ko'payishiga olib keladi. Shunday qilib, iOS-ning ishlab chiqaruvchisi bo'lish uchun siz Swift-ga borishingiz kerak, lekin chinakam ishonadigan dasturchi bo'lish uchun, Objective-C-da allaqachon yozilgan ilovalarni (tonna dasturlarni) qo'llab-quvvatlash uchun Objective-C dasturini o'zlashtirish tavsiya etiladi.

Men bu erda React Native-ni eslatib o'tmoqchiman, chunki u faqat JavaScript-dan foydalanib, Android va iOS platformalarida ham dasturlarni yozishga imkon beradi, ammo bozorda yangi va tez o'zgarib turadigan o'yinchi sifatida, keling, shuni ko'rib chiqaylik va siz allaqachon oddiy dasturlarni yozishingiz mumkin bo'lsa. faqat JavaScript-ni bilasiz.

Kodlash bo'yicha suhbatlarga tayyorgarlik

Dasturlash olamida asosiy bo'lgan tushunchalar mavjud. Texnik suhbatlarning aksariyati sizning muammolaringizni hal qilish ko'nikmalarini aniqlash va ushbu tushunchalarni bilish uchun mo'ljallangan, shuning uchun dasturlash tilini o'zlashtirish bilan bir qatorda, dasturchilar arsenalida talab qilinadigan tushunchalar bilan tanishishingiz kerak. Mening SoloLearn-dagi so'nggi darsimdan parcha (quyida Android va iOS ilovalariga havolalar).

Intervyularni kodlash uchun muvaffaqiyatli tayyorgarlik ko'rish uchun siz quyidagi yo'nalishlarga ishonch hosil qilishingiz kerak:
1. Algoritmlar va ma'lumotlar tarkibi
2. Kompyuterni tashkil qilish va operatsion tizimlari
3. Kodlash
4. Tizim dizayni

Algoritmlar va ma'lumotlar tarkibi
Bu dasturchilar uchun eng ko'p talab qilinadigan mahorat. Bu erda har bir dasturchi bilishi kerak bo'lgan mavzular:

Algoritmning murakkabligi: Big-O notation va algoritmlarning murakkabligini qanday hisoblash mumkin; ularning murakkabligi asosida qaysi algoritm yaxshiroq ekanligini bilish, masalan. O (N) va O (logN).

Ma'lumotlarning asosiy strukturalari va adapterlari: Array, bog'langan ro'yxat, stack, navbat.

Saralash va qidirish: Turli xil saralash algoritmlarini bilish sizning loyihalaringiz uchun eng yaxshi amalga oshirilishini aniqlashga yordam beradi. Amaliyot uchun kiritish tartibini, saralash turlarini yoki saralash turlarini bajarishga harakat qiling va chiziqli izlash va ikkilik qidirish o'rtasidagi farqni aniqlang.

Daraxtlar va chizmalar: Daraxtlar va chizmalar Facebook-dagi "do'stlar grafigi" dan "Google Search" dagi "bilimlar grafigi" ga qadar hamma joyda mavjud.

Xesh-jadvallar: dunyodagi eng samarali ma'lumot tuzilmalaridan biri bo'lgan xesh-jadvallar har doim yaxshi tanlovdir. Siz Hashtable dasturini amalga oshirishingiz va to'qnashuvlarni hal qilish usullari bilan tanishishingiz kerak.

Kompyuterni tashkil qilish va operatsion tizimlar
Quyidagi kabi mavzular bilan tanishishni maslahat beramiz:

  • Bitta operatsiyalar
  • CPU mashina kodini qanday bajaradi
  • Statik RAM va dinamik RAM o'rtasidagi farq nima?
  • Qanday OT yadro turlari mavjud
  • "Muteks" va "semafora" o'rtasidagi farq nima?
  • Halokat nima va nokaut nima

Kodlash
Siz kamida bitta dasturlash tilini chindan ham yaxshi bilishingiz kerak. O'zingiz yoqtirgan tilning eng yaxshi va yaxshi tomonlarini bilish har doim samarali, oqlangan va o'qiladigan kodni yozishga yordam beradi.
Amaliy mashg'ulotlar juda qiyin bo'lgan muammolarni hal qilish tavsiya etiladi (masalan, barcha muammolarni SoloLearn-da topish mumkin):

  • Iosif Flaviy muammosi
  • Xanoy minorasi
  • Simlarni siqish
  • Muvozanatli Qavs
  • Egizak raqamlar

Tizim dizayni
Ob'ektga yo'naltirilgan dasturlashni bilish zamonaviy dasturchi uchun zarurdir.
Tizim dizayni butun tizim haqida o'ylashni, uning arxitekturasini loyihalashni, sinflarga ajratishni, ob'ektlarning o'zaro ta'sirini belgilashni anglatadi.
Tayyor bo'lish uchun quyidagi savollarga javob berishga harakat qiling:
- Google Qidiruvni qanday yaratgan bo'lar edingiz? Bir soniyada bir vaqtning o'zida millionlab so'rovlar bo'lsa nima bo'ladi?
- Facebookda do'st qidiruvini qanday amalga oshirgan bo'lardingiz?
- Nimaga ma'lumotlar bazasini boshqarish tizimidan foydalanasiz?
- Nega NoSQL ma'lumotlar bazasidan foydalanasiz?

To'g'ri dizayn naqshlarini bilish va ulardan foydalanish juda tavsiya etiladi. Masalan, siz kompozit va dekorator o'rtasidagi farqni bilishingiz kerak.

Yosh ishlab chiqaruvchilardan asosan muammolarni hal qilish ko'nikmalariga ega bo'lish talab etiladi va sizning birinchi ishingiz yuqorida sanab o'tilgan barcha fikrlarni bilishni talab qilmaydi, bu ro'yxat sizning martabaingizni rejalashtirishda yaxshi yordam beradi.