Engineering Blog
11 subscribers
69 photos
76 links
Software Engineer @ EPAM Systems
CS @ Millat Umidi University

Talks about:
📗 OS
📕 Networking
📙 Backend Engineering
📘 RDBMS & NoSQL
📕 DS & ALGO
Download Telegram
Forwarded from Engineering Notes
print("Hello world")

Bu kodni biz yaxshi bilamiz.
Lekin bu postni o'qiyotganlarning 99% qismi bu kod aslida qanday ishlashini bilmaydi. Ha, aynan shunday.
To'g'ri, Python interpreter kodni o'qib, execute qiladi deyishingiz mumkin, lekin o'sha execute qilish o'zi nima?
Buni siz yozgan bir qator koddan boshlab CPU, RAMda nima sodir bo'lishi-yu, kompyuteringizdagi har bitta atom qanday harakatlanishigacha tushuntirib bera olasizmi? Katta ehtimol bilan, yo'q.

Endi o'rinli savol: Hatto "Hello world" qanday ishlashini bilmaydigan dasturchi qanday qilib sun'iy intellekt yaratishi mumkin?

Gap shundaki, dasturlashda biz hamma narsani noldan, aniqrog'i nolgacha chuqur o'rgana olmaymiz. Xo'sh, unda o'sha chuqurlikni qanday yopamiz? Axir uy tomdan boshlab emas, asosdan boshlab quriladi-ku. Javob – abstraksiya orqali.
Ya'ni biz ichki ishlash tizimini bilmaydigan (ko'p hollarda bilish zarur bo'lmagan) narsalarni shunchaki ishlaydi deb hisoblaymiz yoki qanday ishlashi haqida aslidan farq qiladigan, sodda tushunchaga ega bo'lamiz (aslida bu ham biroz pastroqdagi abstraksiyalar yig'indisi).

Masalan, eng oddiy backend server yozayapsiz va u request kelganida databasedan ma'lumot olib, response yuboradi.
Buni qilish uchun request o'zi nima, uni qanday olamiz, database qanday qilib ma'lumot beradi va hokazolarni bilishimiz shart emas. Ular "shunchaki" o'z vazifasini bajaradi deb hisoblaymiz.

Natijada bizda tizim qanday ishlashi haqida minimal ma'lumot bilgan holda uni ishlab chiqish imkoniyati paydo bo'ladi. Ya'ni aynan abstraksiya sabab komputerdagi har bitta atom qanday ishlashini bilmay turib ham dastur ishlab chiqa olamiz.

Lekin rivojlanishni xohlasangiz, abstraksiyalarni buzib kirishdan qo'rqmang. Yanada chuqurroqqa tushish sizga ko'proq narsani ko'rish va o'rganish imkonini beradi. Natijada biror texnologiya haqida oldin bilgan narsalaringiz noto'g'ri ekanini va u aslida boshqacha ekanini tushunasiz. Oldingi tushunchalaringiz esa kulguli darajada oddiy tuyulishni boshlaydi.
Yana ozgina pastroqda tushsangiz, o'sha "batafsil" bilganlaringiz ham juda oddiy ko'rinadi.

Lekin abstraksiyalarni buzib, chuqurroqqa tushish bizga o'zi kerakmi?
Bilmadim, bu sizga bog'liq. Shaxsan menga end-user ishlatadigan mahsulot ishlab chiqishdan ko'ra boshqa dasturchilar ishlatadigan toollar ishlab chiqish yoqadi. Menga "chuqurroqda" ishlash yoqadi.

Update: Juda yaxshi misol berilgan komment yozildi, biroz o'zgartirib, postga qo'shib qo'yaman:
Har kuni mashinani o't oldiramiz va haydab, ishga boramiz. Lekin buning uchun mashina qanday ishlashini bilish shart emas.
Agar mashinadan faqat ishga borish uchun foydalansangiz, shu yetarli.
Lekin siz mashina tuzatadigan yoki ishlab chiqaradigan mexanik bo'lsangiz ichki qismlar va ular qanday ishlashini albatta bilishingiz kerak bo'ladi.
👍2
Forwarded from Dr. Algorithm
2. Savdogarning jumbog´i

Rimdan mol bilan qaytgan savdogar qaroqchilar tomonidan ushlab olindi. Savdogar muloyimlik bilan rahm-shafqat so'radi, ammo qaroqchilar uni qo`yib yubormoqchi emas edi.

-- Do'stlar, - dedi u, - to'g'risini aytsam, mening vazifam juda oddiy va men uni sizlarga sodda qilib taklif etaman.

Uning gaplari iliq qabul qilindi. Chizmasida ko'rsatilgan rejani ochdi va tushuntirdi:

... davomi keyingi xabarda

https://t.me/DrAlgorithm/443
Forwarded from Dr. Algorithm
Savdogarning jumbog´i

Rimdan mol bilan qaytgan savdogar qaroqchilar tomonidan ushlab olindi. Savdogar muloyimlik bilan rahm-shafqat so´radi, ammo qaroqchilar uni qo`yib yubormoqchi emas edi.

-- Do´stlar, - dedi u, - to´g´risini aytsam, mening vazifam juda oddiy va men uni sizlarga sodda qilib taklif etaman.

Uning gaplari iliq qabul qilindi. Chizmasida ko´rsatilgan rejani ochdi va tushuntirdi:

yuqoridagi rasmga qarang


bu yerda oltmish to´rtta shahar va ularni bog´laydigan yo´llar tasvirlangan. Bundan tashqari, safarning boshlang´ich nuqtasi qora katak bilan ko´rsatilgan ekanligini tushuntirdi.

Savdogar barcha shaharlarni 15 ta o´tishda tashrif buyurishi kerak edi.
Har bir shahar bir marta va faqat bir marta kirib chiqilishi va har bir o´tish to´g´ri chiziqda amalga oshirilishi kerak edi. Siz o´z yo´lingizni istalgan joyda tugatishingiz mumkin, lekin rasmning pastki qismida qisqa yo´lning yo´qligi tasodifiy emasligini unutmasligingiz kerak - bu erda hech qanday yo´l yo´q.

Rasmda berilgan qora katakdan boshlab, barcha shaharlarni o`tib chiqa olasizmi? Eng ko´p 15 marta burilish mumkin ekan?

Savol raqami: 40221

Javob topmasdan izohlarni ochmang. Javobini koʻrib qolsangiz qizzigʻi qolmaydi.

Iltimos: javobni topgan boʻlsangiz koʻrinmas hira (spoiler) qilib tashlang. Boshqalar ham urinib koʻrishsin!

https://t.me/DrAlgorithm/443
Forwarded from Donishmand Dasturchi
box.com dan ish uchun rad (reject) oldim.

Maqola: https://telegra.ph/Boxcom-dan-rad-javob-oldim-03-07
👍1
Forwarded from Khamidulla Inoyatov
Biz qanday esdan chiqaramiz yohud eng muxim ko’nikma.

TLDR: Bu maqolada Amsterdamdagi kitob do’koni, eslab qolishish ko’nikmasi va uning muximligi haqida so’z yuritiladi. Barchaga ham tavsiya qilmayman. Juda uzun va qiziqarsiz bo’lishi mumkin siz uchun.
Agar yo’q men baribir o’qiyman desangiz unda xavola orqali maqolani o’qing.

@khamidulla_inoyatov
👍2
Engineering Blog
https://research.google/blog/extra-extra-read-all-about-it-nearly-all-binary-searches-and-mergesorts-are-broken/
This is about bug in binary search implementation in java which is detected 9 years later
😁1
Engineering Blog pinned «Recently had an interview for Junior Java Engineer role at Vention Teams. Below you can find sample questions that i was asked during interview: https://telegra.ph/Vention--Interview--Junior-Java-Engineer-07-31»
Engineering Blog pinned «Hi, recently had a Project Interview at Epam Systems, below you can find the questions: https://telegra.ph/Java--Project-Interview--Epam-Systems-09-11»
Spent more then an hour to solve this problem and finally solved it 🎯:)

