Skip to content

Latest commit

 

History

History
1978 lines (1659 loc) · 148 KB

File metadata and controls

1978 lines (1659 loc) · 148 KB

دانشنامه مصاحبه برنامه نویسی

من در ابتدا این لیست رو به عنوان یک لیست کوتاه از مجموعه موضوعات پژوهشی برای تبدیل شدن به یک مهندس نرم افزار ایجاد کردم، اما به فهرست بلند و بالایی که امروز میبینید تبدیل شد. بعد از طی کردن این طرح, به عوان مهندس توسعه نرم افزار در آمازون استخدام شدم! احتمالاً مجبور نخواهید بود به آن اندازه که من مطالطه کردم مطالعه کنید. به هر حال هر چیزی که نیاز داشته باشید در اینجا ذکر شده

من بین 8 تا 10 ساعت در روز، برای چندین ماه مطالعه کردم. داستان از این قرار است: چرا 8 ماه تمام وقت برای مصاحبه گوگل مطالعه کردم

لطفاً توجه داشته باشید: لازم نیست به اندازه من مطالعه کنید. من زمان زیادی رو برای دانستن چیزهایی که نیازی به دانستن آنها نداشتم تلف کردم. که بیشتر در پایین توضیح میدهم. من به شما کمک میکنم که بدون اتلاف وقت گرانبهای خود به هدف خود برسید.

موارد ذکر شده در اینجا شما را برای یک مصاحبه فنی، تقریباً در هر شرکت نرم افزاری به خوبی آماده می کند, از جمله غول ها: آمازون، فیس بوک، گوگل و مایکروسافت

با آرزوی موفقیت

ترجمه ها:
در حال ترجمه:

این چیه؟

Coding at the whiteboard - from HBO's Silicon Valley

این برنامه پژوهشی چند ماهه من جهت تبدیل شدن به یک مهندس نرم افزار برای یک شرکت بزرگ است.

مهارت های ضروری:

  • کمی تجربه کد نویسی (متغیر ها, حلقه ها, متدها/توابع, و...)
  • صبر و حوصله
  • زمان
توجه داشته باشید که این یک برنامه مطالعاتی برای **مهندسی نرم افزار** است، نه توسعه وب. شرکت های بزرگ نرم افزاری مانند گوگل، آمازون، فیس بوک و مایکروسافت مهندسی نرم افزار را متفاوت از توسعه وب می دانند. برای مثال در آمازون مهندسین فرانت اند (FEE) و مهندسان توسعه نرم افزار (SDE) وجود دارند. این دو تا نقش های جداگانه هستند و مصاحبه برای آنها یکسان نخواهد بود، زیرا هر کدام شایستگی های خاص خود را دارند. این شرکت ها برای نقش های توسعه نرم افزار/مهندسی نیاز به دانش علوم کامپیوتر دارند.
---

فهرست مطالب

برنامه مطالعه

موضوعات مطالعه

گرفتن شغل

---------------- یادگیری موارد زیر احتیاری است ----------------

موضوعات و منابع اضافی اختیاری


چرا ازش استفاده کنیم؟

اگر می خواهید به عنوان مهندس نرم افزار برای یک شرکت بزرگ کار کنید، اینها چیزهایی هستند که باید بدانید.

اگر مانند من موفق به دریافت مدرک در رشته علوم کامپیوتر نشدید، این لیست شما رو در میابد و 4 سال از زندگی شما رو حفظ میکند

وقتی این پروژه را شروع کردم فرق بین پشته و هیپ رو نمیدانستم، یا چیزی درمورد پیچیدگی زمانی و درخت ها نمیدانستم , و یا اینکه چگونه یک گراف رو پیمایش کنم. اگر مجبور بودم یک الگوریتم مرتب‌سازی را کدنویسی کنم، می‌توانم به شما بگویم که وحشتناک بود. هر ساختار داده ای که استفاده میکردم از انواع تعریف شده در زبان برنامه نویسی بود و اصلا از پشت صحنه هیچ خبری نداشتم. من هرگز مجبور نبودم حافظه را مدیریت کنم، مگر اینکه فرآیندی که در حال اجرا بودم،خطای حافظه را نشان دهد, و سپس به فکر این می افتادم که باید یک راه حل پیدا کنم. من تنها قادر بودم از آرایه های چند بعدی استفاده کنم و هرگز یک ساختار داده رو از ابتدا ایجاد نکرده بودم

