بیک اینڈ ڈویلپرانٹرویو کے جوابات
عام انٹرویو سوالات
میں REST اصولوں کی پیروی کرتا/کرتی ہوں: resources اسم ہوتے ہیں (افعال نہیں)، URIs ترتیب وار ہوتے ہیں اور ریسورس کے تعلقات کو ظاہر کرتے ہیں، HTTP طریقے معنوی طور پر استعمال ہوتے ہیں (GET پڑھنا، POST بنانا، PUT/PATCH اپ ڈیٹ، DELETE ہٹانا). میں APIs کو شروع سے ورژن کرتا/کرتی ہوں (/v1/) تاکہ غیر-بریکنگ ارتقا ممکن ہو. میں مستقل ردعمل (response) فارمیٹس، ایرر کوڈز، اور پیجینیشن پیٹرنز ڈیزائن کرتا/کرتی ہوں. میں OpenAPI/Swagger کے ساتھ ڈاکیومنٹ کرتا/کرتی ہوں. میں ڈیزائن کے دوران کلائنٹ کی ضروریات کو ذہن میں رکھتا/رکھتی ہوں — ایک API جو تکنیکی طور پر درست ہو مگر استعمال میں مشکل ہو وہ برا API ہے. میں ریٹ لمٹنگ، آتھنٹیکیشن، اور ان پٹ ویلیڈیشن کو بھی اولین درجے کے API خدشات سمجھتا/سمجھتی ہوں.
میں اسکیمہ ڈیزائن کو رسائی کے پیٹرنز کی بنیاد پر بناتا/بناتی ہوں — عام طور پر نورملائز کرتا/کرتی ہوں، لیکن جب کوئری پرفارمنس مانگتی ہے تو ڈینورملائزیشن کرتا/کرتی ہوں. میں انڈیکسز حکمتِ عملی کے ساتھ استعمال کرتا/کرتی ہوں: ہر سست کوئری کا explain پلان نکالتا/نکالتی ہوں اور انڈیکسز کو سلیکٹیوٹی اور کوئری فریکوئنسی کی بنیاد پر شامل کرتا/کرتی ہوں. میں N+1 مسائل سے بچنے کے لیے ڈیٹا لیئر میں اِیگر لوڈنگ (eager loading) ڈیزائن کرتا/کرتی ہوں. میں مائگریشنز احتیاط سے لکھتا/لکھتی ہوں — جہاں ممکن ہو بیکورڈز-کمپیٹیبل چینجز اور بریکنگ اسکیمہ چینجز کے لیے بلو-گرین ڈپلائمنٹ حکمتِ عملی اپناتا/اپناتی ہوں. میں ڈیٹا انٹیگریٹی کے لیے بھی ڈیزائن کرتا/کرتی ہوں: foreign key constraints، not-null constraints، اور check constraints ڈیٹابیس لیول پر مستقل مزاجی نافذ کرتے ہیں.
میں ابتدا سے ہی سٹیٹ لیس سروسز ڈیزائن کرتا/کرتی ہوں — حالت (state) ڈیٹابیس یا کیش میں رہتی ہے، ایپلیکیشن میموری میں نہیں. میں async پروسیسنگ (message queues: RabbitMQ, Kafka, SQS) استعمال کرتا/کرتی ہوں ان آپریشنز کے لیے جو synchronous ہونے کی ضرورت نہیں رکھتے. میں مناسب لیئر پر aggressive caching کرتا/کرتی ہوں: ڈیٹابیس کوئری نتائج (Redis)، کمپیوٹڈ ایگری گیشنز، اور اسٹاٹک ریسورسز. میں APIs کو ہوریزونٹلی اسکیلیبل بنانے کے لیے ڈیزائن کرتا/کرتی ہوں اور منیجد سروسز (RDS, ElasticCache) کو ترجیح دیتا/دیتی ہوں جو آزادانہ طور پر اسکیل کر سکیں. میں ریٹ لمٹنگ اور بیک پریشر ہینڈلنگ کو بھی ڈیزائن میں شامل کرتا/کرتی ہوں — سروسز کو لوڈ میں آہستگی سے degrade ہونا چاہیے.
Authentication: OAuth 2.0 / OIDC صارف کی آتھنٹیکیشن کے لیے، سروس ٹو سروس کے لیے API keys یا JWT. میں تمام ان پٹ کو ویلیڈیٹ اور سینٹائز کرتا/کرتی ہوں — یوزر ان پٹ سے براہِ راست SQL تعمیر نہیں کرتا/کرتی. میں ریٹ لمٹنگ اور تھروٹلنگ نافذ کرتا/کرتی ہوں تاکہ بدسلوکی روکی جا سکے. میں ہر جگہ HTTPS/TLS استعمال کرتا/کرتی ہوں اور سرٹیفکیٹ ویلیڈیشن کو نافذ کرتا/کرتی ہوں. میں least-privilege کا اصول اپناتا/اپناتی ہوں: ہر سروس اور یوزر کے پاس کم از کم ضروری اجازتیں ہوتی ہیں. میں مراعات کے استعمال کا آڈٹ کرتا/کرتی ہوں. میں CI میں dependencies کی Vulnerability اسکیننگ کرتا/کرتی ہوں (OWASP Dependency-Check, Snyk). اور میں سیکیورٹی واقعات — ناکام آتھنٹیکیشنز، privilege escalations — مرکزی لاگنگ میں لکھتا/لکھتی ہوں تاکہ مانیٹرنگ ممکن ہو.
میں اس اصول کی پیروی کرتا/کرتی ہوں کہ Errors کو لوگ کیا جائے، درجہ بندی کیا جائے، اور معنی خیز طریقے سے واپس بھیجا جائے. میں structured logging (JSON) درست لاگ لیول کے ساتھ استعمال کرتا/کرتی ہوں تاکہ لاگز کو query کیا جا سکے. میں distributed tracing (OpenTelemetry) نافذ کرتا/کرتی ہوں تاکہ درخواستوں کو سروسز کے پار ٹریک کیا جا سکے. میں error codes کو APIs میں مستقل (consistent) طور پر تعریف کرتا/کرتی ہوں اور ان کی دستاویزات بناتا/بناتی ہوں. میں error rate anomalies پر alerting سیٹ کرتا/کرتی ہوں، نہ کہ صرف تکنیکی میٹرکس جیسے CPU. مائیکروسروس آرکیٹیکچرز میں، میں سرکٹ بریکرز (Resilience4j, Hystrix) نافذ کرتا/کرتی ہوں تاکہ کسی dependency کے degrade ہونے پر cascade failures روکی جا سکیں.
میں نے دونوں تعمیر کیے اور مینٹین کیے ہیں. مونو لِتھ کو کم قدر نہیں آنکھنا چاہیے: وہ ڈیولپ، ٹیسٹ اور ڈپلائے کرنے میں سادہ ہوتے ہیں، اور زیادہ تر ٹیموں کو مائیکروسروسز کی ضرورت تب تک نہیں ہوتی جب تک وہ مخصوص scaling یا team coordination constraints تک نہ پہنچ جائیں. جب میں نے مائیکروسروسز کی طرف منتقل کیا، میں نے Strangler Fig pattern اپنایا — ایک کام کرنے والے مونو لِتھ سے خدمات کو تدریجی طور پر نکالا جاتا ہے بجائے اس کے کہ big-bang decomposition کی جائے. مائیکروسروسز آپریشنل پیچیدگی (service discovery، distributed tracing، نیٹ ورک فیلئر موڈز، سروسز کے درمیان ڈیٹا مستقل مزاجی) نمایاں طور پر بڑھا دیتی ہیں — میں وہ پیچیدگیاں صرف اسی صورت قبول کرتا/کرتی ہوں جب فوائد واضح طور پر ان سے زیادہ ہوں.
میں business logic کے لیے یونٹ ٹیسٹ لکھتا/لکھتی ہوں جو الگ تھلگ ہوں (ڈیٹابیس اور بیرونی dependencies کو mock کر کے). میں integration tests لکھتا/لکھتی ہوں جو سروس کو ایک حقیقی (test) ڈیٹابیس کے خلاف verify کرتے ہیں — یہ پورے request-response سائیکل کی جانچ کرتے ہیں اور وہ SQL غلطیاں، کوئری پرفارمنس کے مسائل، اور ڈیٹا میپنگ کی غلطیاں پکڑ لیتے ہیں جو یونٹ ٹیسٹ چھوڑ دیتے ہیں. میں contract testing (Pact) استعمال کرتا/کرتی ہوں جہاں سروسز کے شائع شدہ APIs کو دوسرے ٹیمیں استعمال کرتی ہیں. میں load tests (k6, Locust) بھی لکھتا/لکھتی ہوں پرفارمنس-اہم endpoints کے لیے. ٹیسٹ کورویج صرف تب معنی رکھتی ہے جب وہ حقیقی فیلئرز کو پکڑے.
میں نے RabbitMQ اور Apache Kafka استعمال کرتے ہوئے event-driven سسٹمز ڈیزائن کیے ہیں. میں trade-offs سمجھتا/سمجھتی ہوں: at-least-once vs exactly-once delivery، consumer group پیٹرنز، dead letter queues، اور message ordering guarantees. میں message schemas کو احتیاط سے ڈیزائن کرتا/کرتی ہوں — پروڈکشن میں backwards-compatible schema evolution ضروری ہے. میں idempotent consumers نافذ کرتا/کرتی ہوں تاکہ duplicate messages ڈیٹا کو خراب نہ کریں. میں queue depth اور consumer lag کو اہم آپریشنل میٹرکس کے طور پر مانیٹر کرتا/کرتی ہوں. Event-driven آرکیٹیکچرز شاندار scalability اور decoupling فراہم کرتے ہیں، مگر اس کے لیے منظم schema مینجمنٹ اور failure handling کی ضرورت ہوتی ہے.
اپنا بنانے کے لیے تیار ہیں؟
اپنا سی وی اور ملازمت کی تفصیل اپلوڈ کریں اور 60 سیکنڈ میں اپنی مرضی کا ورژن حاصل کریں۔
اپنی مخصوص ملازمت کی درخواست کے لیے ذاتی نوعیت کے انٹرویو کے جوابات حاصل کریں
اپنا CV اور/یا جاب ڈسکرپشن اپلوڈ کریں