[{"data":1,"prerenderedAt":1737},["ShallowReactive",2],{"navigation_docs":3,"-phong-van-english-interview-technical-en":420,"-phong-van-english-interview-technical-en-surround":1732},[4,153],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":26},"Phỏng vấn .NET","i-lucide-briefcase","\u002Fphong-van","1.phong-van",[10,27,66,111,128],{"title":11,"icon":12,"path":13,"stem":14,"children":15,"page":26},"Tổng quan","i-lucide-compass","\u002Fphong-van\u002Ftong-quan","1.phong-van\u002F1.tong-quan",[16,21],{"title":17,"path":18,"stem":19,"icon":20},"Thị trường HCM","\u002Fphong-van\u002Ftong-quan\u002Fthi-truong","1.phong-van\u002F1.tong-quan\u002F1.thi-truong","i-lucide-trending-up",{"title":22,"path":23,"stem":24,"icon":25},"Lộ trình 7 ngày","\u002Fphong-van\u002Ftong-quan\u002Flo-trinh","1.phong-van\u002F1.tong-quan\u002F2.lo-trinh","i-lucide-calendar-days",false,{"title":22,"icon":25,"path":28,"stem":29,"children":30,"page":26},"\u002Fphong-van\u002Flo-trinh","1.phong-van\u002F2.lo-trinh",[31,36,41,46,51,56,61],{"title":32,"path":33,"stem":34,"icon":35},"Ngày 1 — C# cơ bản","\u002Fphong-van\u002Flo-trinh\u002Fngay-1-csharp-co-ban","1.phong-van\u002F2.lo-trinh\u002F1.ngay-1-csharp-co-ban","i-lucide-1",{"title":37,"path":38,"stem":39,"icon":40},"Ngày 2 — OOP và SOLID","\u002Fphong-van\u002Flo-trinh\u002Fngay-2-oop-solid","1.phong-van\u002F2.lo-trinh\u002F2.ngay-2-oop-solid","i-lucide-2",{"title":42,"path":43,"stem":44,"icon":45},"Ngày 3 — C# nâng cao","\u002Fphong-van\u002Flo-trinh\u002Fngay-3-csharp-nang-cao","1.phong-van\u002F2.lo-trinh\u002F3.ngay-3-csharp-nang-cao","i-lucide-3",{"title":47,"path":48,"stem":49,"icon":50},"Ngày 4 — Database và SQL","\u002Fphong-van\u002Flo-trinh\u002Fngay-4-database-sql","1.phong-van\u002F2.lo-trinh\u002F4.ngay-4-database-sql","i-lucide-4",{"title":52,"path":53,"stem":54,"icon":55},"Ngày 5 — ASP.NET Core và EF Core","\u002Fphong-van\u002Flo-trinh\u002Fngay-5-aspnet-efcore","1.phong-van\u002F2.lo-trinh\u002F5.ngay-5-aspnet-efcore","i-lucide-5",{"title":57,"path":58,"stem":59,"icon":60},"Ngày 6 — DSA coding","\u002Fphong-van\u002Flo-trinh\u002Fngay-6-dsa","1.phong-van\u002F2.lo-trinh\u002F6.ngay-6-dsa","i-lucide-6",{"title":62,"path":63,"stem":64,"icon":65},"Ngày 7 — Mock và HR","\u002Fphong-van\u002Flo-trinh\u002Fngay-7-mock-interview","1.phong-van\u002F2.lo-trinh\u002F7.ngay-7-mock-interview","i-lucide-7",{"title":67,"icon":68,"path":69,"stem":70,"children":71,"page":26},"Ngân hàng câu hỏi","i-lucide-database","\u002Fphong-van\u002Fngan-hang-cau-hoi","1.phong-van\u002F3.ngan-hang-cau-hoi",[72,77,82,87,92,97,102,107],{"title":73,"path":74,"stem":75,"icon":76},"C# (60+ câu)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fcsharp","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F1.csharp","i-lucide-hash",{"title":78,"path":79,"stem":80,"icon":81},"OOP và SOLID (40+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Foop","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F2.oop","i-lucide-shapes",{"title":83,"path":84,"stem":85,"icon":86},"SQL (40+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fsql","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F3.sql","i-lucide-database-zap",{"title":88,"path":89,"stem":90,"icon":91},"ASP.NET và EF (50+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Faspnet-ef","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F4.aspnet-ef","i-lucide-server",{"title":93,"path":94,"stem":95,"icon":96},"DSA và Coding (30+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fdsa-coding","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F5.dsa-coding","i-lucide-binary",{"title":98,"path":99,"stem":100,"icon":101},"HR và Soft skill (25+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fhr-behavior","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F6.hr-behavior","i-lucide-users",{"title":103,"path":104,"stem":105,"icon":106},"Design Pattern (55+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fdesign-pattern","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F7.design-pattern","i-lucide-puzzle",{"title":108,"path":109,"stem":110,"icon":91},"ASP.NET MVC và Web API","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Faspnet-mvc-webapi","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F8.aspnet-mvc-webapi",{"title":112,"itle":113,"icon":114,"path":115,"stem":116,"children":117,"page":26},"Tai Lieu","Tài liệu và Cheat sheet","i-lucide-book-marked","\u002Fphong-van\u002Ftai-lieu","1.phong-van\u002F4.tai-lieu",[118,123],{"title":119,"path":120,"stem":121,"icon":122},"Cheat Sheet","\u002Fphong-van\u002Ftai-lieu\u002Fcheatsheet","1.phong-van\u002F4.tai-lieu\u002F1.cheatsheet","i-lucide-clipboard-list",{"title":124,"path":125,"stem":126,"icon":127},"Nguồn tham khảo","\u002Fphong-van\u002Ftai-lieu\u002Fnguon","1.phong-van\u002F4.tai-lieu\u002F2.nguon","i-lucide-link",{"title":129,"icon":130,"path":131,"stem":132,"children":133,"page":26},"Phỏng vấn English","i-lucide-globe","\u002Fphong-van\u002Fenglish-interview","1.phong-van\u002F5.english-interview",[134,138,143,148],{"title":135,"path":136,"stem":137,"icon":130},"Tổng quan English","\u002Fphong-van\u002Fenglish-interview\u002Ftong-quan","1.phong-van\u002F5.english-interview\u002F1.tong-quan",{"title":139,"path":140,"stem":141,"icon":142},"Vocabulary","\u002Fphong-van\u002Fenglish-interview\u002Fvocabulary","1.phong-van\u002F5.english-interview\u002F2.vocabulary","i-lucide-book-a",{"title":144,"path":145,"stem":146,"icon":147},"Technical Q và A (EN)","\u002Fphong-van\u002Fenglish-interview\u002Ftechnical-en","1.phong-van\u002F5.english-interview\u002F3.technical-en","i-lucide-code",{"title":149,"path":150,"stem":151,"icon":152},"Behavioral (EN)","\u002Fphong-van\u002Fenglish-interview\u002Fbehavioral-en","1.phong-van\u002F5.english-interview\u002F4.behavioral-en","i-lucide-message-square-text",{"title":154,"icon":155,"path":156,"stem":157,"children":158},"Tự học","i-lucide-graduation-cap","\u002Ftu-hoc","2.tu-hoc",[159,161,287,310,333,357,384],{"title":154,"path":156,"stem":160,"icon":155},"2.tu-hoc\u002Findex",{"title":162,"icon":68,"path":163,"stem":164,"children":165},"Database","\u002Ftu-hoc\u002Fdatabase","2.tu-hoc\u002F1.database\u002Findex",[166,167,197,222,243,248],{"title":162,"path":163,"stem":164,"icon":68},{"title":168,"icon":91,"path":169,"stem":170,"children":171,"page":26},"SQL Server","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server","2.tu-hoc\u002F1.database\u002F2.sql-server",[172,177,182,187,192],{"title":173,"path":174,"stem":175,"icon":176},"1. Giới thiệu và Cài đặt","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F1.gioi-thieu-cai-dat","i-lucide-play-circle",{"title":178,"path":179,"stem":180,"icon":181},"2. Cú pháp cơ bản","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F2.cu-phap-co-ban","i-lucide-code-2",{"title":183,"path":184,"stem":185,"icon":186},"3. Truy vấn nâng cao","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F3.truy-van-nang-cao","i-lucide-git-merge",{"title":188,"path":189,"stem":190,"icon":191},"4. Đặc thù và Performance","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F4.dac-thu-performance","i-lucide-gauge",{"title":193,"path":194,"stem":195,"icon":196},"5. Q và A phỏng vấn","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F5.cau-hoi-phong-van","i-lucide-message-circle-question",{"title":198,"icon":199,"path":200,"stem":201,"children":202,"page":26},"PostgreSQL","i-simple-icons-postgresql","\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql","2.tu-hoc\u002F1.database\u002F3.postgresql",[203,206,209,212,215,218],{"title":173,"path":204,"stem":205,"icon":176},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F1.gioi-thieu-cai-dat",{"title":178,"path":207,"stem":208,"icon":181},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F2.cu-phap-co-ban",{"title":183,"path":210,"stem":211,"icon":186},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F3.truy-van-nang-cao",{"title":188,"path":213,"stem":214,"icon":191},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F4.dac-thu-performance",{"title":193,"path":216,"stem":217,"icon":196},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F5.cau-hoi-phong-van",{"title":219,"path":220,"stem":221,"icon":96},"6. Tích hợp C# và Postgres","\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Ftich-hop-csharp","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F6.tich-hop-csharp",{"title":223,"icon":224,"path":225,"stem":226,"children":227,"page":26},"MySQL","i-simple-icons-mysql","\u002Ftu-hoc\u002Fdatabase\u002Fmysql","2.tu-hoc\u002F1.database\u002F4.mysql",[228,231,234,237,240],{"title":173,"path":229,"stem":230,"icon":176},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F4.mysql\u002F1.gioi-thieu-cai-dat",{"title":178,"path":232,"stem":233,"icon":181},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F4.mysql\u002F2.cu-phap-co-ban",{"title":183,"path":235,"stem":236,"icon":186},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F4.mysql\u002F3.truy-van-nang-cao",{"title":188,"path":238,"stem":239,"icon":191},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F4.mysql\u002F4.dac-thu-performance",{"title":193,"path":241,"stem":242,"icon":196},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F4.mysql\u002F5.cau-hoi-phong-van",{"title":244,"path":245,"stem":246,"icon":247},"So sánh 3 RDBMS","\u002Ftu-hoc\u002Fdatabase\u002Fso-sanh","2.tu-hoc\u002F1.database\u002F5.so-sanh","i-lucide-columns-3",{"title":249,"path":250,"stem":251,"children":252,"icon":254},"Supabase (BaaS)","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase","2.tu-hoc\u002F1.database\u002F6.supabase\u002Findex",[253,255,259,264,269,274,278,283],{"title":249,"path":250,"stem":251,"icon":254},"i-simple-icons-supabase",{"title":256,"path":257,"stem":258,"icon":68},"1. Database","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fdatabase","2.tu-hoc\u002F1.database\u002F6.supabase\u002F1.database",{"title":260,"path":261,"stem":262,"icon":263},"2. Authentication","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fauthentication","2.tu-hoc\u002F1.database\u002F6.supabase\u002F2.authentication","i-lucide-key",{"title":265,"path":266,"stem":267,"icon":268},"3. Storage & Realtime","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fstorage-realtime","2.tu-hoc\u002F1.database\u002F6.supabase\u002F3.storage-realtime","i-lucide-zap",{"title":270,"path":271,"stem":272,"icon":273},"4. Edge Functions & AI","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Ffunctions-ai","2.tu-hoc\u002F1.database\u002F6.supabase\u002F4.functions-ai","i-lucide-brain",{"title":275,"path":276,"stem":277,"icon":181},"5. API & SDKs","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fapi-sdk","2.tu-hoc\u002F1.database\u002F6.supabase\u002F5.api-sdk",{"title":279,"path":280,"stem":281,"icon":282},"6. Platform & Deploy","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fplatform-deploy","2.tu-hoc\u002F1.database\u002F6.supabase\u002F6.platform-deploy","i-lucide-cloud",{"title":284,"path":285,"stem":286,"icon":196},"7. Interview & Q&A","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Finterview","2.tu-hoc\u002F1.database\u002F6.supabase\u002F7.interview",{"title":288,"icon":289,"path":290,"stem":291,"children":292},"TypeScript","i-simple-icons-typescript","\u002Ftu-hoc\u002Ftypescript","2.tu-hoc\u002F2.typescript\u002Findex",[293,294,297,301,306],{"title":288,"path":290,"stem":291,"icon":289},{"title":173,"path":295,"stem":296,"icon":176},"\u002Ftu-hoc\u002Ftypescript\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F2.typescript\u002F1.gioi-thieu-cai-dat",{"title":298,"path":299,"stem":300,"icon":81},"2. Type System","\u002Ftu-hoc\u002Ftypescript\u002Ftype-system","2.tu-hoc\u002F2.typescript\u002F2.type-system",{"title":302,"path":303,"stem":304,"icon":305},"3. Advanced types","\u002Ftu-hoc\u002Ftypescript\u002Fadvanced-types","2.tu-hoc\u002F2.typescript\u002F3.advanced-types","i-lucide-braces",{"title":307,"path":308,"stem":309,"icon":196},"4. Q và A phỏng vấn","\u002Ftu-hoc\u002Ftypescript\u002Fcau-hoi-phong-van","2.tu-hoc\u002F2.typescript\u002F4.cau-hoi-phong-van",{"title":311,"icon":81,"path":312,"stem":313,"children":314},"OOP","\u002Ftu-hoc\u002Foop","2.tu-hoc\u002F3.oop\u002Findex",[315,316,321,326,330],{"title":311,"path":312,"stem":313,"icon":81},{"title":317,"path":318,"stem":319,"icon":320},"1. Bốn tính chất","\u002Ftu-hoc\u002Foop\u002F4-tinh-chat","2.tu-hoc\u002F3.oop\u002F1.4-tinh-chat","i-lucide-circle-dot",{"title":322,"path":323,"stem":324,"icon":325},"2. SOLID","\u002Ftu-hoc\u002Foop\u002Fsolid","2.tu-hoc\u002F3.oop\u002F2.solid","i-lucide-shield",{"title":327,"path":328,"stem":329,"icon":106},"3. Design Pattern","\u002Ftu-hoc\u002Foop\u002Fdesign-pattern","2.tu-hoc\u002F3.oop\u002F3.design-pattern",{"title":307,"path":331,"stem":332,"icon":196},"\u002Ftu-hoc\u002Foop\u002Fcau-hoi-phong-van","2.tu-hoc\u002F3.oop\u002F4.cau-hoi-phong-van",{"title":334,"icon":305,"path":335,"stem":336,"children":337},"Generic","\u002Ftu-hoc\u002Fgeneric","2.tu-hoc\u002F4.generic\u002Findex",[338,339,344,349,354],{"title":334,"path":335,"stem":336,"icon":305},{"title":340,"path":341,"stem":342,"icon":343},"1. Khái niệm và cú pháp","\u002Ftu-hoc\u002Fgeneric\u002Fkhai-niem","2.tu-hoc\u002F4.generic\u002F1.khai-niem","i-lucide-book",{"title":345,"path":346,"stem":347,"icon":348},"2. Constraint và Variance","\u002Ftu-hoc\u002Fgeneric\u002Fconstraint-variance","2.tu-hoc\u002F4.generic\u002F2.constraint-variance","i-lucide-filter",{"title":350,"path":351,"stem":352,"icon":353},"3. C# vs TS","\u002Ftu-hoc\u002Fgeneric\u002Fso-sanh","2.tu-hoc\u002F4.generic\u002F3.so-sanh","i-lucide-git-compare",{"title":307,"path":355,"stem":356,"icon":196},"\u002Ftu-hoc\u002Fgeneric\u002Fcau-hoi-phong-van","2.tu-hoc\u002F4.generic\u002F4.cau-hoi-phong-van",{"title":358,"icon":359,"path":360,"stem":361,"children":362},"Nuxt 4","i-simple-icons-nuxt","\u002Ftu-hoc\u002Fnuxt-4","2.tu-hoc\u002F5.nuxt-4\u002Findex",[363,364,367,372,376,379],{"title":358,"path":360,"stem":361,"icon":359},{"title":173,"path":365,"stem":366,"icon":176},"\u002Ftu-hoc\u002Fnuxt-4\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F5.nuxt-4\u002F1.gioi-thieu-cai-dat",{"title":368,"path":369,"stem":370,"icon":371},"2. Routing và Rendering","\u002Ftu-hoc\u002Fnuxt-4\u002Frouting-rendering","2.tu-hoc\u002F5.nuxt-4\u002F2.routing-rendering","i-lucide-route",{"title":373,"path":374,"stem":375,"icon":91},"3. Data và Server","\u002Ftu-hoc\u002Fnuxt-4\u002Fdata-server","2.tu-hoc\u002F5.nuxt-4\u002F3.data-server",{"title":307,"path":377,"stem":378,"icon":196},"\u002Ftu-hoc\u002Fnuxt-4\u002Fcau-hoi-phong-van","2.tu-hoc\u002F5.nuxt-4\u002F4.cau-hoi-phong-van",{"title":380,"path":381,"stem":382,"icon":383},"5. Practical Todo App","\u002Ftu-hoc\u002Fnuxt-4\u002Fpractical-todo-app","2.tu-hoc\u002F5.nuxt-4\u002F5.practical-todo-app","i-lucide-check-square",{"title":385,"path":386,"stem":387,"children":388,"icon":390},"Tailwind CSS","\u002Ftu-hoc\u002Ftailwindcss","2.tu-hoc\u002F6.tailwindcss\u002Findex",[389,391,396,401,406,411,416],{"title":385,"path":386,"stem":387,"icon":390},"i-simple-icons-tailwindcss",{"title":392,"path":393,"stem":394,"icon":395},"1. Layout & Spacing","\u002Ftu-hoc\u002Ftailwindcss\u002Flayout-spacing","2.tu-hoc\u002F6.tailwindcss\u002F1.layout-spacing","i-lucide-layout",{"title":397,"path":398,"stem":399,"icon":400},"2. Typography & Colors","\u002Ftu-hoc\u002Ftailwindcss\u002Ftypography-colors","2.tu-hoc\u002F6.tailwindcss\u002F2.typography-colors","i-lucide-type",{"title":402,"path":403,"stem":404,"icon":405},"3. Interactive & Effects","\u002Ftu-hoc\u002Ftailwindcss\u002Finteractive-effects","2.tu-hoc\u002F6.tailwindcss\u002F3.interactive-effects","i-lucide-sparkles",{"title":407,"path":408,"stem":409,"icon":410},"4. Responsive & Dark Mode","\u002Ftu-hoc\u002Ftailwindcss\u002Fresponsive-darkmode","2.tu-hoc\u002F6.tailwindcss\u002F4.responsive-darkmode","i-lucide-monitor-smartphone",{"title":412,"path":413,"stem":414,"icon":415},"5. Customization & Theme","\u002Ftu-hoc\u002Ftailwindcss\u002Fcustomization","2.tu-hoc\u002F6.tailwindcss\u002F5.customization","i-lucide-settings-2",{"title":417,"path":418,"stem":419,"icon":181},"6. Practical Projects","\u002Ftu-hoc\u002Ftailwindcss\u002Fpractical-projects","2.tu-hoc\u002F6.tailwindcss\u002F6.practical-projects",{"id":421,"title":422,"body":423,"description":1725,"extension":1726,"links":1727,"meta":1728,"navigation":1729,"path":145,"seo":1730,"stem":146,"__hash__":1731},"docs\u002F1.phong-van\u002F5.english-interview\u002F3.technical-en.md","Technical Q và A — Sample answers in English",{"type":424,"value":425,"toc":1668},"minimark",[426,444,449,454,460,489,499,511,514,518,522,541,543,547,551,566,568,580,584,600,602,613,617,633,635,639,643,647,717,719,723,727,752,754,758,763,798,800,804,808,820,822,826,830,848,850,854,862,866,892,894,905,909,929,931,941,945,971,973,977,981,985,1005,1007,1011,1015,1027,1029,1033,1037,1048,1050,1054,1058,1087,1089,1093,1097,1101,1109,1111,1115,1119,1152,1154,1158,1162,1178,1180,1187,1191,1208,1210,1214,1218,1230,1232,1236,1243,1247,1264,1266,1270,1274,1294,1296,1303,1307,1316,1318,1322,1326,1331,1343,1408,1416,1418,1422,1427,1432,1475,1483,1485,1489,1493,1502,1562,1564,1568,1572,1576,1584,1586,1590,1594,1602,1604,1608,1613,1654,1656,1664],[427,428,431,435,436,439,440,443],"callout",{"color":429,"icon":430},"primary","i-lucide-mic",[432,433,434],"strong",{},"Cách dùng:"," đọc to câu hỏi → bấm giờ 60 giây → tự trả lời thành tiếng → sau đó đọc sample. Không học thuộc — chỉ học ",[432,437,438],{},"structure"," và ",[432,441,442],{},"keyword",".",[445,446,448],"h2",{"id":447},"a-c-fundamentals","A. C# Fundamentals",[450,451,453],"h3",{"id":452},"_1-whats-the-difference-between-value-types-and-reference-types","1. What's the difference between value types and reference types?",[455,456,457],"p",{},[432,458,459],{},"Sample answer:",[461,462,463,486],"blockquote",{},[455,464,465,466,470,471,474,475,478,479,470,482,485],{},"Value types like ",[467,468,469],"code",{},"int",", ",[467,472,473],{},"bool",", or any ",[467,476,477],{},"struct"," are stored directly on the stack and hold their actual value. Reference types like ",[467,480,481],{},"class",[467,483,484],{},"string",", or arrays live on the heap, and the variable just holds a pointer to them.",[455,487,488],{},"When you assign one variable to another, value types copy the actual value, but reference types copy the reference — so two variables point to the same object. A good example is that modifying an array through one variable will affect the other.",[455,490,491,494,495],{},[432,492,493],{},"Keyword:"," ",[496,497,498],"em",{},"stack, heap, pointer, copy by value vs by reference.",[455,500,501,494,504,510],{},[432,502,503],{},"Follow-up:",[496,505,506,507,509],{},"\"Is ",[467,508,484],{}," a value or reference type?\""," → reference but immutable, behaves like value.",[512,513],"hr",{},[450,515,517],{"id":516},"_2-explain-boxing-and-unboxing","2. Explain boxing and unboxing.",[455,519,520],{},[432,521,459],{},[461,523,524,531],{},[455,525,526,527,530],{},"Boxing is when a value type gets wrapped into an ",[467,528,529],{},"object"," reference, which allocates on the heap. Unboxing is the reverse — you explicitly cast the object back to the value type.",[455,532,533,534,537,538,443],{},"The performance cost is real, especially in tight loops, so I avoid it by using generic collections like ",[467,535,536],{},"List\u003Cint>"," instead of the old ",[467,539,540],{},"ArrayList",[512,542],{},[450,544,546],{"id":545},"_3-what-does-immutable-mean-why-does-it-matter-for-strings","3. What does \"immutable\" mean? Why does it matter for strings?",[455,548,549],{},[432,550,459],{},[461,552,553,559],{},[455,554,555,556,558],{},"Immutable means an object's state can't change after it's created. With ",[467,557,484],{},", every operation like concatenation actually creates a new string. So if you concatenate inside a loop 10,000 times, you'll create 10,000 string objects and put pressure on the garbage collector.",[455,560,561,562,565],{},"That's why we use ",[467,563,564],{},"StringBuilder"," for repeated modifications — it uses a mutable internal buffer and appends in amortized constant time.",[512,567],{},[450,569,571,572,575,576,579],{"id":570},"_4-what-is-the-difference-between-const-and-readonly","4. What is the difference between ",[467,573,574],{},"const"," and ",[467,577,578],{},"readonly","?",[455,581,582],{},[432,583,459],{},[461,585,586,591],{},[455,587,588,590],{},[467,589,574],{}," is a compile-time constant — its value gets embedded into the calling code, so if you change it you have to rebuild every consumer. It also only works for primitives.",[455,592,593,595,596,599],{},[467,594,578],{}," is set at runtime, usually in the constructor, and each instance can have its own value. ",[467,597,598],{},"static readonly"," lives at the class level and gets set once when the class is loaded.",[512,601],{},[450,603,605,606,609,610,579],{"id":604},"_5-what-happens-when-you-write-throw-ex-versus-just-throw","5. What happens when you write ",[467,607,608],{},"throw ex"," versus just ",[467,611,612],{},"throw",[455,614,615],{},[432,616,459],{},[461,618,619],{},[455,620,621,623,624,626,627,629,630,443],{},[467,622,612],{}," rethrows the exception while preserving the original stack trace, so you can still trace where the error happened. ",[467,625,608],{}," resets the stack trace to the current line, which loses crucial debugging information. So in practice, I always use bare ",[467,628,612],{}," unless I'm explicitly wrapping the exception with ",[467,631,632],{},"throw new SomethingElse(\"...\", ex)",[512,634],{},[445,636,638],{"id":637},"b-oop-solid","B. OOP & SOLID",[450,640,642],{"id":641},"_6-can-you-walk-me-through-the-four-pillars-of-oop-with-an-example","6. Can you walk me through the four pillars of OOP with an example?",[455,644,645],{},[432,646,459],{},[461,648,649,652,666,684,697],{},[455,650,651],{},"Sure. The four pillars are encapsulation, abstraction, inheritance, and polymorphism.",[455,653,654,657,658,661,662,665],{},[432,655,656],{},"Encapsulation"," is about hiding internal state behind a public interface — for example, a ",[467,659,660],{},"BankAccount"," class exposes a ",[467,663,664],{},"Deposit"," method instead of letting outside code modify the balance directly.",[455,667,668,671,672,675,676,679,680,683],{},[432,669,670],{},"Abstraction"," focuses on ",[496,673,674],{},"what"," something does rather than ",[496,677,678],{},"how"," — like an ",[467,681,682],{},"IRepository"," interface that doesn't reveal whether the data comes from SQL or a file.",[455,685,686,689,690,693,694,443],{},[432,687,688],{},"Inheritance"," lets a derived class reuse code from a base class — like ",[467,691,692],{},"Dog"," extending ",[467,695,696],{},"Animal",[455,698,699,702,703,706,707,575,709,712,713,716],{},[432,700,701],{},"Polymorphism"," lets you treat different concrete types through a common base — so I can have ",[467,704,705],{},"Animal[] zoo"," containing ",[467,708,692],{},[467,710,711],{},"Cat",", and calling ",[467,714,715],{},"Speak()"," invokes the right override at runtime.",[512,718],{},[450,720,722],{"id":721},"_7-interface-versus-abstract-class-when-do-you-choose-which","7. Interface versus abstract class — when do you choose which?",[455,724,725],{},[432,726,459],{},[461,728,729,742,749],{},[455,730,731,732,734,735,738,739,443],{},"An interface defines a contract — ",[496,733,674],{}," a type can do — without state or implementation. A class can implement multiple interfaces, so I use them to describe capabilities like ",[467,736,737],{},"IDisposable"," or ",[467,740,741],{},"IComparable",[455,743,744,745,748],{},"An abstract class is more like a partial implementation. It can hold state, have constructors, and provide concrete methods. I use it when several classes truly share both behavior and identity — for example, a base ",[467,746,747],{},"Repository\u003CT>"," with common query helpers.",[455,750,751],{},"In modern .NET I tend to default to interfaces because they're easier to mock for unit testing.",[512,753],{},[450,755,757],{"id":756},"_8-explain-the-solid-principles","8. Explain the SOLID principles.",[455,759,760],{},[432,761,762],{},"Sample answer (compressed):",[461,764,765,768,774,780,786,792],{},[455,766,767],{},"SOLID is an acronym for five OOP design principles.",[455,769,770,773],{},[432,771,772],{},"S"," is Single Responsibility — a class should have only one reason to change.",[455,775,776,779],{},[432,777,778],{},"O"," is Open\u002FClosed — open for extension, closed for modification. You should be able to add new behavior without editing existing code.",[455,781,782,785],{},[432,783,784],{},"L"," is Liskov Substitution — subclasses should be usable in place of their base class without breaking the program.",[455,787,788,791],{},[432,789,790],{},"I"," is Interface Segregation — many small, specific interfaces are better than one fat one, so clients don't depend on methods they don't use.",[455,793,794,797],{},[432,795,796],{},"D"," is Dependency Inversion — high-level modules shouldn't depend on low-level modules; both should depend on abstractions. In ASP.NET Core, this is implemented through built-in dependency injection.",[512,799],{},[450,801,803],{"id":802},"_9-what-is-dependency-injection-and-why-do-we-use-it","9. What is Dependency Injection and why do we use it?",[455,805,806],{},[432,807,459],{},[461,809,810,813],{},[455,811,812],{},"Dependency Injection is a technique where a class receives its dependencies from outside instead of creating them itself. Typically through constructor injection.",[455,814,815,816,819],{},"The main benefits are testability — I can pass in mocks during unit tests — and flexibility, because I can swap implementations without changing the consumer. ASP.NET Core has a built-in DI container, so I register services in ",[467,817,818],{},"Program.cs"," and the framework wires them automatically.",[512,821],{},[450,823,825],{"id":824},"_10-whats-the-difference-between-singleton-scoped-and-transient-lifetimes","10. What's the difference between Singleton, Scoped, and Transient lifetimes?",[455,827,828],{},[432,829,459],{},[461,831,832,835,842,845],{},[455,833,834],{},"Singleton creates one instance for the entire application lifetime — good for stateless services, caches, or loggers.",[455,836,837,838,841],{},"Scoped creates one instance per HTTP request — that's the right lifetime for ",[467,839,840],{},"DbContext"," because we want all operations within a single request to share the same unit of work.",[455,843,844],{},"Transient creates a new instance every time it's injected. I use it for lightweight, stateless helpers.",[455,846,847],{},"A common pitfall is injecting a scoped service into a singleton, which causes a captive dependency.",[512,849],{},[445,851,853],{"id":852},"c-async-performance","C. Async & Performance",[450,855,857,858,861],{"id":856},"_11-how-does-asyncawait-actually-work","11. How does ",[467,859,860],{},"async\u002Fawait"," actually work?",[455,863,864],{},[432,865,459],{},[461,867,868,882],{},[455,869,870,871,873,874,877,878,881],{},"A lot of people think ",[467,872,860],{}," creates a new thread, but it doesn't. When the runtime hits an ",[467,875,876],{},"await",", the method returns a ",[467,879,880],{},"Task"," and releases the current thread back to the pool. Once the awaited operation completes — typically I\u002FO like an HTTP call or a database query — the continuation gets scheduled to run, possibly on a different thread.",[455,883,884,885,887,888,891],{},"So ",[467,886,860],{}," is really about freeing threads during I\u002FO, not parallelism. For CPU-bound work, you'd use ",[467,889,890],{},"Task.Run"," to offload to the thread pool.",[512,893],{},[450,895,897,898,738,901,904],{"id":896},"_12-why-should-you-avoid-result-or-wait-on-a-task","12. Why should you avoid ",[467,899,900],{},".Result",[467,902,903],{},".Wait()"," on a Task?",[455,906,907],{},[432,908,459],{},[461,910,911,919],{},[455,912,913,914,738,916,918],{},"Calling ",[467,915,900],{},[467,917,903],{}," blocks the calling thread until the task completes. In environments with a synchronization context, like classic ASP.NET or WPF, this can cause a deadlock because the continuation tries to resume on the original thread, which is blocked.",[455,920,921,922,925,926,928],{},"In ASP.NET Core there's no ",[467,923,924],{},"SynchronizationContext",", so it's less catastrophic, but it still wastes a thread. The right approach is ",[467,927,876],{}," all the way up.",[512,930],{},[450,932,934,935,575,938,579],{"id":933},"_13-whats-the-difference-between-ienumerable-and-iqueryable","13. What's the difference between ",[467,936,937],{},"IEnumerable",[467,939,940],{},"IQueryable",[455,942,943],{},[432,944,459],{},[461,946,947,952,964],{},[455,948,949,951],{},[467,950,937],{}," represents an in-memory collection — when you apply LINQ operations, they execute on the client side.",[455,953,954,956,957,959,960,963],{},[467,955,940],{}," builds an expression tree that gets translated into the underlying query language, like SQL for EF Core. So if I filter an ",[467,958,940],{}," with ",[467,961,962],{},".Where",", that filter gets pushed down to the database.",[455,965,966,967,970],{},"The mistake is calling ",[467,968,969],{},".ToList()"," too early, which materializes everything into memory and turns subsequent operations into client-side work.",[512,972],{},[445,974,976],{"id":975},"d-database-sql","D. Database & SQL",[450,978,980],{"id":979},"_14-explain-inner-join-left-join-and-when-youd-use-each","14. Explain INNER JOIN, LEFT JOIN, and when you'd use each.",[455,982,983],{},[432,984,459],{},[461,986,987,994],{},[455,988,989,990,993],{},"An ",[467,991,992],{},"INNER JOIN"," returns only rows that match in both tables, so it's good when you only care about records that have a relationship — for example, all orders along with the customer who placed them, assuming every order has a customer.",[455,995,996,997,1000,1001,1004],{},"A ",[467,998,999],{},"LEFT JOIN"," returns all rows from the left table plus matching rows from the right, with ",[467,1002,1003],{},"NULL"," where there's no match. I use this when I want to keep all records from one side, like all customers including those who haven't placed any orders yet.",[512,1006],{},[450,1008,1010],{"id":1009},"_15-what-is-an-index-and-when-would-you-avoid-creating-one","15. What is an index and when would you avoid creating one?",[455,1012,1013],{},[432,1014,459],{},[461,1016,1017,1020],{},[455,1018,1019],{},"An index is an auxiliary data structure, usually a B-tree, that the database uses to find rows quickly without scanning the whole table. The trade-off is that indexes take space and slow down inserts and updates because the index also needs to be maintained.",[455,1021,1022,1023,1026],{},"So I'd avoid indexing columns that change very frequently, columns with low selectivity like a ",[467,1024,1025],{},"Gender"," field with two values, and small tables where a full scan is already fast.",[512,1028],{},[450,1030,1032],{"id":1031},"_16-what-is-database-normalization","16. What is database normalization?",[455,1034,1035],{},[432,1036,459],{},[461,1038,1039,1042,1045],{},[455,1040,1041],{},"Normalization is the process of organizing tables to reduce redundancy and prevent anomalies during insert, update, or delete.",[455,1043,1044],{},"First normal form requires atomic values — no arrays or repeating groups in one column. Second normal form removes partial dependencies on a composite key. Third normal form removes transitive dependencies, where a non-key column depends on another non-key column.",[455,1046,1047],{},"In practice, I aim for third normal form by default, but for reporting workloads I might denormalize to avoid expensive joins.",[512,1049],{},[450,1051,1053],{"id":1052},"_17-what-does-acid-stand-for","17. What does ACID stand for?",[455,1055,1056],{},[432,1057,459],{},[461,1059,1060,1063,1069,1075,1081],{},[455,1061,1062],{},"ACID describes the guarantees of a transactional database.",[455,1064,1065,1068],{},[432,1066,1067],{},"Atomicity"," — all operations in a transaction succeed together or roll back together.",[455,1070,1071,1074],{},[432,1072,1073],{},"Consistency"," — the database moves from one valid state to another, respecting all constraints.",[455,1076,1077,1080],{},[432,1078,1079],{},"Isolation"," — concurrent transactions don't interfere with each other's intermediate state.",[455,1082,1083,1086],{},[432,1084,1085],{},"Durability"," — once committed, the data persists even if the system crashes.",[512,1088],{},[445,1090,1092],{"id":1091},"e-aspnet-core-web-api","E. ASP.NET Core & Web API",[450,1094,1096],{"id":1095},"_18-walk-me-through-what-happens-in-the-aspnet-core-request-pipeline","18. Walk me through what happens in the ASP.NET Core request pipeline.",[455,1098,1099],{},[432,1100,459],{},[461,1102,1103,1106],{},[455,1104,1105],{},"When a request comes in, Kestrel — the built-in web server — passes it through a chain of middleware components. Each middleware can inspect the request, do some work, and either call the next middleware or short-circuit the pipeline.",[455,1107,1108],{},"The typical order is exception handling, HTTPS redirection, static files, routing, CORS, authentication, authorization, and finally endpoint execution — which is where my controller method runs. The order matters; for example, authentication must come before authorization.",[512,1110],{},[450,1112,1114],{"id":1113},"_19-which-http-methods-are-idempotent","19. Which HTTP methods are idempotent?",[455,1116,1117],{},[432,1118,459],{},[461,1120,1121],{},[455,1122,1123,1124,470,1127,470,1130,470,1133,1136,1137,1140,1141,1144,1145,1148,1149,1151],{},"Idempotent means calling the method multiple times has the same effect as calling it once. ",[467,1125,1126],{},"GET",[467,1128,1129],{},"PUT",[467,1131,1132],{},"DELETE",[467,1134,1135],{},"HEAD",", and ",[467,1138,1139],{},"OPTIONS"," are idempotent by definition. ",[467,1142,1143],{},"POST"," is not, because each call typically creates a new resource. ",[467,1146,1147],{},"PATCH"," isn't strictly idempotent by spec, but it's good practice to design ",[467,1150,1147],{}," endpoints to be idempotent when possible.",[512,1153],{},[450,1155,1157],{"id":1156},"_20-whats-the-difference-between-authentication-and-authorization","20. What's the difference between authentication and authorization?",[455,1159,1160],{},[432,1161,459],{},[461,1163,1164,1167],{},[455,1165,1166],{},"Authentication answers \"who are you\" — it verifies the identity of the user, usually through credentials or a token. Authorization answers \"what are you allowed to do\" — it checks whether the authenticated user has permission for the requested action, often based on roles or claims.",[455,1168,1169,1170,1173,1174,1177],{},"In ASP.NET Core, ",[467,1171,1172],{},"UseAuthentication"," must be registered before ",[467,1175,1176],{},"UseAuthorization"," because authorization checks the identity that authentication populated.",[512,1179],{},[450,1181,1183,1184,1186],{"id":1182},"_21-what-status-code-would-you-return-when-a-post-succeeds","21. What status code would you return when a ",[467,1185,1143],{}," succeeds?",[455,1188,1189],{},[432,1190,459],{},[461,1192,1193],{},[455,1194,1195,1196,1199,1200,1203,1204,1207],{},"The standard is ",[467,1197,1198],{},"201 Created",", with a ",[467,1201,1202],{},"Location"," header pointing to the new resource's URI, and the response body containing the created resource. In ASP.NET Core I usually use ",[467,1205,1206],{},"CreatedAtAction(nameof(Get), new { id = ... }, dto)"," which sets all of that automatically.",[512,1209],{},[450,1211,1213],{"id":1212},"_22-how-does-jwt-based-authentication-work","22. How does JWT-based authentication work?",[455,1215,1216],{},[432,1217,459],{},[461,1219,1220,1223],{},[455,1221,1222],{},"A JWT is a token that contains three parts — header, payload, and signature — encoded in base64URL and separated by dots. The payload holds claims like the user ID, roles, and expiration time. The signature is a hash that proves the token wasn't tampered with.",[455,1224,1225,1226,1229],{},"The flow is: the client logs in with credentials, the server issues a JWT, and the client sends it in the ",[467,1227,1228],{},"Authorization"," header on every subsequent request. The server verifies the signature and trusts the claims. It's stateless, so no session storage on the server side.",[512,1231],{},[445,1233,1235],{"id":1234},"f-entity-framework-core","F. Entity Framework Core",[450,1237,1239,1240,1242],{"id":1238},"_23-what-is-the-dbcontext-and-why-is-it-registered-as-scoped","23. What is the ",[467,1241,840],{}," and why is it registered as Scoped?",[455,1244,1245],{},[432,1246,459],{},[461,1248,1249,1258],{},[455,1250,1251,1252,1254,1255,443],{},"The ",[467,1253,840],{}," is essentially a unit of work for a single business operation. It tracks entity changes and translates them to SQL when I call ",[467,1256,1257],{},"SaveChanges",[455,1259,1260,1261,1263],{},"I register it as Scoped because we want one ",[467,1262,840],{}," per HTTP request, so all operations within that request share the same change tracker and can be committed together. It's also not thread-safe, so reusing it across requests would cause race conditions.",[512,1265],{},[450,1267,1269],{"id":1268},"_24-what-is-the-n1-query-problem","24. What is the N+1 query problem?",[455,1271,1272],{},[432,1273,459],{},[461,1275,1276,1279],{},[455,1277,1278],{},"N+1 happens when you load a list of N parent entities with one query, then access a navigation property in a loop, which triggers N additional queries — one for each parent.",[455,1280,1281,1282,1285,1286,1289,1290,1293],{},"For example, loading 100 users and then accessing ",[467,1283,1284],{},"user.Orders"," for each one results in 101 queries. The fix is eager loading with ",[467,1287,1288],{},".Include",", or better, projecting directly to a DTO with ",[467,1291,1292],{},".Select"," so EF generates a single optimized query.",[512,1295],{},[450,1297,1299,1300,579],{"id":1298},"_25-when-would-you-use-asnotracking","25. When would you use ",[467,1301,1302],{},".AsNoTracking()",[455,1304,1305],{},[432,1306,459],{},[461,1308,1309],{},[455,1310,1311,1312,1315],{},"I use ",[467,1313,1314],{},"AsNoTracking"," for read-only queries that don't need to update the database. By default, EF Core tracks every entity it materializes, which costs memory and CPU. Disabling tracking can give a 20–30% speed boost for queries that just return data to the UI.",[512,1317],{},[445,1319,1321],{"id":1320},"g-coding-scenario","G. Coding scenario",[450,1323,1325],{"id":1324},"_26-given-an-array-of-integers-return-indices-of-two-numbers-that-add-up-to-a-target","26. Given an array of integers, return indices of two numbers that add up to a target.",[455,1327,1328],{},[432,1329,1330],{},"Sample answer (talking through it):",[461,1332,1333,1340],{},[455,1334,1335,1336,1339],{},"Okay, the brute-force approach is two nested loops, but that's O(n²). A better solution uses a hash map. I iterate through the array, and for each element I check if ",[467,1337,1338],{},"target - current"," is already in the map. If it is, I have my pair. If not, I store the current value and index in the map.",[455,1341,1342],{},"That gives me O(n) time and O(n) space, which is the standard answer for this problem.",[1344,1345,1350],"pre",{"className":1346,"code":1347,"language":1348,"meta":1349,"style":1349},"language-csharp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","public int[] TwoSum(int[] nums, int target) {\n    var map = new Dictionary\u003Cint, int>();\n    for (int i = 0; i \u003C nums.Length; i++) {\n        int need = target - nums[i];\n        if (map.TryGetValue(need, out int j)) return new[] { j, i };\n        map[nums[i]] = i;\n    }\n    return Array.Empty\u003Cint>();\n}\n","csharp","",[467,1351,1352,1360,1366,1372,1378,1384,1390,1396,1402],{"__ignoreMap":1349},[1353,1354,1357],"span",{"class":1355,"line":1356},"line",1,[1353,1358,1359],{},"public int[] TwoSum(int[] nums, int target) {\n",[1353,1361,1363],{"class":1355,"line":1362},2,[1353,1364,1365],{},"    var map = new Dictionary\u003Cint, int>();\n",[1353,1367,1369],{"class":1355,"line":1368},3,[1353,1370,1371],{},"    for (int i = 0; i \u003C nums.Length; i++) {\n",[1353,1373,1375],{"class":1355,"line":1374},4,[1353,1376,1377],{},"        int need = target - nums[i];\n",[1353,1379,1381],{"class":1355,"line":1380},5,[1353,1382,1383],{},"        if (map.TryGetValue(need, out int j)) return new[] { j, i };\n",[1353,1385,1387],{"class":1355,"line":1386},6,[1353,1388,1389],{},"        map[nums[i]] = i;\n",[1353,1391,1393],{"class":1355,"line":1392},7,[1353,1394,1395],{},"    }\n",[1353,1397,1399],{"class":1355,"line":1398},8,[1353,1400,1401],{},"    return Array.Empty\u003Cint>();\n",[1353,1403,1405],{"class":1355,"line":1404},9,[1353,1406,1407],{},"}\n",[455,1409,1410,494,1412,1415],{},[432,1411,503],{},[496,1413,1414],{},"\"What if the array is sorted?\""," → two pointers, O(1) space.",[512,1417],{},[450,1419,1421],{"id":1420},"_27-write-a-method-to-check-if-a-string-is-a-palindrome","27. Write a method to check if a string is a palindrome.",[455,1423,1424],{},[432,1425,1426],{},"Sample explanation:",[461,1428,1429],{},[455,1430,1431],{},"I'll use two pointers — one at the start and one at the end — moving toward the middle, comparing characters. If any pair doesn't match, return false. The time complexity is O(n), space is O(1).",[1344,1433,1435],{"className":1346,"code":1434,"language":1348,"meta":1349,"style":1349},"public bool IsPalindrome(string s) {\n    int l = 0, r = s.Length - 1;\n    while (l \u003C r) {\n        if (char.ToLower(s[l]) != char.ToLower(s[r])) return false;\n        l++; r--;\n    }\n    return true;\n}\n",[467,1436,1437,1442,1447,1452,1457,1462,1466,1471],{"__ignoreMap":1349},[1353,1438,1439],{"class":1355,"line":1356},[1353,1440,1441],{},"public bool IsPalindrome(string s) {\n",[1353,1443,1444],{"class":1355,"line":1362},[1353,1445,1446],{},"    int l = 0, r = s.Length - 1;\n",[1353,1448,1449],{"class":1355,"line":1368},[1353,1450,1451],{},"    while (l \u003C r) {\n",[1353,1453,1454],{"class":1355,"line":1374},[1353,1455,1456],{},"        if (char.ToLower(s[l]) != char.ToLower(s[r])) return false;\n",[1353,1458,1459],{"class":1355,"line":1380},[1353,1460,1461],{},"        l++; r--;\n",[1353,1463,1464],{"class":1355,"line":1386},[1353,1465,1395],{},[1353,1467,1468],{"class":1355,"line":1392},[1353,1469,1470],{},"    return true;\n",[1353,1472,1473],{"class":1355,"line":1398},[1353,1474,1407],{},[455,1476,1477,494,1479,1482],{},[432,1478,503],{},[496,1480,1481],{},"\"What if there are spaces or punctuation?\""," → skip non-alphanumeric chars in the loop.",[512,1484],{},[450,1486,1488],{"id":1487},"_28-reverse-a-linked-list-in-place","28. Reverse a linked list in place.",[455,1490,1491],{},[432,1492,1426],{},[461,1494,1495],{},[455,1496,1497,1498,1501],{},"I'll iterate with three pointers: previous, current, and next. At each step I save the next node, point current's ",[467,1499,1500],{},"Next"," back to previous, then advance previous and current forward.",[1344,1503,1505],{"className":1346,"code":1504,"language":1348,"meta":1349,"style":1349},"public ListNode? Reverse(ListNode? head) {\n    ListNode? prev = null;\n    var curr = head;\n    while (curr != null) {\n        var nxt = curr.Next;\n        curr.Next = prev;\n        prev = curr;\n        curr = nxt;\n    }\n    return prev;\n}\n",[467,1506,1507,1512,1517,1522,1527,1532,1537,1542,1547,1551,1557],{"__ignoreMap":1349},[1353,1508,1509],{"class":1355,"line":1356},[1353,1510,1511],{},"public ListNode? Reverse(ListNode? head) {\n",[1353,1513,1514],{"class":1355,"line":1362},[1353,1515,1516],{},"    ListNode? prev = null;\n",[1353,1518,1519],{"class":1355,"line":1368},[1353,1520,1521],{},"    var curr = head;\n",[1353,1523,1524],{"class":1355,"line":1374},[1353,1525,1526],{},"    while (curr != null) {\n",[1353,1528,1529],{"class":1355,"line":1380},[1353,1530,1531],{},"        var nxt = curr.Next;\n",[1353,1533,1534],{"class":1355,"line":1386},[1353,1535,1536],{},"        curr.Next = prev;\n",[1353,1538,1539],{"class":1355,"line":1392},[1353,1540,1541],{},"        prev = curr;\n",[1353,1543,1544],{"class":1355,"line":1398},[1353,1545,1546],{},"        curr = nxt;\n",[1353,1548,1549],{"class":1355,"line":1404},[1353,1550,1395],{},[1353,1552,1554],{"class":1355,"line":1553},10,[1353,1555,1556],{},"    return prev;\n",[1353,1558,1560],{"class":1355,"line":1559},11,[1353,1561,1407],{},[512,1563],{},[445,1565,1567],{"id":1566},"h-system-process","H. System & process",[450,1569,1571],{"id":1570},"_29-how-would-you-debug-a-slow-api-endpoint","29. How would you debug a slow API endpoint?",[455,1573,1574],{},[432,1575,459],{},[461,1577,1578,1581],{},[455,1579,1580],{},"First, I'd reproduce the issue and measure — use Stopwatch around suspected code, or built-in profiling tools like dotTrace or MiniProfiler. I'd check the database query plan if it's a data-access issue, look for N+1 patterns, and verify indexes are being used.",[455,1582,1583],{},"If it's not a database issue, I'd check external calls — slow HTTP dependencies, missing async, or contention on shared resources. Logs and APM tools like Application Insights help spot patterns. The key is to isolate the bottleneck before optimizing.",[512,1585],{},[450,1587,1589],{"id":1588},"_30-how-do-you-handle-a-code-review-where-the-reviewer-disagrees-with-you","30. How do you handle a code review where the reviewer disagrees with you?",[455,1591,1592],{},[432,1593,459],{},[461,1595,1596,1599],{},[455,1597,1598],{},"I try to listen first and understand their reasoning — they often have context I don't. If I still disagree after that, I'll explain my position with concrete trade-offs, maybe even a small experiment or benchmark. Code review is about the code, not the person, so I keep the tone neutral.",[455,1600,1601],{},"If we still can't agree, I defer to the more senior person or escalate to the team lead. As a fresher, I see reviews as one of the fastest ways to learn.",[512,1603],{},[450,1605,1607],{"id":1606},"_31-tell-me-about-a-bug-you-found-that-was-particularly-tricky","31. Tell me about a bug you found that was particularly tricky.",[455,1609,1610],{},[432,1611,1612],{},"Sample STAR answer:",[461,1614,1615,1621,1627,1648],{},[455,1616,1617,1620],{},[496,1618,1619],{},"(Situation)"," In my school project, the dashboard page took about three seconds to load even though the dataset was small.",[455,1622,1623,1626],{},[496,1624,1625],{},"(Task)"," My job was to figure out why.",[455,1628,1629,1632,1633,1636,1637,1640,1641,1644,1645,1647],{},[496,1630,1631],{},"(Action)"," I added Stopwatch logging and noticed the EF Core query was firing 50 times instead of once. I realized I was looping through ",[467,1634,1635],{},"Orders"," and accessing ",[467,1638,1639],{},"order.Customer.Name"," inside the loop, which triggered lazy loading on each iteration. I switched to ",[467,1642,1643],{},".Include(o => o.Customer)"," and also added a ",[467,1646,1292],{}," projection to grab only the columns I needed.",[455,1649,1650,1653],{},[496,1651,1652],{},"(Result)"," The page load time dropped from 3 seconds to about 150 milliseconds. I learned to watch for N+1 patterns and to profile early.",[512,1655],{},[427,1657,1659,1660],{"color":429,"icon":1658},"i-lucide-arrow-right","Tiếp theo: ",[1661,1662,1663],"a",{"href":150},"Behavioral Q&A + Phrase Bank",[1665,1666,1667],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":1349,"searchDepth":1362,"depth":1362,"links":1669},[1670,1679,1686,1694,1700,1708,1715,1720],{"id":447,"depth":1362,"text":448,"children":1671},[1672,1673,1674,1675,1677],{"id":452,"depth":1368,"text":453},{"id":516,"depth":1368,"text":517},{"id":545,"depth":1368,"text":546},{"id":570,"depth":1368,"text":1676},"4. What is the difference between const and readonly?",{"id":604,"depth":1368,"text":1678},"5. What happens when you write throw ex versus just throw?",{"id":637,"depth":1362,"text":638,"children":1680},[1681,1682,1683,1684,1685],{"id":641,"depth":1368,"text":642},{"id":721,"depth":1368,"text":722},{"id":756,"depth":1368,"text":757},{"id":802,"depth":1368,"text":803},{"id":824,"depth":1368,"text":825},{"id":852,"depth":1362,"text":853,"children":1687},[1688,1690,1692],{"id":856,"depth":1368,"text":1689},"11. How does async\u002Fawait actually work?",{"id":896,"depth":1368,"text":1691},"12. Why should you avoid .Result or .Wait() on a Task?",{"id":933,"depth":1368,"text":1693},"13. What's the difference between IEnumerable and IQueryable?",{"id":975,"depth":1362,"text":976,"children":1695},[1696,1697,1698,1699],{"id":979,"depth":1368,"text":980},{"id":1009,"depth":1368,"text":1010},{"id":1031,"depth":1368,"text":1032},{"id":1052,"depth":1368,"text":1053},{"id":1091,"depth":1362,"text":1092,"children":1701},[1702,1703,1704,1705,1707],{"id":1095,"depth":1368,"text":1096},{"id":1113,"depth":1368,"text":1114},{"id":1156,"depth":1368,"text":1157},{"id":1182,"depth":1368,"text":1706},"21. What status code would you return when a POST succeeds?",{"id":1212,"depth":1368,"text":1213},{"id":1234,"depth":1362,"text":1235,"children":1709},[1710,1712,1713],{"id":1238,"depth":1368,"text":1711},"23. What is the DbContext and why is it registered as Scoped?",{"id":1268,"depth":1368,"text":1269},{"id":1298,"depth":1368,"text":1714},"25. When would you use .AsNoTracking()?",{"id":1320,"depth":1362,"text":1321,"children":1716},[1717,1718,1719],{"id":1324,"depth":1368,"text":1325},{"id":1420,"depth":1368,"text":1421},{"id":1487,"depth":1368,"text":1488},{"id":1566,"depth":1362,"text":1567,"children":1721},[1722,1723,1724],{"id":1570,"depth":1368,"text":1571},{"id":1588,"depth":1368,"text":1589},{"id":1606,"depth":1368,"text":1607},"30+ technical questions in English với sample answer, hint phát âm, follow-up câu hỏi.","md",null,{},{"title":144,"icon":147},{"title":422,"description":1725},"daeWyoOLmzMIz9yaQjSh6LVPaE-v2SEhcMhA8p6xhWs",[1733,1735],{"title":139,"path":140,"stem":141,"description":1734,"icon":142,"children":-1},"Từ vựng technical theo chủ đề C#, OOP, SQL, ASP.NET, EF Core — kèm phát âm và ví dụ câu.",{"title":149,"path":150,"stem":151,"description":1736,"icon":152,"children":-1},"Self-introduction template, behavioral STAR questions, phrase bank khi bí, small talk — đầy đủ cho phỏng vấn fresher .NET English.",1783490356698]