Engineering Notes
2.46K subscribers
137 photos
5 files
208 links
Kanalda asosan backend engineeringga oid postlar yozib boriladi.

Ba'zi postlarda xatoliklar bor.
Postlar foydali bo’lgan bo’lsa adminni duo qilib qo’ying. Rahmat.

Contact: @Bobosher_Musurmonov
LinkedIn: https://www.linkedin.com/in/bobosher-musurmonov
Download Telegram
Ba'zi katta platformalarda username tanlayotganingizda aslida mavjud bo'lmagan username kiritsangiz ham "Username already exists" deb chiqishi mumkin. Ko'p hollarda bunga sabab platforma usernameni tekshirish uchun bloom filter ishlatgani va false positive holat uchun ikkinchi darajali qidiruv ishlatilmagani sabab bo'ladi. Natijada qidiruv tezligi oshsa-da, ba'zida bir username boshqasini "to'sib" qo'yadi.

Bloom filter nima?

Agar O(1) vaqtda kiritilgan ma'lumot sizdagi ma'lumotlar to'plami ichida bor yoki yo'qligini tekshirish so'ralsa qanday yechim qilasiz? Menimcha, Joma akaning eng kuchli quroli – hashmap ishlatasiz. Lekin sizdagi ma'lumot hajmi juda kattalashib ketsa hashtable anchagina joy talab qiladi.

Bloom filter ham hash tablega o'xshash data structure, faqat ancha kam joy oladi. Buning uchun u bitta hash function o'rniga bir nechta hash function kombinatsiyasini ishlatadi. Lekin buning natijasida bloom filter probabilistic data structurega aylanadi. Ya'ni u "bor" yoki "yo'q" emas, "yo'q" yoki "bor bo'lishi mumkin" degan javoblar qaytaradi. Bor bo'lishi mumkin degani bor degani emas.

Masalan A qiymatni bloom filterga (hash functionlarga) kiritganda 1 va 2 qiymatlari qaytdi va bit arrayda shu qiymatlar "band" deb belgilandi. B qiymat esa 2 va 3 natija qaytardi. Endi 3 ham band qilindi. Keyin C ma'lumot hash functionlarga kiritilganda 1 va 3 natijalar qaytdi. Aslida oldin bunday ma'lumot kiritilmagan bo'lsa ham 1 ham 3 ham "band" bo'lgani uchun bloom filter bu ma'lumot oldindan bor degan natijani qaytaradi. Xuddi mana shu holat false positive deb hisoblanadi.