این یک برنامه طولانی است. ممکن است ماه ها طول بکشد. اگر قبلاً با بسیاری از این موارد آشنا هستید، زمان بسیار کمتری از شما خواهد گرفت.

نحوه استفاده

موارد را به ترتیب از بالا به پایین بررسی کنید.

من از قابلیت های مارک داون گیتهاب ار جمله قابلیت لیست وظایف برای پیگیری پیشرفت مطالعات استفاده کردم

**یک برنچ جدید برای تیک زدن مواردی که به اتمام رسانده اید ایجاد کنید، برای این کار فقط یک x داخل براکت قرار دهید : [x]**
Fork a branch and follow the commands below

این ریپو رو فورک کنید https://github.com/jwasham/coding-interview-university

و سپس کلون کنید:

git clone [email protected]:<your_github_username>/coding-interview-university.git
git checkout -b progress
git remote add jwasham https://github.com/jwasham/coding-interview-university
git fetch --all
تمام باکس هایی که به اتمام رسانیده اید را با X علامت بزنید:
git add .
git commit -m "Marked x"
git rebase jwasham/main
git push --set-upstream origin progress
git push --force

More about GitHub-flavored markdown

احساس نکنید که به اندازه کافی باهوش نیستید

نکته ای درباره منابع ویدئویی

برخی از ویدیوها فقط با ثبت نام در کلاس Coursera یا EdX در دسترس هستند. که بهشون دوره های گسترده باز (MOOC) میگویند. بعضی مواقع کلاس ها در باز های زمانی خاصی دایر میشوند، بنابراین باید چند ماه برای شرکت در این کلاس ها صبر کنید

خیلی عالی میشه که دوره های آنلاین اینچنینی با منابع رایگان و همیشه در دسترس جایگزین بشه, مانند ویدیوهای یوتیوب (ترجیحاً سخنرانی های دانشگاه)، تا اینکه بتوانید هر زمان که خواستید مطالعه کنید, نه فقط زمانی که یک دوره آنلاین خاص در حال برگزاری است.

یک زبان برنامه نویسی را انتخاب کنید

برای مصاحبه های کدنویسی که انجام می دهید باید یک زبان برنامه نویسی انتخاب کنید. اما شما همچنین باید زبانی را پیدا کنید که بتوانید از آن برای مطالعه مفاهیم علوم کامپیوتر استفاده کنید.

ترجیحاً زبانهای یکسانی باشند، به طوری که شما فقط باید در یکی از آن ها مهارت داشته باشید.

برای این طرح مطالعه

من وقتی داشتم این برنامه مطالعاتی رو انجام میدادم، برای بیشتر آن از دو زبان پایتون و C استفاده میکردم
  • C: یک زبان بسیار سطح پایین است. و شما با اشاره گر ها و تخصیص و آزاد سازی حافظه سرو کار دارید, از این رو شما ساختمان داده ها و الگوریتم رو از نزدیک تجربه خواهید کرد. در زبان‌های سطح بالاتر مانند پایتون یا جاوا، اینها از شما پنهان هستند. که برای کارهای روزانه فوق العاده هست, اما زمانی که در حال یادگیری نحوه ساخت این ساختارهای داده سطح پایین هستید, یک حس دیگری است.
    • در طول پروسه مطالعه زبان سی رو همه جا خواهید دید در کتاب ها سخنرانی ها و ویدیوها.
    • The C Programming Language, Vol 2
      • این یک کتاب کوتاه است، اما به شما مهارت خوبی در زبان C می دهد و اگر کمی آن را تمرین کنید، به سرعت به مهارت خواهید رسید. درک C به شما کمک می کند تا نحوه عملکرد برنامه ها و حافظه را درک کنید.
      • نیازی نیست خیلی عمیق در این کتاب فرو بروید فقط تا حدی لازم است که بتوانید کد های زبان سی رو بخوانید و بنویسید.
      • پاسخ به سوالات کتاب
  • Python: مدرن و بسیار رسا، من پایتون رو برای اینکه یک زبان بسیار مفید هست یاد گرفتم و همچنین برای اینکه این امکان رو بهم میده که کد کمتری در مصاحبه بنویسم.