java  
/*
// Definition for a Node.
class Node {
public int val;
public List<Node> neighbors;
public Node() {
val = 0;
neighbors = new ArrayList<Node>();
}
public Node(int _val) {
val = _val;
neighbors = new ArrayList<Node>();
}
public Node(int _val, ArrayList<Node> _neighbors) {
val = _val;
neighbors = _neighbors;
}
}
*/

class Solution {
public Node cloneGraph(Node node) {

if (node == null) {
return node;
}

Set<Integer> visited = new HashSet<>();
Map<Integer, Node> clones = new HashMap<>();
Queue<Node> q = new LinkedList<>();
q.add(node);

while (!q.isEmpty()) {

Node currNode = q.poll();
int currVal = currNode.val;

if (!visited.contains(currVal)) {

Node nodeClone = clones.getOrDefault(currVal, new Node(currVal));
clones.put(currVal, nodeClone);

for (Node child : currNode.neighbors) {
if (child == null) continue;
Node childClone = clones.getOrDefault(child.val, new Node(child.val));
clones.put(child.val, childClone);
nodeClone.neighbors.add(childClone);
q.add(child);
}

visited.add(currVal);
}
}

return clones.isEmpty() ? node : clones.get(1);
}
}


#leetcode
Solved an interesting leetcode problem today after so many try:


class Solution {

Map<Character, Integer> freq = new HashMap<>();
Map<Character, Integer> count = new HashMap<>();

public int leastInterval(char[] tasks, int n) {

for (char task : tasks) {
freq.put(task, 0);
count.put(task, count.getOrDefault(task, 0) + 1);
}

PriorityQueue<Character> q = new PriorityQueue<>(new CustomOrder());
Set<Character> seen = new HashSet<>();

for (char task : tasks) {
if (seen.contains(task)) {
continue;
}
q.add(task);
seen.add(task);
}


int intervals = 0;
while (!q.isEmpty()) {

boolean hasTask = false;
Queue<Character> tmpQ = new LinkedList<>();
int size = q.size();
for (int i = 0; i < size; i++) {
char task = q.poll();

if (freq.get(task) == 0) {
intervals += 1;
count.put(task, count.get(task) - 1);
if (count.get(task) > 0) {
tmpQ.add(task);
}
decreaseFreq();
freq.put(task, n);
hasTask = true;
break;
}else {
tmpQ.add(task);
}
}

if (!hasTask) {
// cpu idle
decreaseFreq();
intervals += 1;
}
q.addAll(tmpQ);
}

return intervals;
}

private void decreaseFreq() {
for (Map.Entry<Character, Integer> entry : freq.entrySet()) {
char key = entry.getKey();
int occur = entry.getValue();

if (occur > 0) {
freq.put(key, occur - 1);
}
}
}

class CustomOrder implements Comparator<Character> {

@Override
public int compare(Character t1, Character t2) {
if (count.get(t1) > count.get(t2)) {
return -1;
}else if (count.get(t2) > count.get(t1)) {
return 1;
}else {
return 0;
}
}

}
}