Bloom filterning eng katta kamchiliklaridan biri esa unga kiritilgan ma'lumotni o'chirib bo'lmasligida. Sababi, bit arraydagi 1 ta bitni bir nechta kiritilgan bir nechta qiymatlar har xil boshqa kombinatsiyalarda belgilagan bo'lishi mumkin. Masalan, A (1, 2) bitlarni, B (2, 3) bitlarni belgilagan. Ikkalasi ham bit 2 ni belgilagan. Agar A (1, 2) ni o'chirsa B (2, 3) ham bit 2 o'chgani sabab invalid bo'lib qoladi. Shuning uchun bloom filterga kiritilgan ma'lumotni qaytib o'chirib bo'lmaydi.
(G'oya: Browsing history uchun ishlatish kerak edi buni🙂)

@boboshersnotes
👍22
Forwarded from Abduaziz π
​​🥚 "self-hosting" kompilyatorlar 🐔

G'alati ammo deyarli barcha duch kelgan mavzu.

Cpython(yoki python)ning 65%i python'da yozilgan ekan. Typescript'ning github sahifasiga kirib ko'rsangiz, yanada g'alati holatga duch kelasiz "typescript, 100% typescript'da yozilgan" (wasssup!) Tushunganingizdek post shu jarayonni to'liq yoritishga harakat qiladi.

Mantiqan imkonsiz, X paydo bo'lmasidan avval, yangi X'ni qanday qilib X'da yozilishi mumkin? Tovuq va tuxum bekorga emasda! Lekin miyani shishirib o'ylasa buning iloji bor, misol uchun siz birinchi robot "yasovchi" robotni ishlab chiqasiz. Keyin esa u ham o'ziga o'xshagan robot "yasovchi" robotlarni ishlab chiqaveradi. Bundan esa "robot yasovchi robot, robot yasovchi robot tomonidan yasaladi" degan falsafa paydo bo'ladi☠️ Vs-Code'ning yangi talqinini, eski talqinida kod yozib ishlab chiqish mumkin-ku! Birinchi qadam muhim, birinchi robotni aynan siz yasaysiz va eski || kuchsiz narsadan foydalanib kuchliroqini ishlab chiqish mumkin. O'zini-o'zi "yoza" oladigan ya'ni "self-hosting" kompilyatorlarda ham shu holat.

Ushbu bosh og'riq uchun boshida albatta bir til kerak bo'ladi. Tasavvur qiling, shunaqangi tosh davrida yashayapsizki sizda assemblerda yozishdan boshqa chora yo'q (xuddi GM'dek). Biror loyihani 0 dan assemblerda terib chiqish, umringizni qisqartirishdan boshqasiga yaramaydi. Keyin odam bolasi ishlata oladigan til ishlab chiqmoqchi bo'lasiz. "Ojayib", lekin birozdan so'ng yeb qo'yganingizni tushunasiz. Yangi til ishlab chiqmoqchi bo'lsangiz uni yana oxirigacha assemblerda terib chiqishingizga to'gri keladi (2 15 1 30). Sizda yangi "genialniy" g'oya bor. Umringizni 5-10 yilga qisqartirib, 1-2 oy ichida tilingizni (xlang deylik) 1- talqin(=versiya) kompilyatorini assemblerda yozib chiqasiz. Bu talqin juda sodda va keyingilari uchun asos vazifasini o'tab, tilning asosiy xususiyatlari, operatsion tizim va xotira bilan ishlash ko'nikmalarini ham qanchadur miqdorda o'z ichiga olgan bo'ladi. Demak xlang-1 tayyor unda kod yozish mumkin. Endi esa xlang-1 va qisman assemblerdan foydalanib yangi xlang-2 hisoblanmish yanada kuchliroq kompilyatorni ishlab chiqasiz. Har safar avvalgi kompilyatordan foydalanganingiz sari tilingizda assemblerning ulushini 0%ga intiladi, qaysidur talqinda tilingizni 100% o'z-o'zida yozib qo'yasiz 🎉 Post boshida keltirilgan TypeScript ham avval JavaScriptda ishlab chiqilgan edi. Yuqorida izohlab o'tilgan yangi kompilyatorni, eski talqinida yozish kabi jarayonlarning barchasi bootstraping deb nomlanadi.

Shaxsan, bu texnikani ko'pchilik bilgan ikki soqolli "brat"lar ko'proq qo'llagan deb bilaman. Ken Thompson bir kun B tilini ishlab chiqgan. Sintaksis biroz sodda, hisob-kitoblarga yaraydigan yaxshi til bo'lgan. Ammo Dennis Ritchie "brat"iga qarab UNIXni oxirigacha assemblerda terib chiqsang soqoling ichkariga qarab o'sadi, kel undan ko'ra xotira & "temir mashina" bilan ishlay oladigan til ishlab chiqaylik degan (sarkazm). So'ng, B'dan foydalanib C'ni yaratib qo'yishgan. Ammo C'ning o'rtada kichkina relizi bo'lganki aynan o'sha kompilyatordan foydalanib, ushbu ketma-ketlik asosida yangi kompilyatorlar yozilib borgan. Ushbu texnika odamzotni qanday muammolardan saqlab qolganini shunchaki tasavvur qilib ko'ring.

Sizda savol paydo bo'lishi mumkin, python C'ga, C esa self-hosting yoki boshqa balo-battarlarga, hammasi esa assemblerga asoslangan bo'lsin ammo assemblerning o'zichi ?! Javob: assembler 0 va 1 larga asoslangan. Ha, siz u vaqtda yuqoridagidek "xitrilik"(bootstraping, self hosting ...) qila olmas edingiz va MASHINA KODIda🔥 yozishga shunchaki majbur bo'lgansiz. Ammo keyingi versiyalarida "xitrilik" ishlatilgan ya'ni assembler-2 uchun, assembler-1dan foydalanishgan ... Savolni 0 va 1 larga nisbatan qo'llaydigan bo'lsak, 0 va 1 larning kelib chiqishi elektronika va mikroprotsessorlarga borib taqaladi.

Mavzu juda keng, keyinroq albatta T-diagrammalarini o'rganing(shu yordamida tushunganman). Asosiy savolingizga javob topgan bo'lsangiz xursandman.

