Sobes.tech

/* PostgreSQL-ის ორი სერვერი არსებობს: * PROD - OLTP სერვერი, * STATS - სერვერი გრძელვადიანი ანალიტიკური შეკვეთებისთვის. მიმდინარე სერვერზე, prod მონაცემთა ბაზაში, არსებობს დიდი (10Tb) ცხრილი შემდეგი სტრუქტურით: CREATE TABLE profiles( id SERIAL, data JSONB ) ცხრილში შეიძლება იყოს "ფუჭი ადგილები", ანუ ზოგი `id` შეიძლება გამოტოვებული იყოს. პროგრამის დაწერა საჭიროა, რომელიც კოპირებს ცხრილს profiles PROD-დან STATS-მდე. განსაზღვრილია, რომ გამოიყენება შემდეგი ინტერფეისები მონაცემთა ბაზებთან მუშაობისთვის: type Row []interface{} type Database interface { // ინტერფეისის რეალიზაცია შეუძლია კავშირების აღდგენა // SaveRows-ის გამოძახება არის იდემპოტენტური io.Closer GetMaxID(ctx context.Context) (uint64, error) LoadRows(ctx context.Context, minID, maxID uint64) ([]Row, error) // [minID, maxID] SaveRows(ctx context.Context, rows []Row) error } func Connect(ctx context.Context, dbname string) (Database, error) // CopyTable // თუ full=false, განაგრძეთ მონაცემების გადაცემა წინა შეცდომის ადგილიდან // თუ full=true, გადაიტანეთ ყველა მონაცემი func CopyTable(fromName string, toName string, full bool) error { // ... თქვენი კოდი } თუ გადაეცემა ვარიანტი `full=false`, პროგრამა უნდა განაგრძოს მონაცემების გადაცემა წინა შეცდომის ადგილიდან. თუ `full=true`, უნდა გადაიტანოს ყველა მონაცემი. **ძირითადი დონე**: - მონაცემების სერიული გადაცემა ერთ ნაკადში - შეცდომის შემდეგ აღდგენა (ვარიანტი `full=false`) დამატებითი ინფორმაცია: - თუ საჭიროია, შეგიძლიათ ინტერფეისი გააფართოვოთ თქვენი საკუთარი მეთოდებით - თუ საჭიროია, შეგიძლიათ პირდაპირ გამოიყენოთ **database/sql** პაკეტი

213

/* Տրված է նիշերի շղթա: գտնել i և j ցուցանիշների զույգերի քանակը (i <= j), որոնց միջև կրկնվող նիշեր չկան: "aba" շղթայի համար պատասխանն է 5: կարող է լինել ոչ միայն ASCII [0, 0] ("a") [0, 1] ("ab") [1, 1] ("b") [1, 2] ("ba") [2, 2] ("a") */

213

/* ჩვენს უნდა გადავცეთ მონაცემები გარკვეული წყაროდან გარკვეულ მომხმარებელს. ამ დროს წყარო მცირე პარტიებს აძლევს (~ ათეულობით ჩანაწერი), ხოლო მომხმარებელი ოპტიმალურად მუშაობს დიდ პარტიებთან (~ ათასობით ჩანაწერი). რეალური მაგალითი - მონაცემების მიწოდება Kafka ტიპის რიგებიდან Clickhouse ბაზაში. წყარო: - პირობითად უსასრულო. - წყარო არასდროს აბრუნებს MaxItems-ზე მეტ ჩანაწერს ერთ გამოძახებაზე Next. - ერთ "სესიაში" (ფუნქცია Pipe-ის ერთ გამოძახებაში) წყარო ყოველ ჯერზე ახალ მონაცემებს აბრუნებს. - თუმცა, გადატვირთვის შემდეგ წყარო დაიწყებს წინა "დადასტურებულ" პოზიციიდან, რომელიც cookie-სით არის განსაზღვრული. ამიტომ, თითოეული მნიშვნელობა cookie-ს, რომელიც Next-ის გამოძახებამ დააბრუნა, უნდა იყოს დადასტურებული Commit-ის გამოძახებით, და ეს უნდა მოხდეს ზუსტად იმავე სერიაში, სადაც Next-მა დააბრუნა. მიღება: - არ შეუძლია ერთდროულად MaxItems-ზე მეტი დამუშავება. ძირითადი დონე: ფუნქცია func Pipe(p Producer, c Consumer) error-ის განხორციელება, რომელიც წყაროდან მონაცემებს კითხულობს, მათ დიდ ბუფერში აგროვებს და შემდეგ იღებს მას მიმღებში, და პროგრესს წყაროსთან ერთად განახლებას. რთულობა: Next, Process და Commit მეთოდები დაკავშირებულია ქსელურ გამოძახებებთან და შეიძლება დიდხანს გაგრძელდეს. მოსწრაფვისთვის, მონაცემების წაკითხვა, ჩაწერა და პროგრესის დადასტურება პარალელურად უნდა მოხდეს. ასე რომ, Process ან Commit-ის გამოძახების დროს, წყაროსგან კითხვა და ახალი ბუფერის შექმნა გაგრძელდეს. */