این دو زبان ترجیجات من هستند. البته شما میتوانید هر چیزی که دوست دارید انتخاب کنید.

ممکن است لازم نباشه ، ولی در اینجا چند سایت برای یادگیری یک زبان جدید وجود دارد:

برای مصاحبه

شما می توانید از زبانی که در آن راحت هستید برای انجام بخش کد نویسی مصاحبه استفاده کنید، اما برای شرکت های بزرگ، اینها گزینه های خوبی هستند.:

  • C++
  • Java
  • Python

شما همچنین می توانید از اینها استفاده کنید، اما ابتدا مطالعه کنید. ممکن است اخطارهایی وجود داشته باشد:

  • JavaScript
  • Ruby

در اینجا مقاله ای در مورد انتخاب زبان برای مصاحبه نوشتم: یک زبان را برای مصاحبه کدنویسی انتخاب کنید. این مقاله اصلی است که پست من بر اساس آن نوشته شده است: http://blog.codingforinterviews.com/best-programming-language-jobs/

شما باید خیلی با زبانی که انتخاب میکنید راحت باشید و معلومات کافی داشته باشید.

درباره انتخاب ها بیشتر بخوانید:

منابع مخصوص هر زبان را اینجا ببینید

کتاب های مربوط به ساختمان داده و الگوریتم

این کتاب پایه و اساس شما را برای علوم کامپیوتر تشکیل خواهد داد.

فقط یکی از موارد مربوط به زبانی که با آن راحت تر هستیدرا انتخاب کنید. که قرار است مطالعه و کد نویسی زیادی انجام دهید.

C

Python

Java

انتخاب شما:

C++

انتخاب شما:

کتاب های آمادگی مصاحبه

شما نیازی به خریدن تمام این کتاب ها رو ندارید. راستش رابخواهید احتمالاً کتاب "Cracking the Coding Interview" کافی است, اما من بیشتر گرفتم تا بیشتر تمرین کنم. اما من همیشه بیش از حد انجام می دهم.

من هر دوی اینها را خریدم. آنها به من تمرین زیادی دادند.

اگر وقت اضافی دارید:

Choose one:

اشتباهات من را مرتکب نشوید

این فهرست در طول چندین ماه رشد کرد و از کنترل خارج شد.

در اینجا برخی از اشتباهاتم رو ذکر میکنم تا شما تجربه بهتری داشته باشید. تا ماه ها در زمان خود صرفه جویی کنید.

1. شما همه چیز را به خاطر نخواهید آورد

ساعت‌ها ویدیو تماشا کردم و یادداشت‌برداری کردم و ماه‌ها بعد چیز زیادی به یاد نمی آوردم. من 3 روز وقت گذاشتم یادداشت هایم را مرور کردم و فلش کارت درست کردم تا بتوانم مرور کنم. من نیازی به این همه دانستن نداشتم.

لطفا بخوانید تا مرتکب اشتباه من نشوید:

Retaining Computer Science Knowledge.

2. از فلش کارت استفاده کنید

برای حل این مشکل، یک سایت فلش کارت کوچک درست کردم که می توانستم فلش کارت های خودم رو در دو نوع کد و عمومی اضافه کنم. هر کارت قالب بندی متفاوتی داشت. وب‌سایت رو سازگار با تلفن همراه ایجاد کردم، بنابراین می‌توانستم هر کجا که هستم، در تلفن یا تبلت مرور کنم.

سورس وب سایت:

توصیه نمیکنم که از فلش کارت های من استفاده کنید. بسیاری از آنها موارد بی اهمیت هستند که ممکن است نیاز نداشته باشید.

اما اگر نمی خواهی به من گوش کنی، بفرما:

به خاطر داشته باشید که من زیاده روی کردم و کارت هایی دارم که همه چیز را از زبان اسمبلی و نکات بی اهمیت پایتون گرفته تا یادگیری ماشینی و آمار را پوشش می دهد. که بسیار زیاد تر از حد مورد نیاز است.

یک نکته درباره فلش کارت ها: به محض اینکه تشخیص دادید که جواب یک کارت را میدانید اون رو به عنوان میدانم علامت نزنید. قبل از آن باید کارت را ببینید و چندین بار جواب درست آن را مرور کنید. پس از چند بار تکرار مبحث مورد نظر عمیقاً در ذهن شما ثبت میشود.

