Personal Blog

Personal Blog

Qanday qilib software engineerlikni o'rganishni boshlashim kerak?

Qanday qilib software engineerlikni o'rganishni boshlashim kerak?

Software engineering-ga kirish

Subscribe to my newsletter and never miss my upcoming articles

Bugungi kunda yoshlar va xatto kattalar o'rtasida software engineerlikka yoki IT sohasini qanday o'rganishni boshlashda juda ko'p savollar bor. O'zimdan kelib chiqqan xolda javob berishga harakat qilaman. Eng kerakli bo'lgan to'rtta qirra

  • English language
  • Mathematics (+ pure mathematics)
  • Fundamentals of Computer Science
  • Software stacks

English language

Hop, english tilini bilmasdan turib bemalol software engineerlikni o'rganishingiz mumkin lekin english tili bilimlarsiz, engineer bo'lib uzoqqa borish ozgina qiyinroq. Siz ustozlardan yoki mentorlardan malum darajagacha o'rganishingiz mumkin, lekin software engineerlikda va ITda technologylar juda tez o'zgaradi va yangi yangi malumotlar juda tez paydo bo'ladi va sizdan o'z o'zidan self-study (mustaqil o'rganish) talab qilinadi. Bugungi kunda o'zbek zabon engineerlar ko'payib bormoqda, lekin chiqayotgan malumotlarni o'zbek tiliga yoki rus tiliga english tilidan tarjima qilinib sizga yetib borguncha, oylar va xatto yillar ketadi va bu malumotlar ungacha irrelevant / obsolete / outdated (keraksiz, eskirgan) bo'lishi mumkin. Demak, english tili eng muhim!

Mathematics

Hop, mathematics ga kelsak, software engineerlikda deyarli ~80% vaqt rejalashtirish va izlanishga ketadi va ~20% vaqt coding yani programming qilishga ketadi. Siz high school (maktab) mathematics bilimlar bilan yoki umuman mathematics bilimlarsiz software engineer bo'lib qaysidir bir darajaga chiqishingiz mumkin lekin siz mediocre (o'rtacha sifatli) engineerlar qatorida qolib ketishingiz ehtimoli juda katta. Aytganimdek, software engineerlikning faqat ~20% gina codingdan iborat, qolgan qismi planning (rejalash), researching (izlanish), modeling (modellash) va k.z lardan iborat.

Bir misol keltirsam, tassuvvur qiling siz Google companysiga yoki shunga o'xshash bir companyda Maps yoki shunga o'xshagan navigator system / servicelar ustida ishlashga ishga kirdingiz. Va sizga shu servicelarning bir kichik qismi (feature) yuklatildi yani siz bir berilgan nuqtadan (coordinate / city / location) ikkinchi nuqtagacha yo'lni (path) topishingiz kerak (pastagi rasmga qarang, misol uchun).

PIC-4.png

Bilamizki har qanday projectni develop / coding qilishdan oldin, uning conceptual system design / modelini albatta discussion (muhokama) qilinadi. Shu nuqtada, agar sizda mathematicsdagi graph theory bilimlaringiz bo'lmasa, siz o'z o'zidan tupikga kirasiz. Va sizdan siz design qilgan feature hamisha to'g'ri ishlanishini isbot (proof) qilish so'raladi va agar sizda mathematicsdagi proof techniquelar (yani induction, contraction, contrapositive va k.z) bilimlarisiz yana tupikga kirasiz. Sizdan yana serviceingiz hamisha qisqa masofa (shortest path)ni topishini qo'shishingizni so'ralishi mumkin, siz yana mathematicsdagi Circuit, Paths va Euler paths bilimlarisiz yana tupikka kiraverasiz va kiraverasiz va zerikasiz :).

Bunda tashqari deyarli hamma siz ishlatadigan tools (databases, compilers, programming languages), social networking platforms (facebook, telegram), turli xil OS (Windows, Android) yoki xatto sim bilan bog'langan televizorlaringiz va telfonlaringiz ham malum bir mathematics discrete structurelar ustiga qurilgan.

  • Databases - masalan, SQL based databaselarining (MySQL, PostgreSQL) asosida, relational algebra va tuple calculus yotadi va ulardagi set theory, combinational algorithms, relational theory tushinchalari. To'gri bundek tool larni foydalanuvchi sifatida low levelda siz qanday ishlashini tushingishingiz shart emasdir, lekin shundek systemlar quruvchisi sifatida siz albatta shundek mathematics bilimlarga ega bo'lishingiz kerak. Yoki bugungi kunda ko'p ishlatilanayotgan yani Machine Learning uchun, scalable data lar uchun, graph based databaselar (OrientDB, Amazon Neptune, Cassandra) ortida mathematicsdagi graph theory bilimlar yotadi. Yana bitta oddiy misol.

  • Compilers - compilerni asosiy maqsadlaridan biri, high level languagedagi syntax va structuralarni low level tiliga compile qilib berishdan iborat. Bundek compiler qurishda, asosan basic arithmetics, discrete structures (tuples, sets), graph theory va bazi boshqa advanced mathematics bilimlar kerak bo'ladi, savollarizsiz. Bundek misollarga millionlab keltirishimiz mumkin va engineerlikdagi deyarli har bir nuqtada mathematicsga duch kelasiz. Undan hech qachon qochib qutila olmaysiz.