213

გთხოვთ ახსნათ დამოკიდებულებების საწინააღმდეგო პრინციპი და რატომ ირღვევა SOLID-ის პრინციპი პირდაპირი ზარის მეშვეობით რეპოზიტორიის მეთოდებზე გამოყენების შემთხვევიდან.

212

არსებობს თუ არა რაიმე ვადა?

211

როგორ განახორციელეთ შესრულებული მოთხოვნების სისწორის ტესტირება და ვალიდაცია?

Junior — Middle
211

რა განსხვავებაა ადგილობრივ, განვითარების, სექციის, წარმოების გარემოებს შორის?

211

როგორ ამოწმებს JWT თავის ნამდვილობას? როგორ დადასტურება, რომ ტოკენი არ არის ფალსიფიცირებული?

210

გააზიარე მონაცემთა ბაზების შესახებ — რომელთან მუშაობდი და ახლა რომელთან მუშაობ?

210

/* მიკროწარმოს არქიტექტურით შექმნილი აპლიკაცია არსებობს. მიკროწარმოს შეიძლება იყოს აბსტრაქტული Backend ინტერფეისის საშუალებით. მიკროწარმოს ერთ ნიმუშზე წვდომისთვის, შეგიძლიათ გამოიყენოთ უკვე რეალიზებული BackendImpl ტიპი. ყოველი მიკროწარმოს აქვს რამდენიმე ათეული ამუშავებული ნიმუში, თითოეული მის მისამართზე, addr. თუმცა, მიკროწარმოს ინდივიდუალური ნიმუშები არ არის საიმედო: შესაძლოა ჩავარდნენ, მიუწვდომელი იყოს ან გადატვირთული იყოს. ამიტომ, თქვენ უნდა განახორციელოთ Balancer ტიპი, რომელიც ასევე რეალიზებს Backend ინტერფეისს და ახორციელებს კლიენტის მხრიდან დატვირთვის ბალანსს მიკროწარმოს ნიმუშებს შორის, ყოველ ჯერზე არჩევანს აკეთებს **მცირე დატვირთულ** ნიმუშზე. */ type Request interface{} type Response interface{} type Backend interface { Invoke(ctx context.Context, req Request) (Response, error) } var _ Backend = &BackendImpl{} // addr შეიცავს კონკრეტული ნიმუშის ip:port მისამართს func NewBackend(addr string) *BackendImpl type Balancer struct { // TODO } var _ Backend = &Balancer{} // addrs შეიცავს ყველა ბალანსირებულ ნიმუშის მისამართებს func NewBalancer(addrs []string) *Balancer { // TODO }

209

გქონდათ გუნდის მართვის გამოცდილება?

208

რა ემატება პასუხს, როდესაც ფანჯარა ვალიდურია?

207

რა შეზღუდვა აქვს სემაფოროს და ბუფერულ არხს პარალელური მოთხოვნების შეზღუდვის გადაწყვეტილებად?

206

/* მიკროწესის არქიტექტურით შექმნილი აპლიკაცია არსებობს. მიკროწესის ინტერფეისის საშუალებით შეიძლება მისი აბსტრაქცია. მიკროწესის ერთ ნიმუშზე წვდომისთვის, შეგიძლიათ გამოიყენოთ BackendImpl ტიპი, რომელიც უკვე განხორციელებულია. ყოველი მიკროწესის რამდენიმე ათეული ამუშავებული ნიმუში აქვს, თითოეული თავისი მისამართით addr ხელმისაწვდომია. თუმცა, მიკროწესის ინდივიდუალური ნიმუშები საიმედო არაა: შეგვიძლია ჩავარდეს, მიუწვდომელი იყოს ან გადატვირთული იყოს. ამიტომ, თქვენ უნდა განახორციელოთ Balancer ტიპი, რომელიც ასევე განახორციელებს Backend ინტერფეისს და ახორციელებს მიკროწესის ნიმუშებს შორის მომხმარებლის მხარის დატვირთვის ბალანსირებას, ყოველ ჯერზე არჩევს **მცირე დატვირთულ** ნიმუშს. */

206

რა არის მაქსიმალური რაოდენობა მოთხოვნათა წამში (RPS), რომელსაც ყველაზე დატვირთული სერვისი უმკლავდა?

204

სამუშაო ფორმატი: დისტანციურად, ოფისში ან ჰიბრიდულად?

203

როგორ შევადაროთ ელემენტები რუკაზე? როგორ დავრწმუნდეთ, რომ ორი რუკა ემთხვევა ერთმანეთს?

203

JWT ტოკენი რა არის? რა შემადგენლობაშია?

203

აღწერეთ ალგორითმი ყველა უნიკალური სიმბოლოსთან ერთად სუბსტრინგების რაოდენობისთვის

202

დაწერეთ დავალება Go ენის გამოყენებით — პრაქტიკული ნაწილი (დეველოპერის ცხოვრების პრობლემები, ალგორითმების გარეშე): სერვისის გაუმჯობესება ან გამოსწორება. ხანგრძლივობა — 1,5 საათი.

202
/11