میتوانید به عنوان جاگزین سایت فلش کارت من از سایت Anki, استفاده کنید که بارها به من توصیه شده است. که از یک سیستم تکرار برای کمک به یادآوری استفاده می کند. کاربرپسند است، در همه پلتفرم ها موجود است و دارای سیستم همگام سازی ابری است. که تمامی نسخه های آن به غیر از نسخه IOS رایگان میباشیند.

دیتابیس فلش کارت من با فرمت Anki: https://ankiweb.net/shared/info/25173560 (thanks @xiewenya).

بعضی از دانش آموزان یک به مشکل قالب بندی کارت ها برخوردند که با انجام موارد زیر قابل رفع است: open deck, edit card, click cards, select the "styling" radio button, add the member "white-space: pre;" to the card class.

3. تمرین ها و سوالات مصاحبه را حل کنید

این بسیار مهم است.

هنگامی که در حال یادگیری ساختمان داده و الگوریتم هستید، شروع به کدنویسی و حل تمرین های مصاحبه کنید.

حتما باید آنچه را که یاد میگیرید را به کار ببرید و تمرین کنید ، وگرنه فراموش خواهید کرد. همانطور که من این اشتباه رو مرتکب شدم.

وقتی موضوعی را یاد گرفتید و تا حدودی با آن احساس راحتی کردید, برای مثال لیست های پیوندی:

  1. کتاب مصاحبه کدنویسی (یا یکی از سایت های معرفی شده در پایین) رو باز کنید
  2. 2 یا 3 سوال در مورد لیست های پیوندی انجام دهید.
  3. به سراغ مبحث بعدی بروید.
  4. بعد ها دوباره به مبحث لیست های پیوندی برگردید و دو یا سه مسئله دیگر انجام دهید.
  5. این کار را با هر موضوع جدیدی که یاد می گیرید انجام دهید.

مسئله ها رو وقتی که دارید یاد میگیرید انجام دهید، نه بعد از آن

شمام به خاطر دانشتون استخدام نمیشوید، بلکه به خاطر مهارت استفاده از اون دانش استخدام میشوید.

یه سری منابع پایین لیست شده.

4. تمرکز

عوامل بیرونی زیادی وجود دارند که باعث حواس پرتی شما میشه. تمرکز و حواس جمع بودن خیلی سخته. برای تمرکز بهتر یک موسیقی بیکلام پخش کنید.

به چه چیزهایی پرداخته نشده

موارد زیر فناوری های رایج هستند اما بخشی از این طرح مطالعه نیستند:

  • SQL
  • Javascript
  • HTML, CSS, and other front-end technologies

برنامه روزانه

در این دوره به موضوعات زیادی پرداخته میشود. با توجه به زمان بندی شما ممکن است هر کدام از موضوعات چند روز و یا حتی یک هفته یا بیشتر زمان ببرد.

هر روز، موضوع بعدی را در لیست انتخاب کنید، چند ویدیو در مورد آن موضوع تماشا کنید و سپس آن را با زبان برنامه نویسی که انتخاب کردید پیاده سازی کنید

کد های من رو میتونید در اینجا ببینید:

شما نیازی به حفظ کردن هر الگوریتم ندارید. شما فقط باید بتوانید آنقدر آن را درک کنید تا بتوانید آنرا پیاده سازی کنید.

تمرین مصاحبه کدنویسی

چرا این اینجاست؟ من برای مصاحبه آماده نیستم.

پس این رو بخوانید.

چرا باید انجام مسائل برنامه نویسی را تمرین کنید:

  • Problem recognition, and where the right data structures and algorithms fit in
  • Gathering requirements for the problem
  • Talking your way through the problem like you will in the interview
  • Coding on a whiteboard or paper, not a computer
  • Coming up with time and space complexity for your solutions (see Big-O below)
  • Testing your solutions

یک مقدمه عالی برای حل مسئله روشمند و ارتباطی در مصاحبه وجود دارد: Algorithm design canvas

کد را روی تخته سفید یا کاغذ بنویسید، نه کامپیوتر. با چند ورودی نمونه تست کنید. سپس آن را تایپ کرده و روی کامپیوتر تست کنید.