Foydali deb bilsangiz yaqinlaringizga ulashing.

@AbduazizPy
👍17
Layer 4 – Transport layer

Va nihoyat butun OSI modelining yuragi bo’lgan transport layerga yetib keldik. Bu qavatda aslida juda ko’p narsa sodir bo’ladi, lekin ular asosan 2 ta muammoni yechishga yo’naltirilgan. Hozir shu ikki muammoni sabablari bilan ko’rib chiqishga harakat qilamiz.

1. Kompyuter qurilmalari rivojlanishi natijasida bitta komputerda bir vaqtda bir nechta dastur ishlashi imkoni tug’ildi. Bu esa networkingda yangi muammoni yuzaga chiqardi. Ma’lumotni tarmoqdagi qaysi qurilma yuborgani va qaysi qurilmaga yuborilayotganini ko’rsatish uchun biz IP addresslardan foydalangandik. Endi bu yetarli bo’lmay qoldi. Endi manzilda qurilmaning o’zini ko’rsatishdan tashqari shu qurilmadagi qaysi dastur yuborayotgani yoki qaysi dasturga yuborilayotganini ham ko’rsatish kerak bo’ldi. Sababi, bitta qurilmada bir vaqtda bir nechta dastur internetdan foydalanayotgan bo’lishi mumkin. Bu dasturlarga kelayotgan ma’lumotlar bir-biri bilan aralashib ketmasligi kerak, axir Telegramga kelishi kerak bo’lgan ma’lumotingiz Youtubega kelishini xohlamasangiz kerak?

Natijada portlar tushunchasi paydo bo’ldi. Portlar shunchaki bitta qurilmadagi har xil sonlar bilan belgilangan bir dunyo (aniqrog’i, 65536 ta) kirish eshiklari. Masalan, Telegram 8000 raqamli eshikdan ma’lumot yuboradi va qabul qiladi. Youtube esa 9000 raqamli eshikdan foydalanadi. Natijada, bitta komputerda ikkita dastur bir-biriga halaqit bermagan holatda internetdan foydalana oladi.

2. Network layer ma’lumotlarni yetkazib berishga xizmat qilsa ham u to’laqonli transport mexanizmi sifatida xizmat qila olmas edi, sababi uning imkoniyatlari juda kam edi. U xuddi g’ildirakka o’xshaydi. Bir o’zi to’la transport bo’la olmaydi, lekin transportlarning asosini tashkil qiladi. Mashina ham, mototsikl ham, avtobus ham g’ildiraklar ustida yuradi, lekin imkoniyatlari, narxi va vazifasiga ko’ra farq qiladi. Masalan, mashina qulay, ishonchli, lekin qimmat. Avtobus arzon lekin shu bilan birga noqulay va sekinroq. Mototsikl esa tez, nisbatan arzon lekin ishonchsiz.

@boboshersnotes
👍10
Xuddi shu jarayon internet bilan ham bo’ldi. Ba’zida yetkazish tezligidan ko’ra ishonchlilik muhim, ba’zida esa tezlik muhim bo’lib ishonchlilik ikkinchi o’ringa tushadi. Bunday har xil talablarni bitta transport mexanizmi orqali hal qilib bo’lmas edi. Shuning uchun ishlashi va ishlatilish o’rni bir-biridan farq qiladigan 2 ta alohida transport mexanizmi – transport qavatidagi protocollar ishlab chiqildi:

— UDP. Yetkazish tezligiga qaratilgan protocol. Lekin yetkazib berishni kafolatlamaydi. Stateless protocol, ya’ni yuboruvchi qurilmada tarmoqqa chiqqan datagram (UDP protocolidagi ma’lumot uzatish birligi) haqida ma’lumot bo’lmaydi. U kerakli joyga yetib bordimi yoki yo’lda adashib qoldimi yoki qayergadir tiqilib qoldimi bundan xabari yo’q. Ma’lumotni tarmoqqa chiqardi va bo’ldi, uning ishi tugadi. Tez, lekin ishonchsiz.