Menimcha eng kerakli mathematics bilimlar shu kurslar o'zi yetadi

Fundamentals of Computer Science

Aytaylik, siz kuchli "biton" mathematics bilimlarga ega bo'ldingiz ajoyib! Tabriklation! Lekin siz software engineer yoki engineer bo'lmoqchisiz, ko'p xolatlarda mathematics bilimlarning o'zi yetmaydi. Software engineerlikdagi har bir technical element bu computer sciencedagi qaysidir bir boshqa element yoki elementlar to'plami ustiga qurilgan bo'ladi. Men computer scienceni, applied mathematicsni bitta branch dek tassavur qilaman. Yani mathematicsdagi malumut bir abstract va discrete tushinchalarni hayotda reallashtirishlishi. Yani buning bitta oddiy misoli "Set" abstract va discrete mathematic tushincha va buni programming tillarda implementation kurishimiz mumkin. Computer science fundamental tushinchalarida, bundek abstract tushinchalarni implementationlarni juda ko'p ko'rishimiz mumkin! Va software engineerlik shundek bir necha abstract va discrete tushinchalarning (mathematics) implementationlardan (computer science) foydalanib bir product yaratish demakdir.

Hop, bizga nima uchun fundamentals of computer science muhim va ular nimalar. Agar siz college yoki universitetda B.S Computer Science o'qisangiz albatta tepada eslatilgan mathematics kursalarni olishga majbursiz fundamentals sifatida. Nimaga kerakligini tushintirdim. Bundan tashqari siz software engineerlikga specialize bo'lsangiz, boshqa advanced courselarni ham olasiz! Bularga misol qilib.

  • Programming languages (Python, C++, Java yoki biror mainstream language)
  • Algorithms/data structures
  • Databases (SQL, NoSQL)
  • System design and patterns
  • Operation systems
  • Compilers
  • Cloud computing
  • Networking va boshqalar.

Software engineerlikda technologylar juda ham tez eskiradi va o'zgaradi. Lekin bu fundamental bilimlar juda sekin o'zgaradi bazilar umuman o'zgarmaydi. Shuning uchun ham har bir o'zgarayotgan technologylar shu fundamental bilimlar ustiga quriladi. Aytaylik agar siz bugun backend engineer bo'lib ishlaysiz, va Android engineer bo'lib ishlamoqchisiz, backenddan transition qilib. Agar sizda fundamental bilimlar bo'lsa bu transition sizga deyarli bilinmaydi. Chunki, low / fundamental levelda siz qaysidir bir OS ga software yozasiz va siz yozmoqchi bo'lgan tilda deyarli structurelar bir xil lekin faqat syntax farq qiladi (yani, har bir high level programming language qaysidir bir compiler yoki interpreter bilan convert bo'ladi, va har bir programming languageda data typelar bo'ladi, conditional statement, looperlar, va qaysidir bir paradigmlarni support qiladigan qilib qurilgan bo'ladi, masalan functional, primitive, object-oriented, aspect-oriented lekin faqat syntax farq qiladi) va siz ishlatmoqchi bo'lgan library yoki frameworklar qaysidir bir design pattern yoki architecture bilan qurilgan bo'ladi. Shuning uchun fundamental bilimlar juda muhim. Shu nuqtadagi bilimlar bilan ham siz data scientist, computer scientist yoki software engineer (entry level) bo'lib ishlashingiz yoki ishga kirishingiz mumkin bemalol.

Software stacks

Sizda fundemental bilimlar zo'r, ajoyib! Shu nuqtagacha yetib kelish juda qiyin! Ko'pchilikni ham qo'lidan kelavermaydi. Siz agar ishga kirmoqchi bo'lsangiz albatta har bitta companyda ayniqsa startup companylarda qaysidir bir software stack bilan ishlayotgan bo'ladi.

Masalan, oddiy misoli hamma tushinadigan, Android / Kotlin / Java yoki Web / Javascript / Typescript / Mongo / React / Node.js va shunga o'xshagan. Siz o'zingizga qiziqqan bitta stackni tanlab olib, o'rganing. Agar sizda fundamental bilimlar zo'r bo'lsa, shu stacklarni o'rganib o'zlashtirish juda oson bo'ladi. Va bir stackdan ikkinchisiga o'tish ham juda juda oson bo'ladi.

Xulosa sifatida aytsam, software engineerlikni, umuman, engineerlik sohasi ozgina qiyinroq soha va yaxshi engineer bo'lish uchun yillar ketadi. Sizning motivationingiz o'rganish va shu bilimlar bilan ixtirolar yatarish bo'lgandagina bu sohani tanlang. Agar sizda "finance" motivation yani oz vaqt ichida o'rganib ko'p daromat qilish niyat bo'lsa yoki shunga o'xshash motivationlar bo'lsa ancha qiynalasiz va zerikasiz va bu maqsadda software engineerlikka kirmagan maqul. O'zingizni qizishlaringiz va intuitionlaringizga quloq soling.

 
Share this