اگر در خانه تخته وایت برد ندارید، یک پد طراحی بزرگ از یک فروشگاه هنری بردارید. می توانید روی مبل بنشینید و تمرین کنید. در پایین تصویر دفتر سفیدی که استفاده میکردم رو میبینید، خودکار رو برای بهتر شدن تصویر اضافه کردم. اگه با خودکار توی این دفتر بنویسید آرزو میکنید کاش میتوانستید پاک کنید. از مداد و پاک کن استفاده کنید.

my sofa whiteboard

نباید پاسخ سوالات رو به خاطر بسپارید باید مسائل رو یاد بگیرید.

مسائل برنامه نویسی

کتاب کلیدی مصاحبه کد نویسی رو فراموش نکنید اینجا.

حل مسئله:

ویدئوهای مربوط به سوال های مصاحبه کدنویسی:

سایت های چالشی:

بیایید شروع کنیم

خوب، صحبت کافی است، بیایید یاد بگیریم!

اما فراموش نکنید که در حین یادگیری، مسائل کدنویسی را از بالا انجام دهید!

پیچیدگی الگوریتمی / Big-O / تحلیل مجانبی

بسیارخب، فکر کنم در همین حد کافی باشه.

وقتی دارید کتاب "Cracking the Coding Interview" رو مطالعه میکنید، یک فصل در این مورد در آنجا وجود داره. اگر بتوانید پیچیدگی زمان اجرای الگوریتم های مختلف رو شناسایی کنید. فرصت خوبیه برای بررسی و تست مسائل

ساختمان داده

موارد بیشتر

درخت

مرتب سازی

به عنوان خلاصه، در اینجا یک نمایش بصری از15 الگوریتم مرتب سازی. اگر به جزئیات بیشتری در مورد این موضوع نیاز دارید، بخش "مرتب سازی" را در اینجا ببینید جزئیات بیشتر در مورد برخی از موضوعات

گراف

از گراف ها میتوان برای حل بسیاری از مسائل در علوم کامپیوتر استفاده کرد، بنابراین این بخش مانند بهش درخت و مرتب سازی طولانی است.

موارد حتی بیشتر


بررسی نهایی

این بخش ویدیوهای کوتاه تری دارد که می توانید خیلی سریع آن ها را تماشا کنید تا بیشتر مفاهیم مهم را مرور کنید.

رزومه خود را به روز کنید

یک شغل پیدا کنید

فرآیند مصاحبه و آمادگی مصاحبه عمومی

Mock Interviews:

به فکر زمان مصاحبه باشید

درباره 20 تا از سوالاتی که ممکن است از شما پرسیده شود و سوالات پایین فکر کنید. و برای هرکدام حداقل یک جواب داشته باشید

  • چرا این شغل را می خواهی؟

  • یکی از مشکلات بزرگی که حل کردی رو بازگو کن؟

  • بزرگترین چالشی که داشتی؟

  • بهترین و بدترین طرح هایی که دیدی؟

  • ایده هایی برای بهبود یک محصول موجود

  • چگونه به عنوان یک فرد و به عنوان بخشی از یک تیم بهترین کار را انجام می دهید؟

  • کدام یک از مهارت ها یا تجربیات شما میتواند کلیدی باشد و چرا؟

  • از چه چیز فلان پروژه لذت بردی؟

  • بزرگترین چالشی که توی فلان پروژه باهاش روبرو شدی چی بود؟

  • سخت ترین باگی که باهاش روبرو شدی چی بود؟

  • از فلان پروژه چی یاد گرفتی؟

  • چه کاری رو بهتر انجام دادی؟

  • اگر یافتن پاسخ‌های خوب برای این نوع سوالات مصاحبه برایتان سخت است، در اینجا چند ایده وجود دارد:

سوالاتی برای مصاحبه کننده آماده کنید

برخی از سوالات من (من قبلاً ممکن است پاسخ ها را بدانم، اما نظر آنها یا دیدگاه تیم را می خواهم):

  • تعداد تیم شما چقدر است؟
  • What does your dev cycle look like? Do you do waterfall/sprints/agile?
  • Are rushes to deadlines common? Or is there flexibility?
  • تصمیمات در تیم شما چگونه گرفته می شود؟
  • چند جلسه در هفته دارید؟
  • آیا احساس می کنید محیط کارتان به شما کمک می کند تمرکز کنید؟
  • بر روی چه مسئله ای کار می کنید؟
  • چه چیزی را درباره آن دوست داری؟
  • زندگی کاری چگونه است؟
  • تعادل کار و زندگی چگونه است؟