— TCP. Yetkazish sifatiga qaratilgan protocol. Ma’lumotni yetkazib berish kafolatlanadi, lekin UDPdan ko’ra ancha sekin ishlaydi. Stateful protocol, ya’ni yetkazuvchi qurilma tarmoqqa chiqib ketgan segment(TCP protocolidagi ma’lumot uzatish birligi)ning holatidan xabardor bo’lib turadi. TCP ma’lumot yetkazilishini ta’minlash uchun juda ehtiyotkor (xuddi viloyatdan Toshkentga ketgan farzandi yetib borgunicha 8 marta telefon qiladigan ota-onalarga o’xshaydi). Ma’lumot yuborishdan oldin yuboruvchi qabul qiluvchi bilan bog’lanib, ikkala tomon kelishib oladi (bu connection hisoblanadi). Keyin ma’lumotlarni yuborish davomida ham yuboruvchi qabul qiluvchidan tashqari o’rtadagi routerlardan ham hol-avhol so’rab turadi (router bir vaqtda ko’p ma’lumot olsa hazm qila olmay, mazasi qochib qolishi mumkin). Zarur bo’lsa, ma’lumot yuborish tezligini oshiradi yoki kamaytiradi. Har bir borgan ma’lumotni qabul qiluvchidan tasdiqlatib oladi. Agar ma’lumotning bir qismi qabul qiluvchiga yetib bormasa, qaytadan yuboradi. Qisqasi, TCP anchagina ish qiladi. Lekin bu asosiy mavzu bo’lmagani uchun batafsil to’xtalmaymiz.

Xullas, transport layerda ma’lumot yetkazish uchun har xil imkoniyatlarni beradigan transport protocollari ishlaydi. Bundan oldingi 3 ta qavatdan ajralib turadigan jihati, oldingi 3 ta qavat hamma uchun bir xil edi. Shu yerdan boshlab esa bitta qavatda sodir bo’ladigan ishlar tanlangan protocolga qarab farq qiladi. Shu yerdan boshlab bizda yana o’sha klassik tezlik yoki sifat tanlovi bor. Shuning uchun ham bu qavat OSI modelidagi eng asosiy qavat hisoblanadi. Albatta, yana portlar ham bor.

@boboshersnotes
👍13
Bugun Leetcodeda mana bu masalani yechib ko’rayotganda qiziqib, linear search ishlatib ko’rdim. Albatta, bu eng oddiy va effektivligi past yechim edi, lekin shu yechim orqali qanday natija olishni ko’rmoqchi edim.
Qizig’i, runtime 91% submissionlardan yaxshiroq chiqdi.
Menimcha, ko’pchilik fancy yechim qilaman deb aslida eng oddiy yechimdan ham yomon yechim qilib qo’ygan, yana bilmadim.
👍10
Wanna buy me a coffee? Here you go:
5614681916480936

P.S. Tirikchilik ))
👍25😁22😢5
Bir muammoni yechishning ko'plab usullari bor. Ular tezlik va effektivlikdan tashqari muammoga yondoshuv jihatidan ham bir-biridan farq qiladi. Ba'zi yechimlar qo'pol, muammoni "tekislab" tashlaydigan bo'ladi. Ba'zilari esa nozik va chiroyli yechim bo'ladi.

Masalan, Floyd's cycle (yoki Tortoise and Hare) algorithmiga e'tibor bering. Boshida foydalanish uchun oson, lekin qanday ishlashi biroz abstrakt ko'rinadi. Lekin algorithmning ortidagi g'oyani tushunganingizdan keyin qoyil qolasiz. Oddiy matematika yordamida ishlangan san'at asari.

P.S. Afsuski ko'pchilikka muammoga qanday yondoshish emas, yechimdan qanday foydalanish qiziq.
👍27
There are only two hard things in Computer Science: cache invalidation and naming things.

© Phil Karlton
😁24👍3
Agree?
😁14👍7😢2
Biz biladigan zamonaviy dasturlash yuzlab, minglab qavatlardan iborat abstraksiyalar ustiga qurilgan. Natijada, bizda kichikroq, kuchsizroq komponentlardan foydalangan holda minimal mehnat bilan katta dastur qurish imkoniyati bor.