وقتی شغل مورد نظر رو به دست آوردید

تبریک می گویم!

به یادگیری ادامه دهید.

تازه اولشه


*****************************************************************************************************
*****************************************************************************************************

از اینجا به بعد موارد اختیاری استو دانستن آنها برای مصاحبه سطح مقدماتی نیازی نیست.
با این حال، با مطالعه این موارد، بیشتر در معرض مفاهیم CS قرار خواهید گرفت و برای هر شغل مهندسی نرم افزار آمادگی بیشتری خواهید داشت. شما تبدیل به یک مهندس نرم افزار بسیار قوی تر خواهید شد.

*****************************************************************************************************
*****************************************************************************************************

کتاب های اضافی

These are here so you can dive into a topic you find interesting.
  • The Unix Programming Environment
    • An oldie but a goodie
  • The Linux Command Line: A Complete Introduction
    • A modern option
  • TCP/IP Illustrated Series
  • Head First Design Patterns
    • A gentle introduction to design patterns
  • Design Patterns: Elements of Reusable Object-Oriente​d Software
    • AKA the "Gang Of Four" book, or GOF
    • The canonical design patterns book
  • Algorithm Design Manual (Skiena)
    • As a review and problem recognition
    • The algorithm catalog portion is well beyond the scope of difficulty you'll get in an interview
    • This book has 2 parts:
      • Class textbook on data structures and algorithms
        • Pros:
          • Is a good review as any algorithms textbook would be
          • Nice stories from his experiences solving problems in industry and academia
          • Code examples in C
        • Cons:
          • Can be as dense or impenetrable as CLRS, and in some cases, CLRS may be a better alternative for some subjects
          • Chapters 7, 8, 9 can be painful to try to follow, as some items are not explained well or require more brain than I have
          • Don't get me wrong: I like Skiena, his teaching style, and mannerisms, but I may not be Stony Brook material
      • Algorithm catalog:
        • This is the real reason you buy this book.
        • This book is better as an algorithm reference, and not something you read cover to cover.
    • Can rent it on Kindle
    • Answers:
    • Errata
  • Write Great Code: Volume 1: Understanding the Machine
    • The book was published in 2004, and is somewhat outdated, but it's a terrific resource for understanding a computer in brief
    • The author invented HLA, so take mentions and examples in HLA with a grain of salt. Not widely used, but decent examples of what assembly looks like
    • These chapters are worth the read to give you a nice foundation:
      • Chapter 2 - Numeric Representation
      • Chapter 3 - Binary Arithmetic and Bit Operations
      • Chapter 4 - Floating-Point Representation
      • Chapter 5 - Character Representation
      • Chapter 6 - Memory Organization and Access
      • Chapter 7 - Composite Data Types and Memory Objects
      • Chapter 9 - CPU Architecture
      • Chapter 10 - Instruction Set Architecture
      • Chapter 11 - Memory Architecture and Organization
  • Introduction to Algorithms
    • Important: Reading this book will only have limited value. This book is a great review of algorithms and data structures, but won't teach you how to write good code. You have to be able to code a decent solution efficiently
    • AKA CLR, sometimes CLRS, because Stein was late to the game
  • Computer Architecture, Sixth Edition: A Quantitative Approach
    • For a richer, more up-to-date (2017), but longer treatment

طراحی سیستم، مقیاس پذیری، مدیریت داده ها

اگر بیش از 4 سال تجربه دارید باید انتظار سوالات درمورد طراحی سیستم داشته باشید.

یادگیری بیشتر

I added them to help you become a well-rounded software engineer, and to be aware of certain
technologies and algorithms, so you'll have a bigger toolbox.

جزئیات بیشتر در مورد برخی از موضوعات

I added these to reinforce some ideas already presented above, but didn't want to include them
above because it's just too much. It's easy to overdo it on a subject.
You want to get hired in this century, right?

مجموعه ویدیویی

Sit back and enjoy.

دوره های علوم کامپیوتر

Algorithms implementation

مقالات

LICENSE

CC-BY-SA-4.0