Lekin buning bir "lekin"i bor. Har bir qavat ma'lum darajada resurs isrof qiladi. Bu asosan interface noto'g'ri ishlab chiqilganidan yoki noto'g'ri foydalanilgani uchun sodir bo'ladi (aslida yozib qo'yilgan to'g'ri usulning o'zi yo'q). Bundan tashqari, ko'pchilik low-level interfacelar multi-purpose qilib ishlab chiqiladi (albatta, kamroq mehnat uchun). Bu esa yana resurs yo'qotilishiga olib keladi.

Demak, dastur qancha yuqori darajali bo'lsa shuncha effektivligi past bo'ladi va hardwarening to'la potentsialini shuncha sindiradi. Hozir biz yozadigan dasturlar orqali kompyuterlarning to'la imkoniyatining o'ta kichkina qismidangina foydalanamiz xolos. Agar to'la potensialida ishlata olsangiz, Intel Pentium processori va 2 GB RAM orqali ham "ancha-muncha" ish qilsa bo'ladi (eslasangiz, 50 yil oldin 4 KB RAM bilan inson oyga uchgan).

Shuning uchun low-level tillar high-level tillardan ko'ra ancha tez va effektiv.
👍37
Demak, hardwarening imkoniyatlaridan kelib chiqadigan bo'lsak, zamonaviy dasturlarning effektivligi ancha past. Xo'sh, buni to'g'rilashning iloji bormi? Balki.

Bundan 10-15 yillar oldin avtomobil industriyasida xuddi shunga o'xshash holat bo'lgan. 5-6 litrli, 700-800 HPga ega dvigatellar ishlab chiqilgan. Lekin dvigatel effektivligi 30-35% atrofida bo'lgan, ya'ni energiyaning faqatgina uchdan bir qismidan foydalanilgan. Albatta, buni yaxshilash uchun har xil "trick"lar ishlab chiqildi (aerodinamik korpus, turbochargerlar va h.k.), lekin yuqori darajadagi o'zgarishlar juda kam natija berdi.

Keyin sahnaga elektrodvigatellar chiqdi (aniqrog'i, qaytdi). Bu fundamental o'zgarish dvigatel effektivligini 80-90% gacha oshirdi. Narxlar arzonlashdi, rekordlar yangilandi. Aslini olganda, electrocarlar yangilik emas, birinchi marta 19-asrda ishlab chiqilgan. Faqat o'sha vaqt ilm-fan va texnologiyasi elektrocarlar rivojlanishi uchun yetarli emas edi.

Balki, shunga o'xshash jarayon yaqin kelajakda komputerlar industriyasida ham sodir bo'lar? Balki analog komputerlar yana sahnaga qaytar?
Balki kvant komputerlarini general use uchun ishlatish imkoniyati paydo bo'lar?
Kuzatamiz...
👍30
Bugun statistics kursida R tili bilan ishlab ko'rdik. Statistics uchun maxsus ishlab chiqilgan til ekan. Shuning uchun computer sciencening qoidalariga tupurib qo'ygan.

Siz computer scientist bo'lsangiz, tilni ko'rib chiqishda ehtiyot bo'lishni maslahat beraman. Allergiya qo'zg'atishi mumkin ))
😁8👍3
Bizning sohamizda texnologiya haqida hech narsa bilmaydigan managerdan ko'ra texnologiya haqida ozgina biladigan manager xavfliroq bo'lsa kerak. Sababi, texnologiyadan xabari yo'q manager muhim texnik qarorlarni ishini yaxshi biladiganlarga qo'yib beradi. Bu sohada ozgina, yuzaki bilimi bor manager esa odatda hamma narsani shu bilganlariga qarab o'lchaydi va noto'g'ri qarorlar qilishi mumkin.

Masalan, hozir bizda kerak joyda ham, keraksiz joyda ham microservices qurish "moda" bo'lgan. Bunga asosiy sabablardan biri (lekin yagona sabab emas) monolith bir tiyinga qimmat va microservices hamma muammoni hal qila oladi degan o'ta yuzaki fikrga yopishib olgan managerlar. Lekin bu arxitekturaning "lekin"larini yaxshi bilishmaydi. Natijada development team bosim bilan ishlaydi, mahsulot sifati tushadi va h.k. Lekin boshida shu muammolar chiqishini aytganingda quloq solishmaydi. Oxiri borib yana asosiy "aybdor" bechora engineer bo'lib chiqadi.

P.S. Bu yerda gap aynan bir kishi yoki tashkilotga qaratilmagan. Bu faqat o'nlab managerlar va yuzlab engineerlar bilan gaplashish natijasida olgan xulosalarim.
👍28
OOPning kelib chiqish sabablari va OOP falsafasi haqida O'zbek tilida yozilgan yaxshi maqola bormi?
👍6