├── README.md ├── SUMMARY.md ├── artifacts └── student-resume-guide.md ├── bonus ├── finding-a-mentor.md ├── learning-cs-online.md ├── online-content-to-explore.md └── things-founders-should-know.md ├── domain-specific ├── a-deeper-understanding-of-java.md ├── diving-into-web-development.md ├── improving-code-quality.md └── intro-to-graphics-programming.md ├── international-students └── navigating-work-sponsorship-in-the-us.md ├── internship-and-job-search-strategy ├── early-internship-programs.md ├── finding-roles.md ├── getting-into-top-tech-companies.md ├── landing-software-internship.md └── technical-work-while-in-college.md ├── networking-and-communication └── the-art-of-the-follow-up.md ├── offer-and-salary-negotiation └── negotiating-on-internship-salary.md ├── skills-and-knowledge-tree.md ├── software-engineering ├── contributing-to-open-source.md ├── exploring-system-architecture.md ├── on-becoming-a-senior-engineer.md ├── software-career-tracks.md ├── software-design-patterns.md ├── success-as-a-software-engineer.md ├── success-as-a-software-engineer │ ├── README.md │ ├── dont-just-copy-and-paste.md │ ├── more-engineering-advice.md │ ├── senior-solutions-toolkit.md │ ├── seven-pieces-of-advice.md │ └── standing-out-in-entry-level.md └── your-questions-answered │ ├── README.md │ ├── on-miscellaneous.md │ ├── on-technical-interviews.md │ └── on-the-internship-search.md ├── success-checklist.md ├── technical-interviewing ├── anatomy-of-an-interview.md ├── studying-for-tech-interviews.md ├── studying-for-tech-interviews │ ├── README.md │ ├── interview-prep-resources-part-2.md │ ├── interview-prep-resources-part-i.md │ ├── study-game-plan.md │ └── technical-interview-types.md └── technical-interviewing-guide.md └── what-is-codepath.org.md /README.md: -------------------------------------------------------------------------------- 1 | # 👋🏾 Introduction 2 | 3 | _----_\ 4 | _**Hi there! This handbook has been replaced by the**_ :arrow\_right: [_**CodePath Career Kit**_](https://go.codepath.org/careerkit) :arrow\_left:_**. ****You're welcome to continue to use the handbook if you prefer the format, but you can find all newer resources**_ [_**here**_](https://go.codepath.org/careerkit)_**.**_\ 5 | _**---**_\ 6 | \ 7 | 👋🏾 Welcome to our [CodePath.org](http://codepath.org/) Career Center Resources! ✨The goal of these guides is to demystify the software engineering field and how to set yourself up for success to become a software engineer or in other related positions after you graduate. 8 | 9 | ### Who is this guide for? 10 | 11 | This guide is specifically targeted for [CodePath.org](http://codepath.org/) students that are currently attending or will be attending university, will be or are studying within a STEM major, and are interested in pursuing a career as a software engineer. 12 | 13 | The guide assumes some knowledge of certain technical terms used throughout but is intended to be accessible to those very early within their university experience. Please contact us if you find anything confusing so we can continue to improve the accessibility of these guides! 14 | 15 | ### Navigating this Guide 16 | 17 | 👈🏽 Jump to any section by clicking on the sidebar or 👇🏽 start by reviewing the content below! 18 | 19 | * **Interested to understand more about a career in software engineering?** Check out [our questions answered](software-engineering/your-questions-answered/) page for answers to common questions. 20 | * **Interested in the specific steps you should complete while in college?** [Check out our success checklist](success-checklist.md) for a high-level overview. 21 | * **Interested in the skills and knowledge you’ll develop over your career as a software engineer?** [Check out the skills and knowledge map](skills-and-knowledge-tree.md) for a high-level introduction. 22 | * **Interested in starting or improving your resume?** Check out our [starter kit](https://goo.gl/q5dp5w) or [resume improvement guide](artifacts/student-resume-guide.md) 23 | * **Interested in how technical internship interviews work?** Check out our [guide to technical interviewing](technical-interviewing/technical-interviewing-guide.md) for a high-level overview. 24 | 25 | ### Overview 26 | 27 | As part of our programs, we offer students direct guidance and feedback on their resumes, LinkedIns and provide coaching and guidance during your internship search. We want to make sure every one of you has a clear pathway to your first (or next) great technical internship. 28 | 29 | There are four major areas we want to help students navigate: 30 | 31 | 1. **Career Exploration** - Provide you key context on how to succeed as a software engineer 32 | 2. **Resume/LinkedIn** - Creating an effective resume and LinkedIn profile 33 | 3. **Applying for Internships** - Sending out your resume and actually applying to companies 34 | 4. **Technical Interviews** - Studying and becoming confident in technical internship interviews 35 | 36 | {% hint style="success" %} 37 | ❗To sign up for these programs, check out our [student career page here](https://codepath.org/career) to get setup with a mentor, learn more about virtual career fairs, and see what other services we provide for our students! 38 | {% endhint %} 39 | 40 | ### 1. Career Exploration 41 | 42 | Many students at university have a lot of questions surrounding the overall technical landscape of being a software engineer, including what classes to take, what to do outside of class, what it’s like being a software engineer or even how to get started contributing in open-source. 43 | 44 | Check out our guide [Software Engineering - Your Questions Answered](software-engineering/your-questions-answered/) for a detailed overview of your most common questions. 45 | 46 | ### 2. Developing your Resume 47 | 48 | Your internship search begins with a resume and LinkedIn profile: 49 | 50 | * If you **do not have a resume**, [check out these materials for creating one](https://goo.gl/q5dp5w) based on our template. 51 | * If you **already have a resume**, [check out our guide for improving your existing resume](artifacts/student-resume-guide.md). 52 | 53 | ### 3. Applying for Internships 54 | 55 | Your next step is applying for internships, this is about finding a set of companies and applying to them, and attending career fairs in order to set up a number of internship interviews: 56 | 57 | If you are a Sophomore or Junior, check out our [3-steps to an internship search](https://medium.com/@seaon/3-step-guide-to-nail-your-internship-search-82ed58f7f6a) guide for a detailed walkthrough of how to start your summer internship search. 58 | 59 | If you are a Freshman or Sophomore, apply for a few [early pre-internship summer programs](internship-and-job-search-strategy/early-internship-programs.md) which do not require much technical coding knowledge. 60 | 61 | ### 4. Passing a Technical Internship Interview 62 | 63 | After you apply to enough companies, you’ll need to make sure you are prepared for the technical interviews associated with the companies that respond back positively: 64 | 65 | Check out our [technical internship interview guide](technical-interviewing/technical-interviewing-guide.md) for everything you need to know about what technical interviews are like at top companies. 66 | 67 | ### Bonus 1: Strengthening your Network 68 | 69 | One of the best ways to increase your chances of finding great opportunities is to connect with more people: connect with new peers, recruiters and engineers. This can sometimes be difficult to do, or is put off because you don’t always know where to start. 70 | 71 | Check out our [guide on expanding your network and following up](networking-and-communication/the-art-of-the-follow-up.md) for a concrete look into how to expand your professional network as well as your digital presence. 72 | 73 | ### Bonus 2: The Secret to Asking for a Mentor 74 | 75 | We all know it’s smart to think proactively about finding mentors because the right people in your corner can really accelerate your growth. 76 | 77 | However, we know that it can be awkward finding and asking a mentor to help, so we prepared a link to some great resources around [finding and asking for a technical mentor](bonus/finding-a-mentor.md). 78 | 79 | ### Bonus 3: Code Quality and Cleanliness 80 | 81 | When coding in an interview context or especially when presenting code on your Github profile, it’s important to spend some attention on making sure your code is clean and avoids sending “red flags” by having a lot of misspellings, badly named variables or inconsistent whitespace/indentation. Check out our [code quality guide](domain-specific/improving-code-quality.md) for more details. 82 | 83 | {% hint style="success" %} 84 | This guide was originally authored and adapted by Nathan Esquenazi as part of the services offered to students through [CodePath.org](http://codepath.org/), a 501(3)c non-profit dedicated to forging an accelerated pathway into the tech industry for all university students. 85 | 86 | Special thanks to the many students, recruiters, and professional engineers that provided feedback and made this guide possible! 87 | {% endhint %} 88 | -------------------------------------------------------------------------------- /SUMMARY.md: -------------------------------------------------------------------------------- 1 | # Table of contents 2 | 3 | * [👋🏾 Introduction](README.md) 4 | * [💻 What is CodePath.org?](what-is-codepath.org.md) 5 | * [✅ Success Checklist](success-checklist.md) 6 | * [🌱 Skills and Knowledge Tree](skills-and-knowledge-tree.md) 7 | 8 | ## Job Application Artifacts 9 | 10 | * [Resume Writing Guide](artifacts/student-resume-guide.md) 11 | * [Resume Checklist & Formats](https://docs.google.com/document/d/1TDGkSD5l--GjKu56jw6frHmjr075QHbr\_wfma\_gmv8s/edit#heading=h.a6zf6udxi9hp) 12 | * [Cover Letter Guide](https://docs.google.com/document/d/1LCn4cOA8FwSQDhfG0xAXX\_q6a2u\_z0tsfABDBnmEJzQ/view) 13 | * [LinkedIn Checklist](https://docs.google.com/document/d/1NgOOqmOlYDujxuZtFk3o775V9osLYuaTWRDS23tbsXI/edit#heading=h.7xnsbllfc1cq) 14 | * [Tech Fellow Resume Language](https://docs.google.com/document/d/1-xPB-9svIjkf1ryHYjJJAeCqrubGzovR-F1euyXEtz4/edit) 15 | * [GitHub Checklist](https://docs.google.com/document/d/1-sti9cKekesOyVTeuMyKyDXyWVgN2\_JbbxP-e6r5PB4/edit#heading=h.es3agud5kvq4) 16 | 17 | ## Internship & Job Search Strategy 18 | 19 | * [Getting Technical Experience In College](internship-and-job-search-strategy/technical-work-while-in-college.md) 20 | * [Early Internship Programs for 1st/2nd Year Students](internship-and-job-search-strategy/early-internship-programs.md) 21 | * [Starting your Internship Search](https://medium.com/@seaon/3-step-guide-to-nail-your-internship-search-82ed58f7f6a) 22 | * [Finding Internships and Roles](internship-and-job-search-strategy/finding-roles.md) 23 | * [Landing a Software Internship](internship-and-job-search-strategy/landing-software-internship.md) 24 | * [Getting into Top Tech Companies](internship-and-job-search-strategy/getting-into-top-tech-companies.md) 25 | 26 | ## Networking and communication 27 | 28 | * [Networking Guide & Templates](https://docs.google.com/document/d/1BehKTrQWek7J2Q5Lq53hE\_jUOiZbyToS3CORMg15ZOE/edit?usp=sharing) 29 | * [Elevator Pitch Worksheet](https://docs.google.com/document/d/1UC\_1ysSr5u6aR\_JkBoez1qsFmPIBX\_YMfvcB\_efANYk/edit#heading=h.5nyauybydqd9) 30 | * [The Art of the Follow-up](networking-and-communication/the-art-of-the-follow-up.md) 31 | * [Virtual Career Fair Guide](https://docs.google.com/document/d/1KD3nO6\_yrT2SOtnb9E\_OYXFxSHHN\_e9EZjcmIbrxN-4/edit) 32 | * [Professional Communication](https://docs.google.com/document/d/16lX\_U8immOVgrf9hRXv4AcuOr5Z\_\_4oEnn2QG36kThE/edit?usp=sharing) 33 | * [Resources & Communities for Diverse Job-Seekers](https://deliveryteam.notion.site/6558d14e2dc74c5086ea54121aefe0b6?v=0ed401ef5a8b4987a6dad96e858b2a05) 34 | 35 | ## Behavioral Interviewing 36 | 37 | * [LinkedIn's Interview Prep Platform](https://www.linkedin.com/interview-prep/) 38 | * [Behavioral Interview Worksheet](https://docs.google.com/document/d/1ferHwQBVCVAzl44WjF4XMxX9xulqY3vyYwkXEt5ZK4A/edit#heading=h.gjdgxs) 39 | 40 | ## Technical Interviewing 41 | 42 | * [Technical Interviewing Guide](technical-interviewing/technical-interviewing-guide.md) 43 | * [Anatomy of an Interview](technical-interviewing/anatomy-of-an-interview.md) 44 | * [Studying for Tech Interviews](technical-interviewing/studying-for-tech-interviews/README.md) 45 | * [Prep Resources, Part I](technical-interviewing/studying-for-tech-interviews/interview-prep-resources-part-i.md) 46 | * [Prep Resources, Part 2](technical-interviewing/studying-for-tech-interviews/interview-prep-resources-part-2.md) 47 | * [Study Game Plan](technical-interviewing/studying-for-tech-interviews/study-game-plan.md) 48 | * [Technical Interview Types](technical-interviewing/studying-for-tech-interviews/technical-interview-types.md) 49 | 50 | ## Offer & Salary Negotiation 51 | 52 | * [Salary Negotiation Guide](https://docs.google.com/document/d/1Zw6gUnajdLK8SGpcz8GL0EFqfNl24BLbTkjUKa7NWTc/edit?usp=sharing) 53 | * [Fearless Salary Negotiation (Templates)](https://fearlesssalarynegotiation.com/salary-negotiation-guide/) 54 | * [Salary Negotiation: Make More Money, Be More Valued](https://www.kalzumeus.com/2012/01/23/salary-negotiation/) 55 | * [Navigating Multiple Offers](https://www.forbes.com/sites/dailymuse/2015/09/21/a-guide-to-juggling-multiple-job-offers-and-coming-out-on-top/?sh=712983f560b5) 56 | * [Salary Negotiation for Internships](offer-and-salary-negotiation/negotiating-on-internship-salary.md) 57 | 58 | ## International Students 59 | 60 | * [Top H1B Employers by Year](https://www.myvisajobs.com/Reports/2021-H1B-Visa-Sponsor.aspx) 61 | * [Navigating Work Sponsorship in the US](international-students/navigating-work-sponsorship-in-the-us.md) 62 | * [International Student Job Search Guide](https://docs.google.com/document/d/1YHNJwJSG2LxIBi63KddWRZkhX1ojiZ9u68pgAvwzNy4/edit) 63 | 64 | ## Software Engineering 65 | 66 | * [Your Questions Answered](software-engineering/your-questions-answered/README.md) 67 | * [On the Internship Search](software-engineering/your-questions-answered/on-the-internship-search.md) 68 | * [On Technical Interviews](software-engineering/your-questions-answered/on-technical-interviews.md) 69 | * [On Miscellaneous](software-engineering/your-questions-answered/on-miscellaneous.md) 70 | * [Software Career Tracks](software-engineering/software-career-tracks.md) 71 | * [Software Design Patterns](software-engineering/software-design-patterns.md) 72 | * [Exploring System Architectures](software-engineering/exploring-system-architecture.md) 73 | * [Software Engineer Success](software-engineering/success-as-a-software-engineer/README.md) 74 | * [Seven Pieces of Advice](software-engineering/success-as-a-software-engineer/seven-pieces-of-advice.md) 75 | * [Standing Out at Entry-Level](software-engineering/success-as-a-software-engineer/standing-out-in-entry-level.md) 76 | * [Senior Solutions Toolkit](software-engineering/success-as-a-software-engineer/senior-solutions-toolkit.md) 77 | * [Don't Just Copy & Paste](software-engineering/success-as-a-software-engineer/dont-just-copy-and-paste.md) 78 | * [More Engineering Advice](software-engineering/success-as-a-software-engineer/more-engineering-advice.md) 79 | * [On Becoming a Senior Engineer](software-engineering/on-becoming-a-senior-engineer.md) 80 | * [Contributing to Open-source](software-engineering/contributing-to-open-source.md) 81 | 82 | ## Domain-Specific 83 | 84 | * [A Deeper Understanding of Java](domain-specific/a-deeper-understanding-of-java.md) 85 | * [Improving Code Quality](domain-specific/improving-code-quality.md) 86 | * [Intro to Graphics Programming](domain-specific/intro-to-graphics-programming.md) 87 | * [Diving into Web Development](domain-specific/diving-into-web-development.md) 88 | 89 | ## Additional Resources 90 | 91 | * [Career Center Policies](https://docs.google.com/document/d/1VXWUOJ7uiBGviKiURrvW\_jSTDUGPKKfSA-GM\_xvBII4/edit) 92 | * [Guide to Finding a Mentor](bonus/finding-a-mentor.md) 93 | * [Learning Computer Science](bonus/learning-cs-online.md) 94 | * [Online Content to Explore](bonus/online-content-to-explore.md) 95 | * [Things Founders Should Know](bonus/things-founders-should-know.md) 96 | -------------------------------------------------------------------------------- /artifacts/student-resume-guide.md: -------------------------------------------------------------------------------- 1 | # Resume Writing Guide 2 | 3 | ### What is the purpose of a resume? 4 | 5 | Your resume is a marketing tool that aims to convey your relevant skills, education, and experiences for a specific position. 6 | 7 | While writing a resume might seem pretty straightforward, there are a lot of nuances. It’s the first thing recruiters will read about you, so it's crucial to make a good first impression.…And you need to make that impression fast. [Recruiters spend an average of six seconds reviewing a resume.](https://cdn.theladders.net/static/images/basicSite/pdfs/TheLadders-EyeTracking-StudyC2.pdf) 8 | 9 | Almost all that time is spent on your name, companies, job titles, start/end dates, school, major, and project titles. Everything on your resume should be tailored towards helping recruiters find these key pieces of info as fast as possible. 10 | 11 | ### Getting started in creating a resume 12 | 13 | If you don’t already have a resume, [you can use one of these resume formats to get started](https://docs.google.com/document/d/1TDGkSD5l--GjKu56jw6frHmjr075QHbr\_wfma\_gmv8s/edit#heading=h.a6zf6udxi9hp). You can also check out [examples of real student resumes](https://drive.google.com/drive/folders/19G47UBMFTQ6egTDf06nkYd1S4AF7pMlC?usp=sharing) for additional inspiration. 14 | 15 | The most important thing about choosing a resume format is not the design, but the content. You want to make sure you're able to easily showcase your experience and skills on one page as well as edit your resume to tailor it for specific positions. 16 | 17 | Flashy resume builders don't always make editing and saving different versions of your resume easy. They are also generally more difficult for Applicant Tracking Software systems to read. Whatever you choose, clean and consistent formatting is required! 18 | 19 | ### Key resume guidelines 20 | 21 | ➡️_Check out our_ [_full resume checklist here_](https://docs.google.com/document/d/1TDGkSD5l--GjKu56jw6frHmjr075QHbr\_wfma\_gmv8s/edit#heading=h.a6zf6udxi9hp)_!_ 22 | 23 | **Things to include:** 24 | 25 | * Languages, frameworks, platforms and tools that you are most familiar with and that are asked for in the job description (Make sure everything you list is something you'd be comfortable speaking about) 26 | * Projects (3-4...prioritizing side projects over academic projects). 27 | * Include projects that showcase things you’re passionate about and your technical experience. 28 | * Include a link for each project (to GitHub repo, deployed version, blog, app in store, etc.) if you can 29 | * Include links to your GitHub, LinkedIn and a web portfolio/website (if applicable) 30 | * If either cumulative GPA and your major GPA are close to or above 3.5, you should include! 31 | * Include the languages, frameworks, platforms and tools that you are most familiar with 32 | * Look at the job description and make sure to include relevant skills/experiences. E.g. if you’re applying for a mobile role and you’ve used languages they’re asking for, make sure to list them in the work/project descriptions! 33 | 34 | **Making your resume easy to scan:** 35 | 36 | * Make your name BIG (16-20 pt. font) 37 | * Highlight company names, job titles, start/end dates, school name, major and project titles. 38 | * Important content should be higher up. For a student or new grad, resumes are one page and the order of importance is usually Education > Experience > Projects > Skills. 39 | * Recommend no more than 2 different font sizes and two different colors total per resume. 40 | * Stick to a standard format (reverse chronological order within each section, no weird fonts, 10.5 to 12 pt. font size, 0.5 to 1 inch margins). Standard formats (one-column resumes) are more readable by resume-parsing programs and easier to skim by recruiters. 41 | * Bullet points (real ones, not dashes) are your friend. Text walls discourage readers. 42 | 43 | **Everything on your resume should have a clear purpose:** 44 | 45 | * Objectives or summary sections are generally unnecessary. 46 | * Descriptions should say something tangible. _“Exceptional team player”_ doesn’t work. _“Increased user conversion rates by 20%”_ does. This should describe the project specifically and quantify impact if possible. 47 | * If your bullet points could have the same impact in fewer words or simpler terms, you should probably edit them. 48 | 49 | #### Including CodePath on your resume: 50 | 51 | * **Tech Fellows:** [Check out this guide ](https://docs.google.com/document/d/1xpwOZGWf-QJf7gtSWWqb72HhUxEAsNdrYTdv\_W9mwf8/edit?usp=sharing) demonstrating how to add your leadership experience to your resume. 52 | * **If you took a course where you did not build a project:** You can list yourself as a CodePath course alum under "Relevant Training", "Activities", "Relevant Coursework" or "Certifications". 53 | * **If you built projects in our courses:** Include those in a “Projects” section alongside other portfolio pieces. Be sure to describe the project (“Built and published a functional Instagram-like Android app which allows users to share photos with friends and family”) **and** include a link to the GitHub repo. 54 | 55 | ### Getting feedback 56 | 57 | After finishing your resume, have your peers review it. Ask them to be honest and harsh. If you then want even more tips, check out [this article](https://www.freecodecamp.org/news/writing-a-killer-software-engineering-resume-b11c91ef699d/). 58 | 59 | ### How is a resume actually used? 60 | 61 | Once you’ve created your resume, here are a few ways it might be used. 62 | 63 | * **Career Fairs**. You will hand out your resume at career fairs (at your campus, or at CodePath virtual career fairs). The company representative (usually an engineer or recruiter) will spend the cursory 6 seconds looking it over, and then ask the “tell me about yourself” question. It’s really important to be able to provide a [_concise and enthusiastic pitch_](https://docs.google.com/document/d/1UC\_1ysSr5u6aR\_JkBoez1qsFmPIBX\_YMfvcB\_efANYk/edit#heading=h.5nyauybydqd9) about why you are interested in the company-- essentially your [cover letter](https://docs.google.com/document/d/1LCn4cOA8FwSQDhfG0xAXX\_q6a2u\_z0tsfABDBnmEJzQ/edit) in verbal form. At career fairs, many companies actually assign a number to each student about their likelihood to be a good fit. 64 | * **Submitting Online**. Perhaps the primary way your resume will be used is as the first touch point with a recruiter at a company after you apply for a technical role, either an internship ([see our guide on searching for technical internships here!](https://medium.com/@seaon/3-step-guide-to-nail-your-internship-search-82ed58f7f6a)) or full-time position. A technical recruiter receives a lot of resumes in most cases, and they are the one processing incoming applications. [Connecting with people and working through referrals](https://docs.google.com/document/d/1BehKTrQWek7J2Q5Lq53hE\_jUOiZbyToS3CORMg15ZOE/edit) can often **make all the difference in getting access** in your resume getting a longer look and hopefully you getting an interview invite. 65 | 66 | -------------------------------------------------------------------------------- /bonus/finding-a-mentor.md: -------------------------------------------------------------------------------- 1 | # Guide to Finding a Mentor 2 | 3 | We all know it’s smart to think proactively about finding mentors because the right people in your corner can really accelerate your growth. 4 | 5 | If you’re just looking for someone to give you advice occasionally, I don’t think you need to formally ask someone to be your mentor. The cool thing about this industry is, it’s seems really easy to find people willing to give you advice. 6 | 7 | * Once someone agrees to meet up to give advice, try to get on the phone or do a video call \(or meet in person if possible\) because those touch-points will make people feel more invested in you. 8 | * Reach out to people you don’t know that share your alma mater that work at a tech company. Often, they will be glad to get the message, and some will connect you directly. 9 | 10 | However, we know that it can be awkward finding and asking a mentor for help. The following articles go into detail on how to do just that: 11 | 12 | * [The Secret to Asking for a Mentor Is Not Asking, Period](https://www.huffingtonpost.com/quora/the-secret-to-asking-for_b_8274052.html) 13 | * [Moneyish's The Rules: How to ask someone to be your mentor](https://moneyish.com/upgrade/the-rules-how-to-ask-someone-to-be-your-mentor/) 14 | * [How to Ask Someone to Be Your Mentor](https://www.glassdoor.com/blog/how-to-ask-someone-to-be-your-mentor/) 15 | * [9 Tips To Land A Great Mentor: How To Ask A Stranger For Career Advice](https://www.forbes.com/sites/sabinanawaz/2015/11/07/9-tips-to-land-a-great-mentor-how-to-ask-a-stranger-for-career-advice/) 16 | 17 | One of the most impactful mentors is the one that’s in the company that you work at, and Nick Caldwell \(former CTO of Reddit\) has an interesting take on thinking about mentorship vs sponsorship: 18 | 19 | [Stop asking for mentors and start asking for sponsors](https://hackernoon.com/stop-asking-for-mentors-and-start-asking-for-sponsors-600288df98be) 20 | 21 | -------------------------------------------------------------------------------- /bonus/learning-cs-online.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: 'In this section, we look at the top places to study Computer Science online' 3 | --- 4 | 5 | # Learning Computer Science 6 | 7 | ### Getting Started 8 | 9 | * Start with the [free Harvard CS50 course on EDX](https://www.edx.org/course/cs50s-introduction-to-computer-science). Check out the sub [r/cs50](https://www.reddit.com/r/cs50) has a lot of like minded people learning together. 10 | * [Open Source Society University](https://github.com/open-source-society/computer-science): _This is a solid path for those of you who want to complete a Computer Science course on your own time, for free, with courses from the best universities in the World._ 11 | * Learn Java OOP \(here is an excellent course\): [Java MOOC](https://java-programming.mooc.fi/) 12 | 13 | ### Web Development 14 | 15 | * [Free Code Camp](https://www.freecodecamp.com/) for web development 16 | * [Colt Steele](https://www.udemy.com/the-web-developer-bootcamp/) has a good web dev course and is highly recommended to do in parallel with FreeCodeCamp 17 | * [The Rails Tutorial](https://www.railstutorial.org/) by Michael Hartl is the Bible for learning Ruby on Rails 18 | 19 | ### Specialized and Advanced Topics 20 | 21 | * Build your own operating system: [NAND2TETRIS](http://www.nand2tetris.org/) 22 | * For x86 assembly: [http://opensecuritytraining.info/IntroX86.html](http://opensecuritytraining.info/IntroX86.html) 23 | * For deeper knowledge of OOP check out Sandi Metz’s [POODR](http://www.poodr.com/) 24 | * The canonical handbook for C Programming: [K&R](https://www.amazon.com/Programming-Language-2nd-Brian-Kernighan/dp/0131103628) 25 | 26 | ### Other Resources 27 | 28 | * [Stackoverflow](http://stackoverflow.com/) is your friend where you can ask any question you have or bounce ideas off of others. 29 | * [Cave of Programming](https://www.caveofprogramming.com/) : All kinds of programming 30 | * [r/arduino](https://www.reddit.com/r/arduino) for some embedded programming fun! 31 | * Courses for anything under the sun: [https://www.edx.org/](https://www.edx.org/) & [https://www.coursera.org/](https://www.coursera.org/) 32 | 33 | ### Articles and Posts 34 | 35 | * [The MIT Challenge](https://www.scotthyoung.com/blog/myprojects/mit-challenge-2/) is Scott Young’s blog on how he completed the entire 4 year MIT Computer Science curriculum in 12 months 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /bonus/online-content-to-explore.md: -------------------------------------------------------------------------------- 1 | # Online Content to Explore 2 | 3 | News sources to explore: 4 | 5 | * [HackerNews](https://news.ycombinator.com/) - Great place to keep up with technology and startup news 6 | * [Product hunt](https://www.producthunt.com/) - Great place to keep up with startups and products 7 | 8 | Information sources: 9 | 10 | * [CS Career Questions Subreddit](https://www.reddit.com/r/cscareerquestions/) 11 | 12 | ## Active tech company blogs 13 | 14 | * [Airbnb](https://medium.com/airbnb-engineering) 15 | * [Amazon](https://developer.amazon.com/blogs) 16 | * [Dropbox](https://blogs.dropbox.com/tech/) 17 | * [Etsy](https://codeascraft.com/) 18 | * [Evernote](https://evernote.com/blog/) 19 | * [Instagram](https://instagram-engineering.com/) 20 | * [LinkedIn](https://engineering.linkedin.com/blog) 21 | * [Medium](https://medium.engineering/) 22 | * [Netflix](https://medium.com/netflix-techblog) 23 | * [Pinterest](https://medium.com/@Pinterest_Engineering) 24 | * [Reddit](https://redditblog.com/) 25 | * [Riot Games](https://engineering.riotgames.com/) 26 | * [Slack](https://slack.engineering/) 27 | * [Spotify](https://labs.spotify.com/) 28 | * [Square](https://developer.squareup.com/blog/category/engineering/) 29 | * [Twitter](https://blog.twitter.com/engineering/en_us.html) 30 | * [Youtube](https://youtube-eng.googleblog.com/) 31 | 32 | ## Resources, sites, and media 33 | 34 | Blog, podcasts, courses, or websites you might want to explore: 35 | 36 | * [Angie Jones Blog](https://angiejones.tech/) 37 | * [Women Make](https://womenmake.com/) - an online community for women entrepreneurs. 38 | * [Jane Wong Blog](https://wongmjane.com/blog/fb-hiding-likes) 39 | * [Elpha](https://elpha.com/) - Women in Tech online community 40 | * [Hirobytes](https://anchor.fm/hiroko) - Podcast talking about tech, personal finance, entrepreneurship, disability, and health 41 | * [Software Engineering Unlocked](https://www.software-engineering-unlocked.com/) - Podcast talks to experienced developers 42 | * [Women in Web Dev](https://womeninwebdev.com/) - Online community for female developers. 43 | * [CodeNewbie](https://www.codenewbie.org/) - Supportive community for developers 44 | * [BaseCS](https://www.codenewbie.org/basecs) - A series of videos related to CS 45 | * [Hanselminutes Podcast](https://hanselminutes.com/archives) - Interviews with interesting tech-related people 46 | * [Gitcute Podcast](https://gitcutepodcast.com/) - Making tech news obtainable and cute one podcast at a time. 47 | * [Codebar](https://codebar.io/) - Runs regular programming workshops. 48 | 49 | -------------------------------------------------------------------------------- /bonus/things-founders-should-know.md: -------------------------------------------------------------------------------- 1 | # Things Founders Should Know 2 | 3 | * Your idea is not valuable, at all. All value is in the execution. You think you are an exception; you are not. You should not insist on an NDA to talk about it; nobody serious will engage in contract review over an idea, and this will mark you as clueless. 4 | * Technologists tend to severely underestimate the difficulty and expense of creating software, especially at companies which do not have fully staffed industry-leading engineering teams 5 | * Charge more. Charge more still. Go on. 6 | * The press is a lossy and biased compression of events in the actual world and is singularly consumed with its own rituals, status games, and incentives. The news necessarily fails to capture almost everything which happened yesterday. What it says is important usually isn't. 7 | * Companies find it incredibly hard to reliably staff positions with hard-working generalists who operate autonomously and have high-risk tolerances. This is not the model employee, including at places that are justifiably proud of the skill/diligence/etc of their employees. 8 | * The hardest problem in B2C is distribution. The hardest problem in B2B is sales. The big companies succeed primarily because they have mortal locks on distribution. 9 | * Everyone in Silicon Valley uses equity, and not debt, to fuel their growth because debt is not available in sufficient quantities to poorly capitalized companies without a strong history of adequate cash flows to service debt. 10 | * Investors in venture-back companies are purchasing a product. It is critically important to understand that that product is growth. The reason tech is favored as an asset class that it appears to be one of few sources of growth available on the market at the moment at any price. 11 | * Software companies in B2B which aspire to growing quickly will eventually spend more on sales and marketing than they do on engineering. You can read S-1s of successful IPOs and calculate the ratio; it is sometimes 2X++. 12 | * The chief products of the tech industry are \(in B2C\) developing new habits among consumers and \(in B2B\) taking a business process which exists in many places and markedly decreasing the total cost of people required to implement it. 13 | * There is no hidden reserve of smart people who know what they're doing, anywhere. Not in government, not in science, not in tech, not at top companies, nowhere. The world exists in the same glorious imperfection that it presents with. 14 | * Significant advances shipped by the tech industry in the last 20 years include putting the majority of human knowledge in the hands of 40%++ of the world's population, available on-demand, for "coffee money" not "university money." 15 | * Startups are \(by necessity\) filled with generalists; big companies are filled with specialists. People underestimate how effective a generalist can be at things which are done by specialists. People underestimate how deep specialties can run. These are simultaneously true. 16 | * Most open source software is written by programmers who are full-time employed by companies which directly consume the software, at the explicit or implicit blessing of their employers. It is not charity work, any more than they charitably file taxes. 17 | 18 | [Source](https://threadreaderapp.com/thread/936615043126370306.html) 19 | 20 | -------------------------------------------------------------------------------- /domain-specific/a-deeper-understanding-of-java.md: -------------------------------------------------------------------------------- 1 | # A Deeper Understanding of Java 2 | 3 | If you never programmed at all before or if you are interested in starting with the basics, spend the first few months focused on learning Java. Learn the syntax and understand how everything works. You’ll need to be able to create classes, create and call methods, use interfaces as well as know how inheritance works, before you can go to the next step. These are the basics of Java, and you’ll use them extensively when developing Android apps. 4 | 5 | ❗👉🏽 [Start with these Java Interactive Guides](https://www.ktbyte.com/java-tutorial/book#chapters) or these [online Java Programming Tutorials](http://tutorials.jenkov.com/java) 6 | 7 | ## Where to Start 8 | 9 | Check out the links below first to brush up on Java: 10 | 11 | * [Start with these Java Interactive Guides](https://www.ktbyte.com/java-tutorial/book#chapters) 12 | * [Great online Java Programming Tutorials](http://tutorials.jenkov.com/java) 13 | 14 | ## Beginner Resources 15 | 16 | There are plenty of other helpful resources for learning Java: 17 | 18 | * [Programming by doing Java](http://programmingbydoing.com/) - Great step-by-step guide with challenges along the way 19 | * [TutsPlus Java Overview](http://mobile.tutsplus.com/tutorials/android/java-tutorial/) - Solid Java overview tutorials 20 | * [Learn Java Online](http://www.javastring.org/) - Interactive Java Tutorial 21 | * [CodingBat Java Exercises](http://codingbat.com/) - Exercises to practice Java 22 | * [TutorialsPoint Java Guide](http://www.tutorialspoint.com/java/java_basic_syntax.htm) 23 | * [Java tutorial](https://hackr.io/tutorials/learn-java) - A programming community & a great place to find the best online programming courses and tutorials. 24 | 25 | ## Books 26 | 27 | For a more in-depth look, you can also check out books \(available online or in print\): 28 | 29 | * [Head First Java Book](https://learning.oreilly.com/library/view/head-first-java/0596009208/) 30 | * [Java: A Beginners Guide](https://learning.oreilly.com/library/view/java-a-beginners/9781260440225/) 31 | * [Free Java Book](http://java2s.com/Book/Java/CatalogJava.htm) - Solid online book 32 | 33 | ## Additional Learning Resources 34 | 35 | * [Best Ways to Learn Java Overview](http://www.onvard.com/tracks/best-way-to-learn-java) - Overview article 36 | * [Udemy Free Java Course](https://www.udemy.com/java-tutorial/) - Free videos to learn Java 37 | * [Java Language Fundamentals](http://en.wikibooks.org/wiki/Java_Programming/Language_Fundamentals) 38 | * [The Java help subreddit](http://www.reddit.com/r/javahelp) 39 | * [The official Oracle Java tutorials](http://docs.oracle.com/javase/tutorial/getStarted/index.html) 40 | 41 | ## Intermediate Topics 42 | 43 | Be sure to check out these particular Java topics as well: 44 | 45 | * [Dealing with Exceptions](http://en.wikibooks.org/wiki/Java_Programming/Exceptions) 46 | * [Understanding Threads and Runnables](http://en.wikibooks.org/wiki/Java_Programming/Threads_and_Runnables) 47 | * [Using Interfaces](http://en.wikibooks.org/wiki/Java_Programming/Interfaces) 48 | * [Using Event Listeners](http://docs.oracle.com/javase/tutorial/uiswing/events/intro.html) 49 | * [Creating your own Callbacks and Listeners](http://stackoverflow.com/a/1477229/362298) 50 | 51 | -------------------------------------------------------------------------------- /domain-specific/diving-into-web-development.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: 'In this section, we take a look at how to jump into learning web development.' 3 | --- 4 | 5 | # Diving into Web Development 6 | 7 | ## Web Development 8 | 9 | What people often refer to as "web development" incorporates 4+ distinct areas of learning, which is why web development can seem overwhelming at first. 10 | 11 | 1. **Building and styling the actual web pages** - Front-end web development \(CSS for styling, HTML served by a back-end, and often JavaScript\) 12 | 2. **Deploying the web pages or web application** to live on a server or hosting system so people can access them. Setting up domain names and DNS so you can go to "yourcustomwebsite.com" 13 | 3. **Web Application Framework** - Back-end server which probably does the API queries to get or post data, processes data, and serves the dynamic data to the client as HTML 14 | 4. **Data storage in a database** - Back-end database which stores any data you need in your system that can’t be fetched every time directly from the API. This is database setup + SQL for reading/writing \(edited\) 15 | 16 | These are all great skills to learn, full-stack web is one of the most versatile stacks/skills in software engineering. 17 | 18 | ### 1. Building Web Pages with HTML/CSS/Javascript 19 | 20 | Basic building blocks of web pages are: HTML, CSS, and Javascript 21 | 22 | * [https://www.mockplus.com/blog/post/learn-html-css](https://www.mockplus.com/blog/post/learn-html-css) 23 | * [https://www.codecademy.com/learn/learn-html](https://www.codecademy.com/learn/learn-html) 24 | * [https://www.udemy.com/html-and-css-for-beginners-crash-course-learn-fast-easy/](https://www.udemy.com/html-and-css-for-beginners-crash-course-learn-fast-easy/) 25 | 26 | Free responsive web design course here is super comprehensive for the basics: [https://learn.freecodecamp.org/](https://learn.freecodecamp.org/) 27 | 28 | ### 2. Deploying Simple Web Pages 29 | 30 | [https://learntocodewith.me/tutorials/github-pages/](https://learntocodewith.me/tutorials/github-pages/) explains how to deploy simple web pages 31 | 32 | You can deploy simple web pages onto Github as shown above. For application, you can use [http://heroku.com](http://heroku.com) for free to avoid setting up your own server. 33 | 34 | You can also rent web hosting or web servers from lots of places online. 35 | 36 | ### 3. Full-Stack Web Application Development 37 | 38 | The main thing is picking which web framework and language to use, the rest of the major things outlined are supported by all major web frameworks. 39 | 40 | Common web frameworks are Javascript + Node.js + [Express](https://expressjs.com/), Ruby + [Rails](https://rubyonrails.org/), Python + [Django](https://rubyonrails.org/), [PHP and Laravel](https://laravel.com/) but there are many, many more for almost every language out there! The two aspects you'll want to consider are: 41 | 42 | * **Which programming language do I want to be working in?** \(_PHP/Javascript/Ruby/Python_\) 43 | * **Which web application framework do I want to be working in?** \(_Express/Rails/Django/Laravel_\) 44 | 45 | To start, you’ll want to go through a comprehensive tutorial for the chosen stack such as [https://www.railstutorial.org/book](https://www.railstutorial.org/book) for _Ruby on Rails_ which is a detailed online free book which takes you through all aspects. There are great tutorials out there for all major web development stacks though! 46 | 47 | Ruby and Rails is a good place to start if you don’t have another preference, but learning of these web application development frameworks will work just as well. The choice is largely subjective preference for language and framework. Start going through, learning the language and following that tutorial. 48 | 49 | Here’s a non profit running beginner Rails courses for free, the curriculum is open source [http://docs.railsbridge.org/docs/](http://docs.railsbridge.org/docs/) and also useful. 50 | 51 | -------------------------------------------------------------------------------- /domain-specific/improving-code-quality.md: -------------------------------------------------------------------------------- 1 | # Improving Code Quality 2 | 3 | When coding in an interview context or when presenting code on your Github profile, it’s important to spend some attention on the following: 4 | 5 | * Basic code styling \(Spacing, indentation, braces, etc\) 6 | * Variable/method naming \(prefix and spelling, clear naming\) 7 | * Language conventions \(e.g., using list comprehensions in Python or async/await/promises in Javascript\) 8 | * Object-Oriented Design \(encapsulation, scoping, class design, etc\) 9 | * Understand how to easily unit test all of your code 10 | 11 | ## Common Checklist 12 | 13 | Be sure to look out for the following things: 14 | 15 | * Try to make sure all whitespace and indentation is properly formatted and consistent throughout the code. Try using an “auto-indent” within your text editor or IDE for your language. 16 | * A common coding style convention is that class names should be written in PascalCase and variable names should be written in camelCase 17 | * Avoid any misspelled words in any methods, variables, comments, etc. This demonstrates an attention to detail in your code. 18 | * Try to include at least a few comments in your code to explain intent on certain key code blocks. 19 | * Make sure to include some reasonable code organization into objects, methods. Avoid long blocks of complicated unorganized code. The longer and more concentrated a function is, the more difficult it is to understand. 20 | * Avoid deeply nesting code. The code is more readable as it’s easier for the eye to follow and the logic is less dense and pretzel-ed. 21 | * Code that you want to sustain should be tested. If you test your code properly, you will increase your ability to modify/scale your code safely. 22 | 23 | 24 | ## Style Guides 25 | 26 | There are many great style guides online, you can check a few suggested language-specific ones below: 27 | 28 | * [Python](https://docs.python-guide.org/writing/style/) 29 | * [Java for Android](https://medium.com/@aliesaassadi/android-java-style-guide-515d99d888a5) 30 | * [Swift](https://github.com/raywenderlich/swift-style-guide) 31 | 32 | If you are working in a different language, you can often find them many of these as top results for `“[language] style guide”` on Google. 33 | 34 | ## More Resources 35 | 36 | Here are some highly recommended resources for further reading: 37 | 38 | * [Refactoring Guru](https://refactoring.guru/refactoring/smells) 39 | * [Martin Fowler's Refactoring Improving The Design Of Existing Code](https://www.powells.com/book/refactoring-improving-the-design-of-existing-code-9780134757599) 40 | * [Ed Crookshanks' Just Enough Debugging: Debugging, Refactoring, and Unit Tests](https://bookshop.org/books/just-enough-debugging-debugging-refactoring-and-unit-tests/9781985261815) 41 | * [Tom Long's Good Code, Bad Code: Think Like a Software Engineer](https://www.powells.com/book/good-code-bad-code-think-like-a-software-engineer-9781617298936) 42 | -------------------------------------------------------------------------------- /domain-specific/intro-to-graphics-programming.md: -------------------------------------------------------------------------------- 1 | # Intro to Graphics Programming 2 | 3 | {% hint style="info" %} 4 | All of the information here is sourced from [a tweet thread by Stephanie Hurlburt](https://twitter.com/sehurlburt/status/884470105320468481?s=21), graphics developer and co-founder of [Binomial](http://www.binomial.info/). 5 | {% endhint %} 6 | 7 | This is an introduction to graphics programming, below you will find some suggestions, resources, frameworks, and a list of mentors who can help! 8 | 9 | ### Pick a Project 10 | 11 | * Everyone is different with regards to how they learn. Often though, having a project and goal in mind can be very helpful. For example, “I’m going to build a particle system demo using Vulkan/C++”. 12 | * Keep the project simple, especially at first. Focus on learning one technique and keep the rest of the work very easy. Don’t try to build a whole game at once. Build a lighting effect or a little fluid/particle sim, or a shader. Keep the scope limited. 13 | * Focus your energy on relevant skills to developing that project or goal and ignore the rest at first. This is good because: 14 | * There’s too much to learn all at once 15 | * Focusing on skills you need to build things as opposed to theory is important 16 | * Building demos can help you get jobs more easily than anything else 17 | * As you build a project or demo, post updates and post the source on Github. This can be a great way to meet people and get visibility for your work, get hired, etc. And you’ll help teach other beginners as well. 18 | * Scanning the latest SIGGRAPH papers can give you an idea of what kind of work is interesting to graphics researchers. 19 | 20 | ### Beginning Resources 21 | 22 | Here are some great beginner friendly resources: 23 | 24 | * [Casual introduction to graphics programming by Stephanie](http://stephaniehurlburt.com/blog/2016/10/28/casual-introduction-to-low-level-graphics-programming) 25 | * [Graphics Programming Workshop](https://www.slideshare.net/StephanieHurlburt/graphics-programming-workshop) 26 | * [Introduction to VR Graphics](https://docs.google.com/presentation/d/1yJSQy4QtcQxcMjr9Wj6kjMd2R1BLNA1mUebDtnaXDL8/edit?usp=sharing) 27 | * [Introduction to C++ Graphics](https://docs.google.com/presentation/d/1d0StEQMEdz4JUEHXfTPbwKIGYex2p5Mko1Rj66e5M80/edit) 28 | * [Blog series, “Graphics in Plain Language”](https://renderdoc.org/blog/Graphics-in-Plain-Language/) 29 | * [Online book is an amazing introduction to shaders](https://t.co/QceyuUglwC) 30 | * [Monster list of graphics resources](http://kesen.realtimerendering.com/) 31 | * [@CasualEffects’s Graphics Codex excellent resource](http://graphicscodex.com/) 32 | * [Math for Graphics Programmers](https://www.amazon.com/Foundations-Game-Engine-Development-Mathematics/dp/0985811749/ref=asap_bc?ie=UTF8) 33 | * [GPU Performance for Game Artists by @keithoconor](http://fragmentbuffer.com/gpu-performance-for-game-artists/) 34 | * [@Peter\_shirley’s Raytracing in One Weekend](https://www.amazon.com/Ray-Tracing-Weekend-Minibooks-Book-ebook/dp/B01B5AODD8) 35 | 36 | If you’re a graphics coder reading this wondering how you can host a workshop too, [check out this guide](http://stephaniehurlburt.com/blog/2016/11/1/guide-to-running-technology-workshops). 37 | 38 | ### Graphics Frameworks 39 | 40 | Here are a few great frameworks for graphics: 41 | 42 | * [Beginner friendly library, Processing](https://processing.org/tutorials/) 43 | * [GLSLSandbox is a beginner-friendly shader library](http://glslsandbox.com/) 44 | * [Cinder Framework](https://libcinder.org/docs/guides/opengl/index.html) 45 | * [OpenFrameworks](http://openframeworks.cc/learning/) 46 | * [BGFX Graphics Framework](https://github.com/bkaradzic/bgfx) 47 | 48 | ### Find a Mentor! 49 | 50 | Stephanie [maintains a mentor list](http://stephaniehurlburt.com/blog/2016/11/14/list-of-engineers-willing-to-mentor-you) with many graphics programmers. They all love helping others, so feel free to reach out to them! 51 | 52 | ### More Advanced 53 | 54 | * [“A trip through the graphics pipeline” by @rygorous](https://fgiesen.wordpress.com/2011/07/09/a-trip-through-the-graphics-pipeline-2011-index/) 55 | * [Resources on advanced GPU optimization and documentation](https://github.com/g-truc/sdk/tree/master/documentation/hardware/amd/Southern%20Islands) 56 | * [Destiny’s Multithreaded Rendering Architecture by @mirror2mask](https://www.gdcvault.com/play/1021926/Destiny-s-Multithreaded-Rendering) 57 | 58 | ### Relation to Math 59 | 60 | An important point: The vast majority of graphics coders don’t know math very well. Don’t be scared away if you aren’t a math person. 61 | 62 | ### Attribution 63 | 64 | * The source of this is a [a tweet thread by Stephanie Hurlburt](https://twitter.com/sehurlburt/status/884470105320468481?s=21), graphics developer and co-founder of [Binomial](http://www.binomial.info/). 65 | 66 | -------------------------------------------------------------------------------- /international-students/navigating-work-sponsorship-in-the-us.md: -------------------------------------------------------------------------------- 1 | # Navigating Work Sponsorship in the US 2 | 3 | ## **Deliverables**: 4 | 5 | · Different types of student visas 6 | · How to find an internship or job while studying abroad 7 | · What pages/resources can use to determine which companies to sponsor 8 | 9 | ## **What are the types of student visas available?** 10 | 11 | As an international student coming to the United States to work, there are different visas that a student may apply for: F1 Visa, M1 Visa, J1 Visa, or H1-B Visa. It is important for students to be familiar with types of visas and how they impact work eligibility. 12 | 13 | **F1 Visa:** The F-1 Visa allows students to enter the United States as a full-time student at an accredited college, university, seminary, conservatory, academic high school, elementary school, or other academic institution or in a language training program. You must be enrolled in a program or course of study that culminates in a degree, diploma, or certificate and your school must be authorized by the U.S. government to accept international students. 14 | 15 | **M1 Visa:** M-1 international students in non-academic or vocational studies program may only accept employment if it is part of a practical training program and may only engage in such training after completion of their course of study. 16 | 17 | **J-1 Visa:** The Exchange Visitor \(J\) non-immigrant visa category is for individuals approved to participate in work-and study-based exchange visitor programs. 18 | 19 | **H-1B-** Person in Specialty Occupation: This visa category applies to people who wish to perform services in a specialty occupation, services of exceptional merit and ability relating to a Department of Defense \(DOD\) cooperative research and development project, or services as a fashion model of distinguished merit or ability. 20 | 21 | ## **What types of employment are available for students?** 22 | 23 | If you have the right combination of skills, education, and/or work experience, you may be able to live and work permanently in the United States by seeking an employment-based immigrant visa. Below are the types of employment that are available for international students. 24 | 25 | F-1 students may not work off-campus during the first academic year but may accept on-campus employment subject to certain conditions and restrictions. After the first academic year, F-1 students may engage in three types of off-campus employment: Optional Practical Training \(OPT\), Curricular Practical Training \(CPT\), Academic Training \(AT\), and H1-B Work Eligibility. 26 | 27 | M-1 students may engage in practical training only after they have completed their studies. 28 | 29 | For both F-1 and M-1 students, any off-campus training employment must be related to their area of study and must be authorized before starting any work by the Designated School Official who is authorized to maintain the Student and Exchange Visitor Information System \(SEVIS\) and USCIS. Students can find this person by meeting with their university’s Career Center or International Services Department. 30 | 31 | **Optional Practical Training \(OPT\):** All OPT must be directly related to your major area of study. If you are an F-1 student, you may be eligible to participate in OPT in two different ways: 32 | 33 | * Pre-completion OPT: You may apply to participate in pre-completion OPT after you have been lawfully enrolled on a full-time basis for one full academic year at a college or university that has been certified by the U.S. Immigration and Customs Enforcement \(ICE\) Student and Exchange Visitor Program \(SEVP\) to enroll F-1 students. You do not need to have had F-1 status for one full academic year; you can satisfy the “one full academic year” requirement even if you had another nonimmigrant status during that time. 34 | * If you are authorized to participate in pre-completion OPT, you may work part-time \(20 hours or less per week\) while school is in session. You may work full time when school is not in session. 35 | * Post-completion OPT: You may apply to participate in post-completion OPT after completing your studies. If you are authorized for post-completion OPT, you may work part-time \(20 hours or less per week\) or full time. 36 | * If you participated in pre-completion OPT, USCIS will deduct that amount of time from your post-completion OPT authorization period. For example, if you participated in 10 months of pre-completion OPT, you would be eligible for only up to 2 months of post-completion OPT. T 37 | 38 | To apply for OPT, please contact your designated school official for more information. 39 | 40 | **Curriculum Practical Training \(CPT\)**: CPT is an alternative work/study, internship, cooperative education, or another type of required internship or practicum that a sponsoring employer offers through agreements with a student’s school.For more information on the rules and regulations applicable to CPT, visit the Practical Training page on ICE.gov and contact your school to file applicable paperwork. 41 | 42 | **Academic Training \(AT**_**\):**_ _Academic Training \(AT\)_ is an off-campus authorization that allows J-1 students to work in jobs and internships that are directly related to their degree programs. AT can be used during or after the J-1 program and is employer and date specific. The application is approved through OIA \(not a government agency\) and takes about one week for approval. If you are an undergraduate or graduate exchange student on a J1 visa, you are eligible to receive practice training in the United States through Academic Training. 43 | 44 | **H1-B Work Eligibility**_:_ To gain work release under an H1-B visa, students must have a pre-existing employer/employee relationship and must qualify for specialty qualification. To see the requirements for a specialty occupation, [visit the USCIS website.](https://my.uscis.gov/exploremyoptions/h1_visas_for_temporary_workers) 45 | 46 | ## **Where can I find a job or internship while studying abroad in the US?** 47 | 48 | **CodePath.org**: CodePath.org is a nonprofit organization committed to increasing diversity in the tech industry. CodePath hosts monthly [industry events](https://hackmd.io/@morganrichardson/events_cal) and offers a [one-on-one mentoring program](https://codepath.chronus.com/) to help international students connect with seasoned professionals that can help them navigate their career in tech. 49 | 50 | **College Offices**: Universities have designated centers that help guide students through some of the earliest college and career decisions. Many universities have international offices that specifically support international students navigating the visa process. 51 | 52 | **LinkedIn**: LinkedIn is a valuable tool that human resource professionals use to recruit the next generation of top tech talent. Students can use LinkedIn to engage with HR recruiters. Once connected, a student can ask for informational interviews that allow students to learn more about international visa opportunities. 53 | 54 | **Professors**: Many college professors have connections to professionals in the tech industry that can advance student’s career goals. Students are encouraged to make their career goals known so that professors can support them. 55 | 56 | **Visa Aggregators:** There are a handful of websites that aggregate lists of companies that sponsor international workers. [myvisajobs.com](https://www.myvisajobs.com/) and [immihelp.com/h1b-visa-sponsors/](https://www.immihelp.com/h1b-visa-sponsors/) are two examples. 57 | 58 | ## **How can I find out if a company sponsors H1-B visas?** 59 | 60 | **H-1B Employer Data Hub:** The data hub provides an additional layer of transparency to the H-1B program by providing information on employers petitioning for H-1B workers. The hub allows the public to search for H-1B petitioners by fiscal year, [NAICS code](https://www.census.gov/eos/www/naics/), employer name, city, state, or ZIP code. Students can learn more about the data hub at [USCIS h-1b-data-hub](https://www.uscis.gov/h-1b-data-hub) 61 | 62 | **Company Websites:** Companies that sponsor visas typically disclose specific information on their website or in job descriptions. If the information is unavailable, students can reach out to the company’s Human Resource Manager to learn more. 63 | 64 | **College Networks:** Your college or university offers a valuable resource to students to learn more about H1-B visa companies. You can visit your career center or international student resource center to learn more. 65 | 66 | _**Students can find out more information about the visa process and employment opportunities at**_ [_**https://www.uscis.gov/**_](https://www.uscis.gov/) 67 | 68 | -------------------------------------------------------------------------------- /internship-and-job-search-strategy/early-internship-programs.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: Information on internship opportunities for first and second year students. 3 | --- 4 | 5 | # Early Internship Programs 6 | 7 | {% hint style="warning" %} 8 | This guide was written in 2019, and the links are out of date, but the programs mentioned below are still recommended! 9 | {% endhint %} 10 | 11 | Please note that this is certainly not an exhaustive list, and there are a number of additional companies that may not have first-year/sophomore specific programs, but that are first-year/sophomore-friendly. 12 | 13 | ### Opportunities 14 | 15 | #### Microsoft Explore \| _**Deadline:**_ Rolling 16 | 17 | [Microsoft Explore](https://careers.microsoft.com/students/us/en/usexploremicrosoftprogram) is a 12-week summer internship program specifically designed for college underclassmen \(freshmen and sophomores\) and offers a rotational experience that enables you to gain experience in our different software engineering roles. This program is designed to give you hands-on experience with various tool and programming languages in the field of software development, and encourage you to pursue degrees in computer science, computer engineering, or related technical disciplines. Your on-the-job learning will be augmented with mentoring, community building and networking opportunities. 18 | 19 | _**Qualifications:**_ 20 | 21 | Candidates must be **freshman or sophomore students enrolled in a bachelor’s degree program in the United States, Canada, or Mexico** with a demonstrated interest in majoring in computer science, computer engineering, software engineering or related technical major. Students must have completed an Introduction to Computer Science course \(or equivalent class\) as well as one semester of calculus \(or equivalent\) by the start of the program. Finalists will be selected on the basis of eligibility and demonstrated interest in the software industry. 22 | 23 | #### Google STEP internship \| **Application Open:** Fall, **Deadline:** End of October 24 | 25 | The [Google Step Internship](https://buildyourfuture.withgoogle.com/programs/step/) program is a 12-week developmental opportunity for first and second-year undergraduate students with a passion for technology—especially students from historically underrepresented groups including women, Native American, Black, Latino, Veteran and students with disabilities. Our unique internship offers the opportunity to work on a software project alongside other EP interns and full-time Googlers, and gives you the chance to bridge the gap between academic understanding and practical professional experience. 26 | 27 | _**Minimum qualifications:**_ 28 | 29 | * Must be a first-year or second-year undergraduate student currently pursuing a Bachelor’s degree in Computer Science or a related technical field at a university in North America. 30 | * Programming experience in one or more of the following languages: C, C++, Java, JavaScript or Python. 31 | * First-year students must have taken one college level Computer Science course by end of first semester. \(AP or IB Computer Science is acceptable\). 32 | * Students must be available for a full-time 12-week internship from May- August or June-September 33 | 34 | _**Preferred qualifications:**_ 35 | 36 | * Second-year students should have taken two Computer Science courses. 37 | * Authorization to work in the United States. 38 | * Returning to a Bachelor’s degree program with at least two years remaining in their academic program after completion of the Summer 2019 internship. 39 | 40 | #### Google Summer of Code \| **Applications Open:** annually in March 41 | 42 | Spend your summer break writing code and learning about open source development while earning a stipend with the [Google Summer of Code](https://summerofcode.withgoogle.com/)! Accepted students work with a mentor and become a part of the open source community. Many become lifetime open source developers! Google Summer of Code is open to post-secondary students, age 18 and older in most countries. 43 | 44 | _**Qualifications:**_ 45 | 46 | * You must be at least 18 years of age 47 | * You must currently be a full or part-time student \(or have been accepted for the fall term\) at an [accredited](https://developers.google.com/open-source/gsoc/faq#accredited) university as of the student acceptance date 48 | * You must be eligible to work in the country you will reside in during the program 49 | * You have not already been accepted as a Student in GSoC more than once 50 | * You must reside in a country that is not currently embargoed by the United States. See Program Rules for more information. 51 | 52 | #### Facebook University \| **Applications Open:** annually in September 21st, **Deadline:** annually ~December 1st 53 | 54 | [Facebook University](https://www.facebook.com/careers/FBUEngineering) is a hands-on, immersive internship program that enables students from underrepresented communities to get to know Facebook’s people, products and services. In just eight weeks, the program gives interns across engineering, analytics, product design, operations and global marketing solutions roles the opportunity to make a real impact and help redefine how the world connects. 55 | 56 | _**Qualifications:**_ 57 | 58 | * Current first year \(Class of 2022\) or second year \(Class of 2021\) college student studying at a four-year university \(or equivalent program for special cases\) in the U.S. 59 | * Must have authorization to work in the U.S. at the time of hire and for the duration of the internship \(June - August\) 60 | * Must be at least 18 years old by program start date 61 | * Demonstrated interest in science and technology 62 | * Available to work in Menlo Park, CA or Seattle, WA for the duration of the internship 63 | * Knowledge of at least one programming language \(ie: C/C++, JavaScript, Java, PHP, Ruby, Python, Lua, Objective C etc.\) 64 | 65 | _**How to Apply:**_ 66 | 67 | * The application for FBU for Engineers open in September and closes in December 68 | * Applicants will be asked to submit their resume, both their high school and college transcripts \(official or unofficial will suffice\), and complete a writing exercise. 69 | 70 | #### Twitter Academy \| **Deadline: Rolling** 71 | 72 | [Twitter Academy](https://careers.twitter.com/en/early-career.html) is a paid 12-week summer internship program designed for second-year students interested in gaining hands-on and real-life experience in the tech industry. This program is for students historically underrepresented in computer science \(black, Hispanic/Latinx and Native American\). 73 | 74 | #### Code2040 Fellows Program \| **Applications open:** September annually, **Deadline:** November annually 75 | 76 | The [Code2040 Fellows Program](http://www.code2040.org/fellows-program) builds bridges between top, college-level Black and Latinx computer science students who want to access the Innovation Economy and have been historically overlooked and companies who are in need of this talent. In the process, Fellows gain the network and experience they need to have careers in the sector and company partners learn how to operationalize diversity and inclusion with entry level candidates. 77 | 78 | Our Code2040 Fellows spend their summer in an intensive career accelerator between June and August. Fellows intern at a top-tech company and participate in a series of workshops designed to equip them with the tools and resources they need to navigate the tech industry and build an exciting career. 79 | 80 | And they won’t do this alone: Being a Fellow means building community with other Black and/or Latinx technologists, receiving support from mentors and managers, redefining the future and face of tech, and ensuring other technologists from their community have the opportunity to succeed in the innovation economy. 81 | 82 | _**Qualifications:**_ 83 | 84 | * Be an undergraduate or graduate student planning to return to school in the fall semester following the internship 85 | * Have experience coding 86 | * Attend a U.S. college or university 87 | * Self-identify as Black and/or Latinx 88 | * Be interested in advocating for racial equity in the tech industry 89 | 90 | ### Attribution 91 | 92 | This guide was adapted from [Wellesley College](https://www.wellesley.edu/careereducation/resources/technology-internships-first-years-and-sophomores). 93 | 94 | -------------------------------------------------------------------------------- /internship-and-job-search-strategy/finding-roles.md: -------------------------------------------------------------------------------- 1 | # Finding Internships and Roles 2 | 3 | This guide is focused on all of the best places online to find opportunities in software engineering. This can include both small and large companies, and many different types of roles. This also includes generic indexes and personalized matching systems. 4 | 5 | **Good search terms** 6 | 7 | When searching for jobs, check the following “search terms”: 8 | 9 | * “software engineering co-op” or “software engineering internship” 10 | * “software intern” or “software engineer intern” or “co-op software engineer” 11 | * “application developer” 12 | * “web developer” 13 | * “software engineer” 14 | 15 | ## Internships/Co-ops 16 | 17 | The following sites have listings for internships and co-ops: 18 | 19 | * [Glassdoor](https://www.glassdoor.com/Job/intern-co-op-software-developer-jobs-SRCH_KO0,31.htm) 20 | * [Google Jobs Listing](https://www.google.com/search?q=co-op&ibp=htl;jobs#fpstate=tldetail&htidocid=MDFPmwMQ9WPs50NaAAAAAA%3D%3D&htivrt=jobs) 21 | * [Paysa](https://www.paysa.com/jobs#!page=1&limit=10&sort=pay&personalized=false&title=Internship) 22 | * [Indeed](https://www.indeed.com/q-Software-Development-Coop-Intern-jobs.html) 23 | * [ZipRecruiter](https://www.ziprecruiter.com/Jobs/Software-Engineer-Co-Op) 24 | * [SimplyHired](https://www.simplyhired.com/search?q=Software+Engineering+Co+Op&l=) 25 | 26 | You can start by listing all the companies whose products you used or enjoyed, and then searching “software engineering intern” on the sites and sifting through those listings for companies or posts that sounds interesting. 27 | 28 | ## General Jobs 29 | 30 | General job listings for all types of roles: 31 | 32 | * [WhoIsHiring](https://whoishiring.io/) - Excellent meta index that gathers roles from around other sources online 33 | * [ZipRecruiter](https://www.ziprecruiter.com/) - Software co-ops, internships and full-time 34 | * [Authentic Jobs](https://authenticjobs.com/) - Authentic Jobs makes it simple to search full-time, part-time, remote jobs, internships, and more. 35 | * [StackOverflow Job Board](https://stackoverflow.com/jobs) - List of software roles from different companies hosted on Stack Overflow 36 | * [Github Jobs Board](https://jobs.github.com/) - List of software roles from different companies hosted on Github 37 | 38 | Other: 39 | 40 | * [Interviewing.io](https://interviewing.io/) - Get actionable interview feedback, and get fast-tracked at companies. 41 | * [Mintbean](https://www.mintbean.io/) - Enables students to demonstrate their coding skills and connect with tech companies through hackathons. 42 | * [Skillzilla](https://www.skillzilla.io/) - Helps developers create an in-depth candidate profile and connect with dozens of hiring partners. 43 | * [Triplebyte](https://triplebyte.com/a/XqmLNX4/d) - Provides a uniform coding assessment to match developers to job opportunities. 44 | * [Woo](https://woo.io/) - Discreetly explore software engineering opportunities, we’ll introduce you to the companies you liked. 45 | 46 | ## Startups 47 | 48 | * [Startup Jobs with Angelist](https://angel.co/jobs) - Excellent service for finding startups to work with 49 | * [Startup Jobs with ProductHunt](https://www.producthunt.com/jobs) - Great place for finding product teams that need to hire 50 | * [Startupers](https://www.startupers.com/) - Simple job listing site for startups 51 | * [YC Jobs](https://news.ycombinator.com/jobs) - Listing for roles from YC-backed startups 52 | 53 | ## Mobile 54 | 55 | * [Android Jobs](https://www.androidjobs.io/) - Jobs board specifically for Android engineer roles 56 | 57 | ## Remote-Work 58 | 59 | * [FlexJobs](https://www.flexjobs.com/) - Access hand-screened remote, part-time, freelance, and flexible jobs—quickly and easily 60 | * [WeWorkRemotely](https://weworkremotely.com/) - Remote-role specific job board 61 | * [WorkingNomads](https://www.workingnomads.co/jobs) - Remote-role specific job board 62 | 63 | ## Specific 64 | 65 | * [RubyNow Jobs](https://jobs.rubynow.com/) - Ruby and Rails specific job board 66 | 67 | -------------------------------------------------------------------------------- /internship-and-job-search-strategy/getting-into-top-tech-companies.md: -------------------------------------------------------------------------------- 1 | # Getting into Top Tech Companies 2 | 3 | {% embed url="https://youtu.be/2Sp51QwkHWE" %} 4 | Listen to Andy on getting into large tech companies 5 | {% endembed %} 6 | 7 | In this video, [Andy](https://www.youtube.com/channel/UCvqBjeE6H0OQKQxJL2Om3lg) discusses how to get into top tech companies like Google even with a lower GPA or if you are not in the schools most commonly targeted by their recruiters. 8 | 9 | This video content and the ideas therein was [produced entirely by Andy](https://www.youtube.com/watch?v=2Sp51QwkHWE). We have adapted this helpful guide in order to make this content accessible to a broader audience of students. 10 | 11 | ### Video Guide 12 | 13 | Many Computer Science students are attending schools that are not in the “traditional target list” for recruiters at top companies like Google, Apple, or Facebook. In addition, many students may think that without a top GPA, that they would have a very hard time getting a role at a top tech company. This guide is focused on providing specific tips and guidelines to help CS students find the role of their dreams. 14 | 15 | #### 1. Challenges 16 | 17 | * Challenging with a low GPA or non-target school to get your foot in the door. 18 | * Recruiters may not look past your GPA, and quickly skip by your resume or application. 19 | * This issue can be especially challenging if you are not from a target school such as CMU or MIT. 20 | * The more interviews you have, the more practice you get, and so even if unprepared, those from target schools often get more chances 21 | 22 | #### 2. Computer Science vs Software Engineering 23 | 24 | * There’s a huge delta between Computer Science education and actual technical interviewing for top roles 25 | * What’s been taught and what is being interviewed on create a big disparity leaving many students unprepared for interviews 26 | * This presents an opportunity though; if you have a low GPA and/or at a non-target school, you can still prep in-depth for tech interviews on your own time via online resources and focus your attention on getting good at the technical interviewing process and the associated coding interviews 27 | * This self-practice will allow you to compete with the students at any other university for top tech jobs once you get the interview 28 | 29 | #### 3. Guidelines and Tips 30 | 31 | 1. Do anything to get a “big name company” on your resume somewhere 32 | * Doesn’t have to be an internship, could be anything you do with a name brand company 33 | * For example, Freshman year Andy applied to become a “Microsoft Student Partner” at his school 34 | * He hosted a workshop once a month, and gave away swag and promoted Microsoft on campus 35 | * Having this on the resume, helps your resume get by certain early screening processes 36 | * This led to Andy getting an internship at Amazon his Junior summer, which unlocked interviews at other big tech companies 37 | 2. Grinding on Interview Coding Problems 38 | * Grinding on [LeetCode](https://leetcode.com/) and solving lots of problems there, but doing so the right way 39 | * “The Wrong Way” 40 | * Many students don’t study and solve problems in the right way 41 | * Students stare at the problem for a few mins, look at the solution and move on 42 | * By not implementing, you are just memorizing how to do that specific question 43 | * Instead, you need to focus on learning how to solve an entire “class” of problems 44 | * “The Right Way” 45 | * After you start a problem, if you are stuck, look at the solution and then continue to implement that solution 46 | * Make sure to review the solution, then try to complete the problem yourself again before moving on 47 | * Focus on understanding as you solve it, why you are doing what you are doing at each step 48 | 49 | ### In Summary 50 | 51 | 1. Any CS student can get roles at top tech companies regardless of GPA or school 52 | 2. Aim to have at least one internship before Senior year (Junior summer) 53 | 3. Try to get a top brand name company on your resume any way that you can, doesn’t have to be an internship 54 | 4. Instead of reading a solution to a single coding problem, make sure to implement each time, and focus on how to solve an entire class of problems 55 | 56 | ### How [CodePath.org](http://codepath.org/) Can Help 57 | 58 | [CodePath.org](https://codepath.org/) started as a technical training company for senior engineers that ran training and onboarding programs for the world’s top technology companies including Facebook, Google, Dropbox, Airbnb, and Netflix. Over 5 years, CodePath created 30+ courses and taught over 2,000 programmers. At the time, the founders’ singular focus was to create a better, faster way for engineers to learn new technologies. 59 | 60 | Through redesigning Facebook University, the founders learned that the programming courses they developed to teach professional engineers provided the missing curriculum and support to make college students more likely to persist and succeed in C.S. education. In 2017, the team behind our professional programs founded [CodePath.org](http://codepath.org/) to eliminate educational inequity in technical education starting with college C.S. education. 61 | 62 | If you are a student in college, sign up for [CodePath classes](http://codepath.org/classes) to join our network of student alumni, complete our practical courses, build out your portfolio, and ace your next interview. We also host virtual career fairs twice a year for students to help directly connect them to companies all across the United States. 63 | 64 | If you are curious how to learn more about the interview process at top tech companies, check out our [student’s guide to interviewing at top tech companies](../). We have many other resources made available through our career fair for CodePath alumni. 65 | -------------------------------------------------------------------------------- /internship-and-job-search-strategy/landing-software-internship.md: -------------------------------------------------------------------------------- 1 | # Landing a Software Internship 2 | 3 | This is a guide for college students looking for a software engineering internship for the summer or wondering what it’s like to look for one. 4 | 5 | You can start by checking out our [guide to your internship search here](https://medium.com/@seaon/3-step-guide-to-nail-your-internship-search-82ed58f7f6a). This guide here dives deeper on some of those points and provides further advice. 6 | 7 | {% hint style="info" %} 8 | This post was originally adapted from [this post](https://medium.freecodecamp.org/landing-a-software-engineering-internship-66e0d541539a) by Tatiana Doyle. 9 | {% endhint %} 10 | 11 | ## Common Mistakes 12 | 13 | Common mistakes to be mindful of when first searching for an internship or co-op: 14 | 15 | * Not starting until too late 16 | * Not applying to enough companies 17 | * Not preparing for technical interviews 18 | * Not doing any side projects 19 | * Not utilizing your network or trying to expand it 20 | 21 | ## Key Takeaways 22 | 23 | Conversely, here are the most important takeaways for how to get an internship: 24 | 25 | 1. Start the search early and apply to as many places as possible 26 | 2. Connections are your most important tool 27 | 3. You must prepare for technical interviews 28 | 4. Side projects transform your resume from good to great 29 | 30 | ### 1. Start the search early 31 | 32 | You can start by listing all the companies whose products you used or enjoyed, and then searching “software engineering intern” on the sites and sifting through those listings for companies or posts that sounds interesting. The following sites have listings for internships and co-ops: 33 | 34 | * [Glassdoor](https://www.glassdoor.com/Job/intern-co-op-software-developer-jobs-SRCH_KO0,31.htm) 35 | * [Google Jobs Listing](https://www.google.com/search?q=co-op&ibp=htl;jobs#fpstate=tldetail&htidocid=MDFPmwMQ9WPs50NaAAAAAA%3D%3D&htivrt=jobs) 36 | * [Paysa](https://www.paysa.com/jobs#!page=1&limit=10&sort=pay&personalized=false&title=Internship) 37 | * [Indeed](https://www.indeed.com/q-Software-Development-Coop-Intern-jobs.html) 38 | * [ZipRecruiter](https://www.ziprecruiter.com/Jobs/Software-Engineer-Co-Op) 39 | * [SimplyHired](https://www.simplyhired.com/search?q=Software+Engineering+Co+Op&l=) 40 | 41 | For summer internships, the recruiting season kicks off in August/September. I would recommend starting in August/early September, or October at the latest. 42 | 43 | A lot of larger companies finish their recruiting by November/December. If you’re reaching out to friends it’s great to get an early start, for example, in late August or early September. Even if you start in Spring, you can still apply all the strategies below and have a great chance of getting an internship. 44 | 45 | {% hint style="warning" %} 46 | The application funnel can often be more challenging than you might initially expect. Many students report applying to _100 different companies for summer software engineering internship positions_. Of those 100, it's not uncommon for students to report _getting 8-10 phone interviews_, and then for half of those \(4-5\) to advance to an on-site. You may not hear back from half of the companies you apply to. The most important thing is to not give up and to apply to enough places, stick with it, and work to get your pick of a few good options for your internship. 47 | {% endhint %} 48 | 49 | ### 2. Connections are your most important tool 50 | 51 | One effective way to speed up the internship search is by leveraging connections you already have, such as: 52 | 53 | 1. Alumni who work at the company you want to work at 54 | 2. Friends/classmates who interned at that company 55 | 3. Professors 56 | 4. Friends of friends who work at that company 57 | 58 | First, make sure you have an updated [LinkedIn profile](https://linkedin.com/). You want to fill out your LinkedIn profile with as much information as you can – treat it as a second resume. 59 | 60 | **Career Fair** 61 | 62 | Besides reaching out to connections or potential connections, make sure you check out your school’s career fair \(if available\). Those companies are already there because they want to recruit students from your school. 63 | 64 | **Existing Network** 65 | 66 | For any company you want to work at as an intern, you can leverage LinkedIn and review the steps below for identifying existing contacts: 67 | 68 | * Search for each company you want to work at, and see if you have any 1st or 2nd degree connections there 69 | * See if any other classmates have previously interned at the company and have that listed on their LinkedIn 70 | 71 | If you find a first or second degree connection that you either know or that is in your extended network, reach out to them via LinkedIn or FB Messenger and ask if they have 15 minutes for a phone call to chat. It’s important that you limit the ask to 15 minutes — it’s a small ask and doesn’t feel like a big favor for the person you’re calling. 72 | 73 | Often these connections can often refer you to a recruiter at that company or otherwise provide valuable advice. Reaching out to people who work full time at these companies in your network is also valuable. 74 | 75 | **Cold Outreach** 76 | 77 | Another great way to get an internship and differentiate yourself is to reach out to people on LinkedIn that you don’t know at all. 78 | 79 | 1. Go to the LinkedIn page of a company you are interested in working at, and click on the link to see all employees of that company on LinkedIn. ![](https://s3-ap-northeast-1.amazonaws.com/codepath-hackmd/uploads/upload_0e8ac5353214c120ac9b666fd6902ec4.png) 80 | 2. Scroll down to the “Schools” filter and type in your university ![](https://s3-ap-northeast-1.amazonaws.com/codepath-hackmd/uploads/upload_46ce9c10e339f26f7e8a8fc19617ccf2.png) 81 | * People who you have something in common with are much more likely to be willing to take time out of their day to talk with you or help you. 82 | * That said, if you don’t see anyone in common, reach out to a few people anyways! 83 | 3. Hit “Connect” and then “Add a note” and ask them to chat on the phone. A typical note might look something like this: ![](https://s3-ap-northeast-1.amazonaws.com/codepath-hackmd/uploads/upload_911900b92f0f405540c8c664f5569220.png) 84 | * Explain both why you are contacting them and the “ask” — a 15 minute phone call — in just a few sentences. Keep it short and friendly. 85 | 4. Wait for them to respond! Many people may never get back to you, and some will respond immediately or within days. You might reach out to around 5 people a week, since a decent amount of people simply don’t check or use LinkedIn. 86 | 87 | **Informational Calls** 88 | 89 | If you do get a chance to jump on a call, here’s a couple of the questions you might ask during these phone calls: 90 | 91 | * What is the culture like at X company? 92 | * Do people hang out outside of work? 93 | * What is the culture like there? 94 | * What do you enjoy about working at X company? 95 | * Is it easy to switch teams and try new things? 96 | * What is your team working on? 97 | * How did you end up at X company? What made you choose this company over other companies? 98 | * How did you get into your particular area of Computer Science \(ex. machine learning, databases, etc.\) and what are some resources for learning more about it? 99 | * What are internships like at your company? 100 | 101 | Questions like these can be a great way to get a better understanding of what it’s like to work at the company. Informational interviews can be great even if you’re not looking for a job. They can help you learn more about the industry. 102 | 103 | But if you’re looking for an internship, there’s one question that is especially helpful: How can I stand out in the intern application process for X company? This question is great because the person you’re on the phone with will give you advice on how to get an internship there, and potentially offer to connect you with a recruiter or even refer you to their company. 104 | 105 | ### 3. You must prepare for technical interviews 106 | 107 | As part of most internships and software roles, you’ll often be asked three types of questions during the interview process: 108 | 109 | * Technical coding interviews \(data structures and algorithms\) 110 | * Past experience interviews \(“what have you done”\) 111 | * Domain-specific interviews \(“what do you know”\) 112 | 113 | Check out this [internship interview guide here](../technical-interviewing/technical-interviewing-guide.md) for a look at all the details on how to prepare and what to expect. To learn more about the coding interviews specifically, check out our [guide on studying for coding interviews](../technical-interviewing/studying-for-tech-interviews/). 114 | 115 | ### 4. Side projects transform your resume from good to great 116 | 117 | Side projects outside of school class work of all types can be an excellent way to differentiate and deepen your experience and signal to companies that you will be a good fit for an internship. Projects might include: 118 | 119 | * Taking CodePath courses where you get to build hands-on projects. 120 | * Building a web application that you can share around and link as a project you built. Not just a site but something storing data that people can play around with. 121 | * Developing a functional iOS or Android app around an idea and executing it all the way to publishing on the App Store or Play Store. Bonus points if you get some people using it. 122 | * Participating in a hackathon and building a prototype of any web or mobile project with a group 123 | * If your university supports this, getting involved with research projects can be great too. In particular, anything involving: AI / Machine Learning, Ubiquitous Computing, Data Science / Visualization, Graphics, etc. Whatever you are drawn to learn more about. 124 | * [Contributing in small ways to open-source online](../software-engineering/your-questions-answered/#how-can-we-contribute-to-open-source-software-and-how-do-we-approach-or-get-started) to build up your real-world skills and learn from top engineers in the industry. 125 | 126 | For inspiration, check [here](https://github.com/karan/Projects) and [here](http://www.dreamincode.net/forums/topic/78802-martyr2s-mega-project-ideas-list/) for lists of side project ideas to get you started. We recommend doing a side project that you’re passionate about, rather than one you’re just using to build your resume. It will be a lot more enjoyable and you’ll learn a lot more. 127 | 128 | You can pick any of these ways or many others to start building your out of class project portfolio. Make sure that you list and describe the most notable of your projects on your resume and your LinkedIn, and put the projects onto [Github](https://github.com/) with a clear README describing the project where feasible. 129 | 130 | ## Attribution 131 | 132 | This post was adapted from [FreeCodeCamp](https://medium.freecodecamp.org/landing-a-software-engineering-internship-66e0d541539a) by Tatiana Doyle 133 | 134 | -------------------------------------------------------------------------------- /internship-and-job-search-strategy/technical-work-while-in-college.md: -------------------------------------------------------------------------------- 1 | # Technical Work while in College 2 | 3 | There are at least a few potential pathways to gaining professional experience and income through technical work while in school: 4 | 5 | 1. **Traditional Technical Internships.** This is perhaps the most traditional approach, and involves getting a paid summer internship each summer in a technical role. You should aim to have at least one \(if not two\) technical internships while in school. 6 | 2. **Independent Freelancing**. This is a setup which involves getting paid hourly or on fixed contracts to develop code for a client \(person or company\). Usually this happens either via online freelancing platforms or through working directly with companies. 7 | 3. **Contracting for a Startup.** Find a small \(local?\) software startup where you connect with their mission and reach out to see if you can help in paid part-time roles 8 | 4. **Start your own Small Side Business.** Developing a small business that generates revenue every month offering a service, product, content, etc to a group of people willing to spend money. 9 | 10 | ## 1. Traditional Technical Internships 11 | 12 | Paid internships. This is perhaps the most obvious one, and involves getting a paid summer internship every summer in a technical field. This one you can’t do every semester but it’s a great way to get paid and learn more about software at the same time. 13 | 14 | Check out our [guide to the internship search](https://medium.com/@seaon/3-step-guide-to-nail-your-internship-search-82ed58f7f6a) as well as our [technical interviewing guide](../technical-interviewing/technical-interviewing-guide.md) for more details on how to start your search for this summer. 15 | 16 | ## 2. Independent Freelancing 17 | 18 | One approach to making money which I did was called freelancing. This is where you kinda get thrown off the deep end trying to work on projects on places like [upwork](https://upwork.com/), [venturestorm](http://www.venturestorm.com/), [gigster](https://gigster.com/), rentacoder, [freelancer.com](http://freelancer.com/) or through asking people directly \(on twitter, etc\) and getting referrals. Learn more about freelancing through the [Student’s Guide to Freelancing](https://www.savethestudent.org/make-money/big-guide-to-freelancing.html). 19 | 20 | This includes finding jobs ranging from website development, mobile development, to testing software manually. For example, you can check [Upwork](https://hackmd.io/@nesquena/rkyb7nQf4?type=view) for a wide range of jobs including [Quality Control Roles](https://www.upwork.com/job/Quality-Control-Tester-for-eLearning-applications_~013f41871b2e75d921/) or [creating a simple form for a business](https://www.upwork.com/job/Help-needed-creating-Service-Verification-Form-with-auto-generated-email_~0173679e3ce32bdb6a/). There are thousands of different jobs available. 21 | 22 | ## 3. Contracting for a Startup 23 | 24 | This one can require the most upfront time to get going and it can be challenging, but rewarding. This involves working part-time and remotely for a small startup as a junior engineer. 25 | 26 | 1. Find a small startup where you connect with their mission, probably through [AngelList](https://angel.co/) or [ProductHunt](https://www.producthunt.com/). 27 | 2. Look ones that catch your eye up on [LinkedIn](https://linkedin.com/). Try to find ones with fewer than 30 people. 28 | 3. Identify a founder, engineer, product manager, etc there on LinkedIn. 29 | 4. Send a direct message to them explaining that you are a student, stumbled upon their business, really liked what they are doing and you were hoping to be able to help them out with small tasks. 30 | 5. You can suggest you can help with front-end web development, simple features on mobile, manual testing, technical support, writing documentation, whatever they need. 31 | 32 | If you reach out to enough places, this can potentially land you a part time contracting role helping support them and learn a lot in the process. Often this will be in a paid contracting role. 33 | 34 | ## 4. Build a Small Side Business 35 | 36 | This one is in some ways the most challenging. You can build a side business to generate your own income. This would involve figuring out any viable business which involves providing something \(your time, a product, content, etc\) in return for money. Could include a web site, an app or anything which brings in small amounts of dollars. 37 | 38 | Here are some links to get you thinking about what starting a business involves: 39 | 40 | * [9 Tips for Starting Your Business in College](https://www.entrepreneur.com/article/295932) 41 | * [For a young developer, which is the best way to earn money - building own desktop apps, web apps or mobile apps?](https://www.quora.com/For-a-young-developer-which-is-the-best-way-to-earn-money-building-own-desktop-apps-web-apps-or-mobile-apps) 42 | * [9 Business Ideas for College Students](https://getunbound.org/blog/business-ideas-for-college-students) 43 | 44 | -------------------------------------------------------------------------------- /networking-and-communication/the-art-of-the-follow-up.md: -------------------------------------------------------------------------------- 1 | # The Art of the Follow-up 2 | 3 | As a student, the best way to get access to internships is to try as many strategies as you can to sign up for engineering events and find ways to meet new engineers and recruiters; whether this be at events, company tours, career fairs, hackathons, conferences, meetups, open-source or otherwise. 4 | 5 | Whenever you have an in-person meeting or chat with an engineer or recruiter, you should develop a reliable habit to **get their contact information and send them a follow-up afterwards**. This guide is dedicated to providing specific suggestions on how to follow-up, build your network and expand your chances of finding a great internship. 6 | 7 | ### Three Main Takeaways 8 | 9 | The main things to remember are: 10 | 11 | 1. **Whenever meeting an engineer or recruiter, always ask for their contact information** 12 | 2. **Immediately following the meeting, connect to them on LinkedIn** 13 | 3. **After your meeting, within 1-3 days, send them a personalized follow-up email** 14 | 15 | Build this habit, do this as often as you possibly can with as many engineers or recruiters as you meet. 16 | 17 | ### Building out your Network 18 | 19 | #### Meet More Engineers and Recruiters 20 | 21 | Although many students don’t start thinking about developing a personal brand and networking in the technology industry until later in their career, it’s good to get started as early as you can. The more people you meet, the more people might be able to help you when you are looking for your next internship or job. Here are a few ways to get started: 22 | 23 | * Attend career fairs or career workshops on campus. Through CodePath, sign up to participate in virtual career fairs which will connect you directly to companies. 24 | * If you can, consider attending nearby hackathons. Hackathons are a great way to meet and talk to people from various companies. You can even try to meet one of the event organizers. 25 | * If you can, find a way to attend software conferences or events nearby. You can often find events on [meetup.com](http://meetup.com/) or even on your campus. 26 | * Join online Discord or Slack communities built to create belonging for various groups in tech. 27 | * Take more [CodePath classes](https://codepath.org/classes), as many as you can 😄 and meet mentors and students through these programs and build connections. Even become a student leader, and teach other students to push forward your mastery. 28 | 29 | Be mindful that no one achieves all of these things at once, and this is **not a checklist to complete**. You may find you dislike hackathons, or dislike certain clubs or meetups. This is entirely normal, explore around and find what works for you. 30 | 31 | #### Build your digital presence and get engineering referrals 32 | 33 | Anything that you can do to **build connections to engineers working in industry is highly valuable**.You can build connections to engineers in real-life through meetups, conferences, events, etc. But you can also build connections, often more efficiently, by developing your digital presence online including: 34 | 35 | * Start a blog (or [post on medium](https://medium.com/)) where you share concepts and journal concepts you are learning. Cover anything you find interesting as you learn. Later when you look back, you’ll be glad you did. 36 | * Create a Twitter account, configure your profile and start following engineers. Start retweeting and interacting with other engineers online. 37 | * [Contribute in small ways to open-source online](../software-engineering/your-questions-answered/#how-can-we-contribute-to-open-source-software-and-how-do-we-approach-or-get-started) to build up your real-world skills and learn from engineers in the industry. 38 | 39 | Remember that connections you develop with engineers will often **directly lead to internships and opportunities over time**. One secret you may not know is that an easy way to get noticed by a recruiter is to **have an engineer at their company refer you directly or message them.** 40 | 41 | If you can **get an engineer you met to help connect you to a recruiter at their company**, the likelihood of getting an interview goes up exponentially. 42 | 43 | ### “Manage Up” by following up! 44 | 45 | As you are applying strategies to build your network by attending events, conferences, career fairs, meetups, etc, you need to develop a habit of “managing up”. 46 | 47 | [Managing up](https://slate.com/human-interest/2018/08/managing-up-is-an-art-and-if-you-learn-it-you-can-work-harmoniously-with-any-boss.html) is a mindset defined as taking success into your own hands. This involves effectively communicating in such a way that makes it as easy as possible for everyone around you to succeed, including engineering recruiters, more senior engineers, or your manager/boss! 48 | 49 | This practice of “[Managing Up](https://slate.com/human-interest/2018/08/managing-up-is-an-art-and-if-you-learn-it-you-can-work-harmoniously-with-any-boss.html)” is a **critical set of skills** that often differentiates the most successful professionals, and contributes significantly to your career success. 50 | 51 | This even applies even before you get the job. **Always make it as easy as possible for a recruiter or engineer to connect with you for another meeting or get you in for an interview**. Do part of their job for them. This means after talking (even briefly) with any engineering recruiter or engineer, do the following: 52 | 53 | 1. Assume they want to connect again in the future and potentially mentor you or bring you in for an interview at their company. Assume this until you have overwhelming evidence to the contrary. 54 | 2. After chatting with them, say that it was great to meet them, express clear interest in learning more 55 | 3. Ask them: “Can I get your email address so I can follow-up with you later if I have questions?” 56 | 4. Connect with them on LinkedIn after with a custom message referencing the chat 57 | 5. Within a few days, follow-up with an email that includes a personalized write-up, and (where appropriate) attaches your resume and a link to your LinkedIn. Ask them if you can schedule a follow-up to learn more. 58 | 6. (Bonus) If this is a job you really want, you can send a follow-up a few days later through LinkedIn as well with a personalized note via LinkedIn messages. 59 | 60 | If they don’t specifically mention a role to you, you should still try to get their contact information and follow-up with them. Assume once they learn more about you, they will want you to work at the company or help you in the future. Vast majority of students dont have the diligence to follow-up, so this is a **great way to differentiate yourself**. 61 | 62 | **Follow-up and build your connections**. Every connection is a good connection even if it doesn’t work out, this is a small world, and every touch point is a good thing. You never know when that might come in handy or you might bump into this person in the future. 63 | -------------------------------------------------------------------------------- /skills-and-knowledge-tree.md: -------------------------------------------------------------------------------- 1 | # 🌱 Skills and Knowledge Tree 2 | 3 | This guide summarizes the knowledge and skills that you will need to develop along your career as a software engineer. 4 | 5 | {% hint style="success" %} 6 | **Project-based learning** - Often you’ll find that learning is best done in service to a particular goal, outcome or a particular project you are working on. There’s an enormous amount to learn, and it’s really easy to get overwhelmed. Prefer “just in time” learning over “just in case” learning. Try your best to focus on learning what is relevant to you at any given moment. 7 | {% endhint %} 8 | 9 | ⚠️ Note that **no one is an expert at everything**, this is not a checklist but rather a survey of practical knowledge and relevant skills you will develop as your career progresses. Remember that it’s okay that you don’t know everything! 10 | 11 | ### Overview 12 | 13 | The knowledge and skills you need as a software engineer break down into several major categories: 14 | 15 | 1. [**Team Collaboration and Cooperation**](skills-and-knowledge-tree.md#1-Team-Collaboration-and-Cooperation) - How to work well with a team, be a good team member, coordinate your work with other engineers and resolve conflicts. 16 | 2. [**Data Structures and Algorithms**](skills-and-knowledge-tree.md#2-Data-Structures-and-Algorithms) - How to store and organize data in different ways and then solve many different types of problems using code. 17 | 3. [**Technical Interviewing**](skills-and-knowledge-tree.md#3-Technical-Interviewing) - How communicate clearly as you think through solving problems, asking the right questions, analyzing efficiency, and verifying solutions. 18 | 4. [**Software Design Patterns**](skills-and-knowledge-tree.md#4-Software-Design-Patterns) - How to structure and design code in order to make sure the code is high quality, well-organized, easy to understand and easy to change over time. 19 | 5. [**System Architectures**](skills-and-knowledge-tree.md#5-System-Architecture) - How different software systems all fit together and how to design them in order to be reliable, maintainable and efficient. 20 | 6. [**Development Workflows**](skills-and-knowledge-tree.md#6-Development-Workflows) - How to do specific processes common to writing software such as debugging when things go wrong, searching for possible solutions online, working with Git or other version control and more. 21 | 7. [**Stack-Specific Knowledge**](skills-and-knowledge-tree.md#7-Stack-Specific-Knowledge) - Knowledge of how to build things using particular technology and languages. For example, building iOS or Android apps, building web servers with Ruby on Rails, or writing Javascript. 22 | 23 | ### 1. Team Collaboration and Cooperation 24 | 25 | Team collaboration and cooperation involves developing the skills to work well with as part of a team, be a good team member to others, coordinate your work with other engineers and resolve conflicts as they come up. This includes: 26 | 27 | * How to write simple technical documentation about projects you build \(READMEs\) 28 | * How to comment your code so others can read and understand 29 | * How to give constructive criticism when reviewing a peer’s code 30 | * Communicating your progress clearly to your team or manager 31 | * Drawing and whiteboarding when designing to communicate your ideas 32 | * Reporting issues and bugs clearly in a way other engineers appreciate 33 | * [Github Flow](https://guides.github.com/introduction/flow/) - Branches, pull requests and understanding the process to get your code reviewed and merged. 34 | 35 | In some ways, this area of effective communication, collaboration and cooperation with others is the most important part to success as a software engineer. Learn more by checking out this [blog post about the crucial role of empathy in being a software engineer](https://codingwithempathy.com/2016/05/03/empathy-an-essential-skill-in-software-development/). 36 | 37 | ### 2. Data Structures and Algorithms 38 | 39 | Data structures are just different ways or organizing and storing data within software. Examples are: Array, Linked Lists, Stack, Queues, Trees, Graphs, Sets, Hash Tables. 40 | 41 | Algorithms are simply a particular approach to solving a particular problem. Algorithms involve writing code which often accesses data structures and then performs operations and calculations on the data. 42 | 43 | Used together, you can select one or more data structures to store your data, and then use particular algorithms to achieve a particular goal or solution within your software programs. 44 | 45 | ℹ️ To learn more about data structures and algorithms, check out [this guide on studying them](technical-interviewing/studying-for-tech-interviews/). 46 | 47 | ### 3. Technical Interviewing 48 | 49 | In addition to understanding how to solve problems using data structures and algorithms, you will also often apply these skills specifically in coding interviews when applying for internships or full-time software positions. 50 | 51 | Technical interviewing is a skill of its own which builds on top of your knowledge of data structures and algorithms. There are several aspects to technical interviewing including the steps of a coding interview, what questions to ask your interviewer, and how to test that your solution is correct. 52 | 53 | ℹ️ To learn more about technical interviewing skills and strategies, check out our [technical interviewing guide](technical-interviewing/technical-interviewing-guide.md). 54 | 55 | ### 4. Software Design Patterns 56 | 57 | Software design patterns and principles are ways of organizing and designing code in order to make sure the code is high quality, well-organized, easy to understand and easy to change over time. 58 | 59 | These patterns are not specific libraries that you can plug into your application. These are, rather, guidelines on how to tackle certain problems in certain situations. 60 | 61 | ℹ️ To learn more about software design patterns, check out our [software design patterns and principles guide](software-engineering/software-design-patterns.md). 62 | 63 | ### 5. System Architecture 64 | 65 | System architecture is centered around how specific software systems and protocols work, the components they contain and how that all fits together. Of course, there are many systems and elements with different architectures. For example: 66 | 67 | * How computer networking and the web works 68 | * How to design the APIs that allow data to go between applications 69 | * How to design relational databases that store your app’s data 70 | * How to “cache” data to make your app faster 71 | * How to build parallel or concurrent systems 72 | 73 | ℹ️ To learn more about how to architect and design different types of software systems, check out our [software architecture guide](software-engineering/exploring-system-architecture.md). 74 | 75 | ### 6. Development Workflows 76 | 77 | Development workflows involve specific processes common to writing software such as debugging when things go wrong, searching for possible solutions online, working with Git or other version control and more. 78 | 79 | * **Version Control** - Collaborating on software with version control such as Git and Github 80 | * **Debugging and Investigation** - How to systematically debug and investigate issues when software isn’t working correctly 81 | * **Google-Fu** - How to search Google, Github and Stack Overflow to find possible solutions when something isn’t working as expected. 82 | * **Library Evaluation** - How to find and evaluate third-party libraries that can be used to save you time and energy within your software system. 83 | 84 | ### 7. Stack-Specific Knowledge 85 | 86 | Stack-specific knowledge is specialized knowledge of how to build things using a particular set of technology and languages. For example, building iOS or Android apps, building web servers with Ruby on Rails, or writing Javascript. 87 | 88 | * Building iOS or Android Apps 89 | * Building Web Apps with Ruby on Rails 90 | * [Designing Java Interfaces](https://www.geeksforgeeks.org/interfaces-in-java/) - How to design interfaces and abstract classes in Java 91 | * [Closures in Javascript](https://www.codingame.com/playgrounds/6516/closures-in-javascript-for-beginners) - How to implement closures in Javascript 92 | * [Automated testing](https://www.smartsheet.com/automation-testing-software) - How to do automated testing to verify your software is working correctly often using [tools like Selenium](https://www.valuebound.com/resources/blog/selenium-a-beginner-guide-to-automation-testing-tool). 93 | * [System administration](https://dzone.com/articles/what-is-devops-the-beginners-guide-from-logzio) \(DevOps\) - Critical skills associated with setting up servers to properly run software. 94 | * [UNIX and Command-line](http://matt.might.net/articles/basic-unix/) - Using the UNIX command line comfortably and related tools \(`grep`/`cat`/`awk`/`curl`\) 95 | 96 | ℹ️ To review the common tech stacks and career tracks in software engineering, check out our [software roles guide](software-engineering/software-career-tracks.md). 97 | 98 | -------------------------------------------------------------------------------- /software-engineering/contributing-to-open-source.md: -------------------------------------------------------------------------------- 1 | # Contributing to Open-source 2 | 3 | **Open-source projects are free openly viewable code projects that anyone can use or contribute to from anywhere in the world.** At the heart of most modern software development is the community of open-source projects. The practice of building and maintaining open source software works because people from all over the world, of all levels, abilities, and backgrounds, form communities to support the projects they care about. 4 | 5 | Most open-source projects don’t have dedicated staff to support them. Instead, developers and users from around the world work on them, often in their spare time. For many programmers, though, the thought of contributing to open source projects seems too difficult and time-consuming. They think that you have to be a programming genius blessed with unlimited free time to make a meaningful contribution. 6 | 7 | That’s simply not true. Successful open-source projects thrive on a wide variety of contributions from people with all levels of coding skills and commitment. Any time someone fixes a compiler warning, closes a bug, or adds to the documentation, progress is made. Put a lot of those contributions together and great things can happen. 8 | 9 | ### Why open-source? 10 | 11 | The most valuable thing you can do to get jobs, besides paid internships or software work, is to fix bugs on/add features to popular open-source projects on GitHub! It can be more valuable than practicing LeetCode problems or projects with no users/customers. 12 | 13 | * A chance to put code into projects used by thousands or tens of thousands of people or more 14 | * Chance to get code reviews and mentorship from talented senior engineers 15 | * Experience fixing bugs in code you didn't write and working in larger codebases 16 | * An opportunity to write comments and documentation appreciated by many other developers 17 | 18 | Very few junior developers have made pull requests to popular open-source projects and gotten them merged into a master branch. If you can do this, you'll set yourself apart in a really powerful way. Open-source work is highly practical, impressive, and allows your code to have real users/customers. 19 | 20 | ### Building your Skills 21 | 22 | As part of open-source, think of this as an opportunity to build up your own skills by learning from people managing widely used code to push yourself to become a more thoughtful and well-rounded engineer. Including skills such as: 23 | 24 | * Improve your code quality and adhering to code styles 25 | * Adding proper unit or integration testing 26 | * Catching weird edge cases that must be addressed in production 27 | * Using efficient approaches that work in production 28 | 29 | By submitting pull requests to these projects, you're getting free training to write better code. Fix your code to match their code reviews, then resubmit it. Keep repeating this till they're happy. **When they finally merge your code to master, that means seasoned engineers at top companies now think your code is good enough for use by thousands/millions of customers!** 30 | 31 | **Celebrate and advertise this work** on LinkedIn, your resume, GitHub, and in job interviews. It will impress engineering teams and help you get jobs. It's incredibly powerful to be able to say: "I fixed a bug on this popular GitHub project and got my code merged to master". 32 | 33 | ### Great Resources 34 | 35 | Here are a few great resources for getting started in open-source as a beginner: 36 | 37 | * [The Beginner’s Guide to Contributing to Open Source Projects](https://blog.newrelic.com/engineering/open-source_gettingstarted/) 38 | * [Beginner’s Guide to Contributing to Open-Source](https://www.natashatherobot.com/beginners-contributing-to-open-source/) 39 | * [How to contribute to open-source](https://opensource.guide/how-to-contribute/) 40 | * [How to make your first open-source contribution in just 5 minutes](https://medium.freecodecamp.org/how-to-make-your-first-open-source-contribution-in-just-5-minutes-aaad1fc59c9a) 41 | * [How Junior Developers Can Contribute to Open Source Projects](https://rubygarage.org/blog/how-contribute-to-open-source-projects) 42 | * [First Timers Only](https://www.firsttimersonly.com/) 43 | * [Getting Started in Open-Source](https://www.hackerearth.com/getstarted-opensource/) 44 | * [Getting Started: Contributing to Open-Source Software](https://medium.com/@emctackett/getting-started-contributing-to-open-source-software-267c3cb3e24b) 45 | 46 | ### Projects to Look At 47 | 48 | * [Start by looking through this set of beginner-friendly projects](https://github.com/MunGell/awesome-for-beginners) 49 | * \(Javascript\) [Check out these special marked beginner-friendly issues on Yarn](https://github.com/yarnpkg/yarn/labels/good%20first%20issue) 50 | * \(JavaScript\) [Leaflet](https://github.com/Leaflet/Leaflet), a "library for mobile-friendly interactive maps." See its [closed issues](https://github.com/Leaflet/Leaflet/issues?q=label%3A%22good+first+issue%22+is%3Aclosed) that are "good first issues" for beginners. Or see its [open issues](https://github.com/Leaflet/Leaflet/labels/good%20first%20issue). Try to fix one of its bugs or add a new feature. 51 | 52 | -------------------------------------------------------------------------------- /software-engineering/exploring-system-architecture.md: -------------------------------------------------------------------------------- 1 | # Exploring System Architectures 2 | 3 | System architecture is centered around how specific software systems and protocols work, the components they contain and how that all fits together. Of course, there are many systems and elements with different architectures. 4 | 5 | The following provides a few examples of systems and architectures you are likely to encounter over time: 6 | 7 | * [How Computer Networking and the Web Works](https://hackingpress.com/computer-networking-basics/) - Understanding HTTP, DNS, TCP/IP, IP4, etc. Here’s a [related free online course](https://www.udacity.com/course/networking-for-web-developers--ud256) which goes through the elements of networking via video. 8 | * [Architecture and Design of REST APIs](https://hackernoon.com/restful-api-design-step-by-step-guide-2f2c9f9fcdbf) - REST APIs are the servers that provide data \(usually in JSON or XML\) to web or mobile apps. 9 | * [Architecting and Designing Relational Database Schemas](https://wsvincent.com/database-design-tutorial-for-beginners/) - How to design the database schemas and models that hold all of your data for a system and designing the relationships between them. Check out [this course which dives in deep to database design and modeling](https://www.udemy.com/the-complete-database-modeling-and-design-beginners-tutorial/). 10 | * [Architecture and Layers of Caching within Applications](https://hackernoon.com/client-network-server-and-application-caching-on-the-web-2fcdcd856886) - How to “cache” \(or store\) data in multiple different places in order to make your systems faster and more reliable. Also check out these articles: [one](https://codeahoy.com/2017/08/11/caching-strategies-and-how-to-choose-the-right-one/), [two](https://www.cloudways.com/blog/beginners-guide-to-web-cache-basics/), [three](https://www.digitalocean.com/community/tutorials/web-caching-basics-terminology-http-headers-and-caching-strategies) for additional resources. 11 | * [Archiecture of Push vs Pull System Communication](https://medium.com/@_JeffPoole/thoughts-on-push-vs-pull-architectures-666f1eab20c2) - How to architect the communication between two separate parts of a larger system that need to notify each other as things happen. 12 | * [Architecture of Concurrent or Parallel Programming](https://sookocheff.com/post/concurrency/concurrency-a-primer/) - How to design components of systems where multiple lines of code execute simultaneously. Check out [this](https://www.toptal.com/software/introduction-to-concurrent-programming) or [this article](https://medium.com/@bfortuner/python-multithreading-vs-multiprocessing-73072ce5600b) for additional background. 13 | * [Architecture of Data Sharding or Partitioning](https://medium.com/@jeeyoungk/how-sharding-works-b4dec46b3f6) - How to store large datasets for your applications in a particular way that makes your systems more scalable. 14 | 15 | -------------------------------------------------------------------------------- /software-engineering/on-becoming-a-senior-engineer.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: >- 3 | In this section, we look at what an engineer "Burak Karakan" thinks are the 4 | key attributes of a senior engineer, as well as what doesn't define one. 5 | --- 6 | 7 | # On Becoming a Senior Engineer 8 | 9 | 📚 **Source:** [https://burakkarakan.com/blog/on-seniority-in-software-engineering/](https://burakkarakan.com/blog/on-seniority-in-software-engineering/) 10 | 11 | ### On what doesn't make a senior engineer 12 | 13 | There may be multiple things to mention as pitfalls to understand if the subject individual is senior or not in a broad sense, but there is a common theme I see companies and teams fall into, and some of the characteristics of those mistakes seem important to discuss here. 14 | 15 | **Strong technical skills are important, but not everything.** I believe this is such a common misconception in growing companies that everyone that can develop some features starts calling themselves “senior engineers”, which damages the “senior engineer” image of the company in the employees’ eyes. An experienced engineer may be able to develop a lot of software, but that shouldn’t bring seniority automatically as that doesn’t imply that the individual understands about business, can motivate self and the ones around or can be relied upon. Overall, if I were to list traits of a senior engineer, technical skills wouldn’t be in the top 3 on that list. 16 | 17 | **Working in a company for a long time doesn’t automatically bring seniority.** An engineer working for a company for 5 years might be the most senior employee of the company when it comes to time spent in the company, but that doesn’t automatically make that person a _senior engineer_ in the sense of being senior no matter what company or environment we are talking about. Being a long-time employee has its advantages for sure, but that doesn’t imply that this person has all the traits of a senior engineer, it just implies that the person is either happy in the company or very patient. 18 | 19 | **Working in the industry for a long time doesn’t automatically bring seniority either.** Just like the company version of the same case, it doesn’t imply that the subject individual is senior because he/she spent X years in the industry. One might spend 10 years just doing repetitive stuff or not thinking about the job in detail, which would disqualify them from the idea of seniority. 20 | 21 | ### On what makes a senior engineer 22 | 23 | **A senior engineer should be able to communicate clearly.** I think this is one of the most important traits that define a senior engineer; ideas matter only if one can communicate them clearly to other individuals. No matter how good of an engineer one is, if that person cannot explain what he/she is doing or cannot communicate various ideas with technical and non-technical people clearly, then all the technical skill becomes nothing. Technology is there to bring value, and bringing value is more often than not a team game, which means if you want to deliver value, you _have to_ communicate well. There is always this myth of a geek that is not able to communicate with other people and creeps people out and regarded as a super-duper engineer; I believe that no one would like to work with someone in their team that cannot talk/stand to other people and explain his/her ideas. Good communication is key, a senior engineer needs to be able to communicate with engineers, managers, and customers clearly and efficiently so that he/she can keep building value. 24 | 25 | **A senior engineer should understand the tech-business relationship.** Software engineers are trying to build value for people in different areas, and it is very common for inexperienced engineers to fall into the trap of thinking only about the tech and not caring about the value implications of it at the end. The software can be a for-profit product, a hospital system, a non-profit application, a public transportation system, it can be anything; _business_ here means the value produced at the end. Technology is important, that is correct, but the software should be seen as a tool to achieve other goals rather than being the goal itself, excluding education purposes. A senior engineer should be able to understand the business effects of the technology in use to aid the result rather than the intermediate tools. 26 | 27 | **A senior engineer should be open to learning and criticism.** One of the things that pulled me into computers was how huge the potential is and how many different directions one may take within the field itself. Since there are so many things that can be done, I believe this also brings the requirement of continuous learning. We should all be open to learning from academia, industry, and our peers. We should keep reading, listening, watching, experimenting, testing, and staying positive about all these while still delivering value. As these are the behaviors I would expect from every engineer, a senior engineer should be a role-model when it comes down to learning. 28 | 29 | **A senior engineer should support their peers.** It is hard to get started something and everybody was a beginner in their profession for quite some time. Helping other people to get something done, supporting them through technical and non-technical decisions, and allowing them to grow has a huge impact on overall productivity and team energy. I would expect supportive behavior that shines a light to various bottlenecks for the individuals in the team from a senior engineer. 30 | 31 | **A senior engineer should empower their peers through their career track.** While this may sound a little bit controversial, I think it is hard for some types of people to promote themselves to other people, which makes them look like they are not achieving much even though they might have been doing incredible work. A senior engineer should be the one that gives credit to outstanding work, promotes their teammates to the open world, and encourage them to do more if they are willing to. This can be a very small gesture, such as mentioning to an upper-level manager as “have you seen the outstanding work X has done over the topic of Y?” while both are in the environment; this kind of behavior can be a huge motivator for both of the parties as it would help the individuals’ career tracks and help them to achieve more. 32 | 33 | **A senior engineer should be a motivator for the rest of the team.** There may be cases where a team loses focus or motivation because of various reasons; a senior engineer should be able to manage the problems for the team and motivate them out of those depressive moments. These problems might be caused because of technical, managerial, or personal issues; in either case, the senior engineer should be able to analyze the situation, understand the state-of-mind his/her peers are in and act accordingly to bring the motivation back. This may be bringing a technically challenging task on the table if the team is bored with what they are doing right now, pushing some ideas within the team to bring the spark back if they feel like they are dropped out of the game, or supporting them individually through tough times. A senior engineer should be the one that acts as a role model to the other members of the team and show the path to the end of the tunnel for those who feel kind of lost. 34 | 35 | **A senior engineer should be dependable.** Delivering things is important; however, what is even more important from my point of view is to deliver things that were _promised_ to be delivered in various forms; these promises may be in the form of sprint plannings, RFC documents, product roadmaps or in-person communication. I believe a senior engineer should be dependable in the sense that the team should be able to internalize the notion of “if X said he/she will do something, he/she will do it.” confidently. This would allow better planning for future events, better allocation of resources, and more stability against workload or environmental changes. Also, I believe this dependability would bring faith to the attention the engineer puts into their work; as in, the quality of their work would mostly not be doubted in the process. 36 | 37 | **A senior engineer should be able to stand up for the good and point out what is broken.** There may be cases where a broken thing is ignored to keep the status quo to stay comfortable; a senior engineer should be ready to point out problems and willing to take action to resolve those problems. The problems may be technical issues, behavioral problems, or processes that don’t fit the team culture; the _senior_ should be calling out the problems and making things explicit to improve the situation for good even though sometimes it requires extra work for various parties. 38 | 39 | **A senior engineer should strive for the best out of the team.** Some might call this behavior as “being too picky” when it comes to certain areas, but I believe a senior engineer should push their peers to produce better work and to learn more. This behavior might be exemplified as asking for good test coverage for some software, pushing for more extendable architectures, pointing out mistakes and potential improvements, and trying to bring out the best in everyone while not discouraging anyone. The team would ideally improve in terms of technical and soft skills. 40 | 41 | ### In Summary 42 | 43 | 📚 Source: [https://twitter.com/cyberomin/status/1274341280059965440](https://twitter.com/cyberomin/status/1274341280059965440) 44 | 45 | * First and foremost, what qualifies a person as a “senior engineer” is the kind of problem and breadth of problems that they have dealt with and not generally a length of time. 46 | * For instance, if you work in a fast pace environment and generally get thrown into deep problems, you’re more likely to grow faster in terms of experience and battle scars than someone who does the same repetitive tasks over and over. 47 | * Spend time in solving interesting problems, even though you think those problems are out of your experience, you will learn and grow twice as fast s the person who takes it slow. Don’t be shy to tackle hard problems. 48 | * Understand common pain points and become extremely well-versed with a complex multi-part system. As time goes on, you will begin to build solid muscle memories of the possible problems, so much so that if anything ever goes wrong, without too much digging around, you can pinpoint with near precision what the problem is, how to isolate that problem and how to fix it. 49 | * Find an opportunity to teach and mentor others. Volunteer to be the buddy of that new intern. What happens here is that you’re reinforcing your technical learnings. You’re learning people skills, very critical. 50 | * Demonstrate an ability to take more responsibilities beyond your defined “scope.” It’s important. While there’s a place for independent contributors, learning people management skills is super essential. 51 | * Ask the right questions - asking another person, using a social network like Stackoverflow or even Google. A senior engineer is someone who knows how to Google really well. 52 | * Create some sort of learning journal for yourself. It will become a knowledge bank and wiki over time. Do one last thing, share it. Put it on Medium, don’t worry if others have written about it, you should write about it anyway. 53 | * Read and be curious. Curiosity is super helpful, it allows you to question things and it pushes you to explore. My honest recommendation will be that you read engineering blogs. It doesn’t matter if some of the concepts there are over your head. Box, Square, Airbnb, Expedia, Grab, GoJek, Instacart all have good engineering blogs, read. And if and when you can, experiment. When you’re done experimenting, throw it to GitHub. 54 | 55 | **Don’t forget that being a seasoned engineer isn’t a destination, it’s a continuous journey.** 56 | 57 | -------------------------------------------------------------------------------- /software-engineering/software-career-tracks.md: -------------------------------------------------------------------------------- 1 | # Software Career Tracks 2 | 3 | When thinking about what tracks are available to software engineers, a good place to start is thinking about **what technical products do you see used in the world?** 4 | 5 | ### Products 6 | 7 | First, consider the many ways people interact with software on a given day: 8 | 9 | * Using their mobile phone to check their favorite apps 10 | * Watching Netflix via their computer or smart TV 11 | * Reviewing emails or writing reports on their laptop 12 | * Playing games on their computer or phone 13 | * Editing images or movies on their computer 14 | * Reviewing analytics or reports for their business 15 | * Hackers trying to use vulnerabilities to steal information 16 | 17 | **This breaks down into a few key categories:** 18 | 19 | * Building iOS and Android mobile Apps 20 | * Lyft or Facebook iOS or Android 21 | * Web Applications 22 | * [Amazon.com](http://amazon.com/) Site 23 | * Games \(Steam/Xbox\) 24 | * Gears of War, Bejeweled 25 | * Data Science \(Dashboards, reports and charts\) 26 | * Twitter or Facebook Ad Analytics 27 | * Security 28 | * Finding and patching security exploits at Bank of America 29 | * Embedded systems 30 | * Building operating system components 31 | * Writing hardware drivers 32 | 33 | ### Higher-Level \(Level 1 List\) 34 | 35 | At the highest level, the most common software engineering disciplines in industry can be broken down as: 36 | 37 | * Mobile Developer \(iOS/Android\) 38 | * Web Developer \(Client-side / Server-side\) 39 | * Graphics/Games \(OpenGL/Unity\) 40 | * Data Scientist / Machine Learning \(SQL/Python/R/TensorFlow\) 41 | * Security \(Python/Ruby/C++\) 42 | * Embedded / Systems Developer \(C/C++/Rust/Go/Assembly\) 43 | 44 | ### Level 2 List 45 | 46 | This can be further expanded into more discrete roles: 47 | 48 | * Mobile \(iOS/Android\) 49 | * Web Front-end \(HTML/CSS/Javascript\) 50 | * Web Back-end \(Ruby/Python/Java/Node.js\) 51 | * Graphics/Games \(OpenGL/Unity\) 52 | * Data Analyst \(SQL/Python/R\) 53 | * Machine Learning \(TensorFlow/Mahout/SciKit\) 54 | * DevOps and Infrastructure \(Jenkins/Docker\) 55 | * Embedded Systems \(C/C++/Assembly\) 56 | * Blockchain Systems Engineer \(C/C++/Go/Rust\) 57 | * Security \(Python/Ruby/C++\) 58 | * Desktop \(Windows/Mac/Linux\) 59 | * Test Engineer \(Selenium/Expresso\) 60 | * Site Reliability Engineer \(Docker/Kubernetes/Jenkins/Dynatrace/Prometheus\) 61 | 62 | ### Full 63 | 64 | Read below for a more detailed description of the various software engineering roles and specialties. 65 | 66 | #### 1 – Front-end Developer \(AKA Client-Side Developer\) 67 | 68 | This is a developer who specializes in the programming of visual user interfaces, including its aesthetics and layouts. A front-end developer code runs on a web browser, on the computer of the user of the site. 69 | 70 | It is very high-level work, normally far removed from the hardware. It requires an understanding of human-machine interaction and design principles more than computer science theory. Much of a front-end developer’s life is spent dealing with cross-browser compatibility issues and tweaking details of the visual presentation of a UI. 71 | 72 | Front-end development skills include the design of user interface \(UI\) and user experience \(UX\), CSS, JavaScript, HTML, and a growing collection of UI frameworks. 73 | 74 | #### 2 – Backend Developer \(AKA Server-Side Developer\) 75 | 76 | This is a developer who specializes in the design, implementation, functional core logic, performance and scalability of a piece of software or system running on machines that are remote from the end-user. 77 | 78 | Back-end systems can grow to be very complex, but their complexity is often not visible to the users. For example, consider Google search engine. The front-end part is a very simple UI with a title, a text box, and two or three buttons. The backend is an enormously complex system, able to crawl the web, index it, and find what you are looking for with a growing array of sophisticated mechanisms. 79 | 80 | A back-end developer works with programming languages such as Java, C, C++, Ruby, Perl, Python, Scala, Go, etc. Back-end developers often need to integrate with a vast array of services such as databases, data storage systems, caching systems, logging systems, email systems, etc. 81 | 82 | #### 3 – Full-stack Developer 83 | 84 | This is a developer that does both front-end and back-end work. He or she has the skills required to create a fully functional web application. 85 | 86 | #### 4 – Middle-Tier Developer 87 | 88 | This is a developer who writes non-UI code that runs in a browser and often talking to non-core code running on a server. In general, middle tier is the “plumbing” of a system. 89 | 90 | The term middle-tier developer is used to describe someone who is not specialized in the front-end or the back-end but can do a bit of both, without being a full stack developer. Only rarely engineers have this as a title, as it is more of a description of a skill set than a career path. 91 | 92 | #### 5 – Web Developer 93 | 94 | Web developers are software engineers who specialize in creating websites. They are either front-end developers, back-end developers, middle-tier developers or full-stack developers. 95 | 96 | Web-Development became a very common way to enter the software engineering world in the late ‘90s and early 2000s. It has a low entry-point, requiring as little as basic HTML and CSS knowledge. With only a few months of experience, an entry-level web developer can start producing code that ships to production systems. It is a particularly attractive option for people who have no CS fundamentals and want to join the programming world. 97 | 98 | #### 6 – Desktop Developer 99 | 100 | This is a developer who works on software applications that run natively on desktop operating systems \(such as Mac OS, Windows, and Linux\). 101 | 102 | Back in the ’80s, this was one of the most common types of engineers, popularized by inexpensive development environments such as Turbo Pascal, Turbo C, Visual Basic, Quick C, Visual Studio, and Delphi. 103 | 104 | Desktop developers often use GUI Toolkits such as Cocoa, XAML, WinForms, Gtk, etc. 105 | 106 | #### 7 – Mobile Developer 107 | 108 | This is a developer who writes code for applications that run natively on consumer mobile devices such as smartphones and tablets. Mobile development was almost unheard of before the early 2000s and the explosion of the smartphone market. Before then mobile development was considered a subset of embedded development. 109 | 110 | A mobile developer understands the intricacies of mobile operating systems such as iOS and Android, and the development environment and frameworks used to write software on those operating systems. That includes Java, Swift, and Objective-C. 111 | 112 | #### 8 – Graphics Developer 113 | 114 | This is a type of developer specialized in writing software for rendering, lighting, shadowing, shading, culling, and management of scenes. These developers are often responsible for integrating technologies in the gaming and video production industry. 115 | 116 | Graphic development used to be a form of low-level development, requiring advanced math and computer science training. It is becoming more accessible with the introduction of commercial and open source frameworks and systems. For example, very few people today need to be able to write a shader from scratch. 117 | 118 | Frameworks include DirectX, OpenGL, Unity 3D, WebGL. For more advanced graphic developers, low-level development requires C, C++, and Assembly. 119 | 120 | #### 9 – Game Developer 121 | 122 | This is a generic term to identify a developer specialized in writing games. Game developers can fall into one of the other categories of developers, but they often have specific knowledge and skills in designing and implementing engaging and interactive gaming experiences. 123 | 124 | Frameworks used by game developers include DirectX, OpenGL, Unity 3D, WebGL, and languages such as C, C++, and Java. Adobe Flash used to be the standard gaming platform for web games. [Since Flash is being abandoned](https://coderhood.com/adobe-flash-end-life-timeline-infographic/), JavaScript and HTML5 became the new standard. On mobile devices, Swift and Java are now the technologies of choice for iOS and Android games. 125 | 126 | #### 10 – Data Scientist 127 | 128 | This type of developer writes software programs to analyze data sets. They are often in charge of statistical analysis, machine learning, data visualization, and predictive modeling. 129 | 130 | Languages used by data scientists often include SQL, R, and Python. 131 | 132 | #### 11 – Big Data Developer 133 | 134 | This type of developer writes software programs to store and retrieve vast amounts of data in systems such as data warehouses, ETL \(Extract Transform Load\) systems, relational databases, data lakes management systems, etc. 135 | 136 | A big data developer is often familiar with frameworks and systems for distributed storage and processing of vast amounts of data such as MapReduce, Hadoop, and Spark. Languages used by Big Data Developers include SQL, Java, Python, and R. 137 | 138 | #### 12 – DevOps Developer 139 | 140 | This is a type of developer familiar with technologies required for the development of systems to build, deploy, integrate and administer back-end software and distributed systems. 141 | 142 | Technologies used by DevOps Engineers include Kubernetes, Docker, Apache Mesos, the HashiCorp stack \(Terraform, Vagrant, Packer, Vault, Consul, Nomad\), Jenkins, etc. 143 | 144 | #### 13 – [CRM](https://searchcrm.techtarget.com/definition/CRM) Developer 145 | 146 | This type of developer specializes in the field of systems that collect user and consumer data. These developers are tasked with improving customer satisfaction and sales by improving the tooling used by customer support representatives, account managers, and sale representatives. 147 | 148 | Technologies used by these developers include SAP, Salesforce, Sharepoint, and ERP \(Enterprise Resource Planning\). 149 | 150 | #### 14 – Software Development Engineer in Test \(SDET\) 151 | 152 | This type of developer is responsible for writing software to validate the quality of software systems. They create automated tests, tools and systems to make sure that products and processes run as expected. 153 | 154 | Technologies used by SDETs include Python, Ruby, and Selenium. 155 | 156 | #### 15 – Embedded Developer 157 | 158 | These developers work with hardware that isn’t commonly classified as computers. For example, microcontrollers, real-time systems, electronic interfaces, set-top boxes, consumer devices, iOT devices, hardware drivers, and serial data transmission fall into this category. 159 | 160 | Embedded developers often work with languages such as C, C++, Assembly, Java or proprietary technologies, frameworks, and toolkits. 161 | 162 | #### 16 – High-Level Developer 163 | 164 | This is a general term for a developer who writes code that is very far from the hardware, in high-level scripting languages such as PHP, Perl, Python, and Ruby. Web developers are often high-level developers, but not always. 165 | 166 | #### 17 – Low-Level Developer 167 | 168 | This is a general term for a developer who writes code that is very close to the hardware, in low-level languages such as assembly and C. Embedded developers are often low-level developers, but not always. 169 | 170 | #### 18 – WordPress Developer 171 | 172 | I include WordPress developers in this list because they are a hefty group of specialized web developers. They create and customize themes and plugins for WordPress and administer WordPress sites. 173 | 174 | This kind of developer uses the WordPress system, PHP, JavaScript, and HTML. 175 | 176 | #### 19 – Security Developer 177 | 178 | This type of developer specializes in creating systems, methods, and procedures to test the security of a software system and exploit and fix security flaws. This type of developer often work as “white-hat” ethical hacker and attempts to penetrate systems to discover vulnerabilities. 179 | 180 | Security developers most often write tools in scripting languages such as Python and Ruby and understand in details the many patterns used to attack software systems. More advanced security developers need to read and understand operating systems source code written in C and C++. They might also reverse engineer libraries and commercial software systems to find and exploit vulnerabilities. 181 | 182 | #### 20 - Site Reliability Engineer 183 | 184 | SREs keep large-scale computer services reliable. They are directly involved in modifying code in their pursuit of making systems automated. A company's SRE teams are characterized by both rapid innovation and a large acceptance of change. They are responsible for the availability, latency, monitoring, emergency response, performance, efficiency, change management, and capacity planning of application services. 185 | 186 | -------------------------------------------------------------------------------- /software-engineering/software-design-patterns.md: -------------------------------------------------------------------------------- 1 | # Software Design Patterns 2 | 3 | Software design patterns and principles are ways of organizing and designing code in order to make sure the code is high quality, well-organized, easy to understand and easy to change over time. 4 | 5 | These patterns are not specific libraries that you can plug into your application. These are, rather, guidelines on how to tackle certain problems in certain situations. Examples of design patterns include: 6 | 7 | * [SOLID Principles](https://hackernoon.com/solid-principles-made-easy-67b1246bcdf) - Anagram representing 5 principles to writing high-quality software. Check out [this detailed conference talk](https://www.youtube.com/watch?v=bL5mHFFupts) for a solid introduction. 8 | * **Creational Patterns** - How to instantiate an object or group of related objects. 9 | * **Structural patterns** - How different objects work in relationship to one another. 10 | * **Behavioral Patterns** - How different objects communicate data to one another. 11 | * **Coupling and Cohesion** - How to organize your code and classes in a way that is well-designed and well-organized. 12 | 13 | To learn more about software design patterns and principles, check the following introductory links: 14 | 15 | * [An Introduction to Software Design Patterns](https://www.coengoedegebure.com/introduction-to-software-design-patterns/) 16 | * [Software Design Pattern Notes](https://www.quickdevnotes.com/software-design-patterns/) 17 | * [Design Patterns for Humans](https://github.com/kamranahmedse/design-patterns-for-humans) 18 | * [Intro to Design Patterns](https://en.wikibooks.org/wiki/Introduction_to_Software_Engineering/Architecture/Design_Patterns) 19 | * [Coupling and Cohesion](https://thebojan.ninja/2015/04/08/high-cohesion-loose-coupling/) 20 | 21 | Understanding patterns takes time, and requires you to try applying these patterns into your own code and projects to understand their benefits and trade-offs. 22 | 23 | -------------------------------------------------------------------------------- /software-engineering/success-as-a-software-engineer.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: >- 3 | In this section, we look at some of the most important ingredients and skills 4 | associated with being successful as a software engineer. 5 | --- 6 | 7 | # Success as a Software Engineer 8 | 9 | The software development industry is highly volatile and dynamic where it’s mandatory for engineers to have a blend of both technical and communication skills in order to let their career flourish. It’s easy to acquire technical expertise by working hard in a professional setting. 10 | 11 | But, the real challenge for engineers is to develop essential communication skills that allow them to interact efficiently and harmoniously with other people, whether in their full-time roles or working in contracts. As correctly quoted by an eminent American software engineer and author Tom DeMarco: "The business we’re in is more sociological than technological, more dependent on workers’ abilities to communicate with each other than their abilities to communicate with machines.” 12 | 13 | ### Twelve Skills 14 | 15 | Considering the significance of these skills, let’s look at top twelve of them in detail which can make a programmer perfect fit for a software company. 16 | 17 | #### 1. Effective Writing Skills 18 | 19 | It’s great that you can talk well and express your thoughts in a clear manner. But is disciplined environments it’s also essential for the programmers to have the ability to put their thoughts in writing precisely. This helps them in raising their voice at the right time and in the right manner. 20 | 21 | #### 2. Good Drawing Skills 22 | 23 | In a software team, it becomes highly important for engineers have the potential to express their thoughts in the form of visually appealing diagrams. This gives you an edge over the others and the capability to express yourself in a unique way. 24 | 25 | #### 3. Excellent Reporting Skills 26 | 27 | The main task of a programmer is not only to develop code or fix a bug. But they should be well-versed with reporting the entire issue in an effective manner to the other team members or external staff. 28 | 29 | Great engineers have the potential to take up any complex technical problem and describe it is simple terms so that it becomes easy even for non-technical people to understand it properly. This is a crucial skills that can be beneficial in increasing your usefulness in the professional setting. 30 | 31 | #### 4. Volunteering & The Will To Contribute Back 32 | 33 | The majority of the software projects are open source where it is mandatory for the engineers to have the ability to work with an open community cohesively. They should be always willing to give something back to the community for the software they provide. 34 | 35 | Programmers can do this by performing tasks such as reporting problems, submitting pull requests, creating their own open source products, etc. For doing all these tasks efficiently engineers do need a lot of non-tech skills. 36 | 37 | #### 5. Asking & Participating In The Digital Resources 38 | 39 | This skill needs programmers to participate and take advantage of various digital communities and resources such as StackOverflow, GitHub, and many more. This is important because the software development domain is expanding globally and it’s not enough to stay within your team and gain knowledge from their experience. 40 | 41 | This kind of online communities, platforms, and resources are there to help the programmers in solving their problems and enhancing their knowledge base. Also, they can get instant expert advice from some of the most renowned technical wizards which can prove to be a lifesaver for engineers. 42 | 43 | #### 6. Testing Skills 44 | 45 | This skill is not limited to the technical ability to write and run automated tests. But it’s also highly important for engineers to communicate effectively with the testers so that to get their honest feedback which could improve the overall performance and quality of the product under development. 46 | 47 | In addition, good programmers must know how to deal with the famous developer-tester conflict which has been in existence for a long time. Also, they should understand the worth of testers and treat them with respect and dignity. 48 | 49 | #### 7. Appropriate Charging Capability 50 | 51 | The prime source of income for engineers is to write code. But in rare situations development projects fail due to money conflicts between the programmer and the client. The major reason behind this is that the engineers are not familiar with the ways to manage their financial goals. 52 | 53 | They hesitate when asking for a raise or modifying the paying schedule. This makes it extremely important for the programmers master the art of managing financial relationships with their clients. Also, they should be loud and clear when negotiating financial matters. 54 | 55 | #### 8. Branching 56 | 57 | It’s not good for programmers to keep working in a single master branch for a very long period of time. They should learn how to move gradually from the amateur category to the expert bandwagon. 58 | 59 | The engineers must know how to deal with multiple branches efficiently and resolve conflicts between them. For acquiring this trait, programmers need to have a skill that is not at all related to the quality of code they produce. But, this skill definitely has a positive impact on the professionalism of the software engineers. 60 | 61 | #### 9. Relaxing 62 | 63 | The efficient programmers must have exceptional time management skills. They should be able to monitor their time spent on the work and take out some time to relax. This will encourage them to have a peaceful mindset where they can manage their time effectively and realize their full potential. Also, it will help them in enhancing their overall productivity and efficiency. 64 | 65 | #### 10. Delivering 66 | 67 | Developers should have a comprehensive knowledge of the entire development process. They should be aware of the significance of delivery pipeline, continuous integration, staging, build automation, green/blue deployments, etc. All these concepts aren’t relevant to the DevOps department only. 68 | 69 | Great programmers must have an idea of how their code reaches the users. They should also be well-versed with the pipeline and people involved with the project. This will help them in visualizing project as a whole and take it more seriously. 70 | 71 | #### 11. Big-Picture Thinking 72 | 73 | The engineers should be able to see the bigger picture and understand the product, people involved, and pipeline in a better manner. They can’t afford to survive in isolation and considering writing code as their one and only job. They should have the ability to work in a team and understand the nuances of the project in detail irrespective of whether they fall under their niche expertise. 74 | 75 | #### 12. Dealing With Failures 76 | 77 | It’s quite obvious that many development projects fail. The reason behind this failure isn’t always technical. But the majority of the projects fails due to incompetent management. Therefore, it’s essential for the programmers know how to deal with such failures. 78 | 79 | They should have the capacity to discover the reason behind their failure and predicting potential risks. Also, they should be well-versed with managing these risks and stick to the spirit of never giving up. 80 | 81 | #### Wrap-up 82 | 83 | These are not the only communication and collaboration skills required for programmers to excel in their career. But there are several other qualities which engineers should inculcate in order to deliver successful projects. Some of these skills are empathy, critical thinking, willing to learn, adaptability, attitude, etc. 84 | 85 | Software engineers can acquire these skills by paying attention to new opportunities and working with an attitude that motivates them to grasping new concepts and accepting offered guidance optimistically. 86 | 87 | ### Attribution 88 | 89 | This is adapted from [this article](https://dev.to/rahulvarshneya/12-must-have-soft-skills-for-software-engineers-4d89) by Rahul Varshneya. 90 | 91 | ## Additional Skills and Recap 92 | 93 | Look beyond the specific coding acumen, and start early thinking about the following essential skills as you develop in your engineering career: 94 | 95 | 1. **Being able to communicate clearly** 96 | * In business terms - not in tech jargon - with business people / non-technical co-workers. 97 | 2. A **high-level understanding of how systems work**: 98 | * Design patterns 99 | * how to abstract systems into manageable layers 100 | * how the business or product ought to influence the structure of your app/code 101 | * knowing which technologies solve what high-level problems 102 | 3. **Ability to elegantly connect different pieces of a system**. 103 | * It’s easy to build a piece of a closed system. It’s hard to build something that connects with other systems, teams in your organization, etc. You’ll need to make sure you understand requirements much better and provide really good documentation. Yes - it means you will need to communicate with people and exercise your writing skills. Sometimes writing for non-technical people 104 | 4. **Collaborating with a team** 105 | * You’ll soon find yourself getting frustrated with your co-workers. Maybe they don’t code the same way as you? Maybe they don’t have the same understanding as you do. Maybe every morning they take the first 30 minutes of their day to tell you about what movie they watched last night? E-v-e-r-y-d-a-y. You’ll have to learn that everyone is different. Pick your battles. Not every difference is important. The things that are important - make sure you address those concerns by speaking with that person directly. 106 | 5. **Knowledge of the business problem is essential** 107 | * How can you build a solution to a problem you don’t fully understand? If your product is designed to fix a problem that medical doctors have then you’ll need to know about how doctors work and deal with the problem at hand. Get to know your problem so well that fixing the problem by writing code is the last resort. This means having to problem-solve with business people and doctors, for example. It might mean having to learn more skills: marketing, product design, business planning, etc. 108 | 109 | -------------------------------------------------------------------------------- /software-engineering/success-as-a-software-engineer/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: >- 3 | In this section, we look at some of the most important ingredients and skills 4 | associated with being successful as a software engineer. 5 | --- 6 | 7 | # Software Engineer Success 8 | 9 | The software development industry is highly volatile and dynamic where it’s mandatory for engineers to have a blend of both technical and communication skills in order to let their career flourish. It’s easy to acquire technical expertise by working hard in a professional setting. 10 | 11 | But, the real challenge for engineers is to develop essential communication skills that allow them to interact efficiently and harmoniously with other people, whether in their full-time roles or working in contracts. As correctly quoted by an eminent American software engineer and author Tom DeMarco: "The business we’re in is more sociological than technological, more dependent on workers’ abilities to communicate with each other than their abilities to communicate with machines.” 12 | 13 | ### Twelve Skills 14 | 15 | Considering the significance of these skills, let’s look at top twelve of them in detail which can make a programmer perfect fit for a software company. 16 | 17 | #### 1. Effective Writing Skills 18 | 19 | It’s great that you can talk well and express your thoughts in a clear manner. But is disciplined environments it’s also essential for the programmers to have the ability to put their thoughts in writing precisely. This helps them in raising their voice at the right time and in the right manner. 20 | 21 | #### 2. Good Drawing Skills 22 | 23 | In a software team, it becomes highly important for engineers have the potential to express their thoughts in the form of visually appealing diagrams. This gives you an edge over the others and the capability to express yourself in a unique way. 24 | 25 | #### 3. Excellent Reporting Skills 26 | 27 | The main task of a programmer is not only to develop code or fix a bug. But they should be well-versed with reporting the entire issue in an effective manner to the other team members or external staff. 28 | 29 | Great engineers have the potential to take up any complex technical problem and describe it is simple terms so that it becomes easy even for non-technical people to understand it properly. This is a crucial skills that can be beneficial in increasing your usefulness in the professional setting. 30 | 31 | #### 4. Volunteering & The Will To Contribute Back 32 | 33 | The majority of the software projects are open source where it is mandatory for the engineers to have the ability to work with an open community cohesively. They should be always willing to give something back to the community for the software they provide. 34 | 35 | Programmers can do this by performing tasks such as reporting problems, submitting pull requests, creating their own open source products, etc. For doing all these tasks efficiently engineers do need a lot of non-tech skills. 36 | 37 | #### 5. Asking & Participating In The Digital Resources 38 | 39 | This skill needs programmers to participate and take advantage of various digital communities and resources such as StackOverflow, GitHub, and many more. This is important because the software development domain is expanding globally and it’s not enough to stay within your team and gain knowledge from their experience. 40 | 41 | This kind of online communities, platforms, and resources are there to help the programmers in solving their problems and enhancing their knowledge base. Also, they can get instant expert advice from some of the most renowned technical wizards which can prove to be a lifesaver for engineers. 42 | 43 | #### 6. Testing Skills 44 | 45 | This skill is not limited to the technical ability to write and run automated tests. But it’s also highly important for engineers to communicate effectively with the testers so that to get their honest feedback which could improve the overall performance and quality of the product under development. 46 | 47 | In addition, good programmers must know how to deal with the famous developer-tester conflict which has been in existence for a long time. Also, they should understand the worth of testers and treat them with respect and dignity. 48 | 49 | #### 7. Appropriate Charging Capability 50 | 51 | The prime source of income for engineers is to write code. But in rare situations development projects fail due to money conflicts between the programmer and the client. The major reason behind this is that the engineers are not familiar with the ways to manage their financial goals. 52 | 53 | They hesitate when asking for a raise or modifying the paying schedule. This makes it extremely important for the programmers master the art of managing financial relationships with their clients. Also, they should be loud and clear when negotiating financial matters. 54 | 55 | #### 8. Branching 56 | 57 | It’s not good for programmers to keep working in a single master branch for a very long period of time. They should learn how to move gradually from the amateur category to the expert bandwagon. 58 | 59 | The engineers must know how to deal with multiple branches efficiently and resolve conflicts between them. For acquiring this trait, programmers need to have a skill that is not at all related to the quality of code they produce. But, this skill definitely has a positive impact on the professionalism of the software engineers. 60 | 61 | #### 9. Relaxing 62 | 63 | The efficient programmers must have exceptional time management skills. They should be able to monitor their time spent on the work and take out some time to relax. This will encourage them to have a peaceful mindset where they can manage their time effectively and realize their full potential. Also, it will help them in enhancing their overall productivity and efficiency. 64 | 65 | #### 10. Delivering 66 | 67 | Developers should have a comprehensive knowledge of the entire development process. They should be aware of the significance of delivery pipeline, continuous integration, staging, build automation, green/blue deployments, etc. All these concepts aren’t relevant to the DevOps department only. 68 | 69 | Great programmers must have an idea of how their code reaches the users. They should also be well-versed with the pipeline and people involved with the project. This will help them in visualizing project as a whole and take it more seriously. 70 | 71 | #### 11. Big-Picture Thinking 72 | 73 | The engineers should be able to see the bigger picture and understand the product, people involved, and pipeline in a better manner. They can’t afford to survive in isolation and considering writing code as their one and only job. They should have the ability to work in a team and understand the nuances of the project in detail irrespective of whether they fall under their niche expertise. 74 | 75 | #### 12. Dealing With Failures 76 | 77 | It’s quite obvious that many development projects fail. The reason behind this failure isn’t always technical. But the majority of the projects fails due to incompetent management. Therefore, it’s essential for the programmers know how to deal with such failures. 78 | 79 | They should have the capacity to discover the reason behind their failure and predicting potential risks. Also, they should be well-versed with managing these risks and stick to the spirit of never giving up. 80 | 81 | #### Wrap-up 82 | 83 | These are not the only communication and collaboration skills required for programmers to excel in their career. But there are several other qualities which engineers should inculcate in order to deliver successful projects. Some of these skills are empathy, critical thinking, willing to learn, adaptability, attitude, etc. 84 | 85 | Software engineers can acquire these skills by paying attention to new opportunities and working with an attitude that motivates them to grasping new concepts and accepting offered guidance optimistically. 86 | 87 | ### Attribution 88 | 89 | This is adapted from [this article](https://dev.to/rahulvarshneya/12-must-have-soft-skills-for-software-engineers-4d89) by Rahul Varshneya. 90 | 91 | ## Additional Skills and Recap 92 | 93 | Look beyond the specific coding acumen, and start early thinking about the following essential skills as you develop in your engineering career: 94 | 95 | 1. **Being able to communicate clearly** 96 | * In business terms - not in tech jargon - with business people / non-technical co-workers. 97 | 2. **A** **high-level understanding of how systems work**: 98 | * Design patterns 99 | * how to abstract systems into manageable layers 100 | * how the business or product ought to influence the structure of your app/code 101 | * knowing which technologies solve what high-level problems 102 | 3. **Ability to elegantly connect different pieces of a system**. 103 | * It’s easy to build a piece of a closed system. It’s hard to build something that connects with other systems, teams in your organization, etc. You’ll need to make sure you understand requirements much better and provide really good documentation. Yes - it means you will need to communicate with people and exercise your writing skills. Sometimes writing for non-technical people 104 | 4. **Collaborating with a team** 105 | * You’ll soon find yourself getting frustrated with your co-workers. Maybe they don’t code the same way as you? Maybe they don’t have the same understanding as you do. Maybe every morning they take the first 30 minutes of their day to tell you about what movie they watched last night? E-v-e-r-y-d-a-y. You’ll have to learn that everyone is different. Pick your battles. Not every difference is important. The things that are important - make sure you address those concerns by speaking with that person directly. 106 | 5. **Knowledge of the business problem is essential** 107 | * How can you build a solution to a problem you don’t fully understand? If your product is designed to fix a problem that medical doctors have then you’ll need to know about how doctors work and deal with the problem at hand. Get to know your problem so well that fixing the problem by writing code is the last resort. This means having to problem-solve with business people and doctors, for example. It might mean having to learn more skills: marketing, product design, business planning, etc. 108 | 109 | -------------------------------------------------------------------------------- /software-engineering/success-as-a-software-engineer/dont-just-copy-and-paste.md: -------------------------------------------------------------------------------- 1 | # Don't Just Copy & Paste 2 | 3 | **Source:** [https://twitter.com/thecodercoder/status/1257299407151783936](https://twitter.com/thecodercoder/status/1257299407151783936) 4 | 5 | When you are learning something, following a tutorial or guide, reading StackOverflow, or learning a new language: 6 | 7 | * Don't just copy & paste. It's harder to make yourself stop and try to understand but worth it. 8 | * When you're are learning a new concept, go through each section one time to start off 9 | * Take notes and jot down thoughts or key parts 10 | * Then pause, digest, and try to recreate the example. See how far you can get without looking back. 11 | * Reread or rewatch the same material again, with a focus on what you missed last time 12 | * At each stage, try to force yourself to understand why the code is working or not. 13 | * Be mindful of where you have gaps in your understanding and write those down 14 | * Then work to specifically fill in those gaps, this helps you retain knowledge better 15 | * The more gaps you fill up over time this way, the more you will expand your knowledge 16 | * Google around and check Stackoverflow to further build knowledge and close gaps 17 | 18 | -------------------------------------------------------------------------------- /software-engineering/success-as-a-software-engineer/more-engineering-advice.md: -------------------------------------------------------------------------------- 1 | # More Engineering Advice 2 | 3 | **Source**: [https://fredwu.me/blog/2020-05-03-tips-for-becoming-a-better-software-developer/](https://fredwu.me/blog/2020-05-03-tips-for-becoming-a-better-software-developer/) 4 | 5 | The tips are categorized into two main areas: **mindset and technical** 6 | 7 | ### Mindset 8 | 9 | * **Have a growth mindset** - Intelligence can be developed. We can get smarter through hard work, the use of effective strategies, and help from others when needed. 10 | * **Try to see the big picture** - Learn to be able to shift between a detail or specific task on hand and back to the big picture. Build context, try to see beyond your immediate goal to the broader implications. 11 | * **Recognize the Dunning–Kruger Effect**. Overly confident people are often the most incompetent while humble unsure people can often be much more capable. Understanding [this principle](https://www.youtube.com/watch?v=y50i1bI2uN4) can be essential to overcoming impostor syndrome and recognizing confidence can be misplaced. 12 | * **Speed vs Quality -** Internalising the need for speed and the need for quality should always be on our mind. Pursuing only quality or only speed will significantly limit your problem-solving capability as well as your career progression. 13 | 14 | ### Technical 15 | 16 | * **Don't impulsively rewrite systems** - Rewriting a codebase from scratch is rarely the answer even though you might think it is. Learn to be surgical and precise in your approach. 17 | * **Code Quality Matters** - Strive to do more than just write functional code. You want to push yourself to write "idiomatic" \(matching the language and framework\) code, follow best practices, and write code that is elegant and simple for other engineers to understand. 18 | * **Read As Much Code As Possible -** Read high-quality open-source code or code on projects internally where you work and build broad exposure to established patterns and conventions. 19 | * **Tech Stack Diversity is Always a Good Thing -** No matter whether you are in a highly specialized field or a generalist, having exposure to different tech stacks and paradigms is always a good thing - it widens your field of vision and increases the boundary of your technical understanding. 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /software-engineering/success-as-a-software-engineer/senior-solutions-toolkit.md: -------------------------------------------------------------------------------- 1 | # Senior Solutions Toolkit 2 | 3 | **Source:** [https://www.zainrizvi.io/blog/whats-it-like-as-a-seni**or-engineer/**](https://www.zainrizvi.io/blog/whats-it-like-as-a-senior-engineer/) 4 | 5 | ### Introduction 6 | 7 | * As you become more experienced, your toolkit for building and doing evolves 8 | * There’s a huge mindset shift needed when you go from junior to senior. Writing code becomes a minor part of the job. 9 | 10 | At the senior levels, most of your time goes into identifying **what** needs to be built and **how** to build it: 11 | 12 | * You have to research what the problem looks like. 13 | * You talk to others and get everyone to agree on what needs to be done. 14 | 15 | ### Your Senior Tools 16 | 17 | * Research the problem 18 | * Design the solution 19 | * Build consensus 20 | 21 | ### Research the Problem 22 | 23 | As you get more experienced your problems become more ambiguous. The path looks hazy. There are multiple routes you could take, but each one hides its own dragons. It’s not about coding anymore. Most of your work goes into research, and you can’t google the answer. 24 | 25 | Research can take many forms. It usually involves a combination of reading code, reading documentation, and talking to people. There often is no single person who knows the answer you need. Five different people might hold five different pieces of the puzzle you’re assembling. And you don’t know who those five people are. And they don’t know which pieces you need. 26 | 27 | _You_ have to find them. Find them and ask the right questions to sift through their brains, uncovering the nuggets you need. 28 | 29 | When researching, keep in mind the following advice: 30 | 31 | * Talk to people and really listen 32 | * Look for patterns 33 | * Understand people's problems 34 | * Dig deeper and ask questions to follow-up to confirm your understanding 35 | 36 | ### Design the Solution 37 | 38 | With ambiguous problems there is no single right answer anymore. There might not be any answer. What you have is a pain point. It could be your customers’s pains, your team’s pains, or even your own pain. The existence of that pain is the problem. Your job is to remove that pain without introducing even greater pains. 39 | 40 | There’s a funny thing about ambiguous problems: they don’t have a clear right answer. Every solution offers certain benefits and has certain downsides. The more of those you discover, the better you’ll be at balancing the tradeoffs you have to make. Some common trade offs to consider: 41 | 42 | * How long will it take to develop the solution? 43 | * What’s the opportunity cost? 44 | * How risky is it? What happens if that thing fails? 45 | * How much work will it be to maintain this going forwards? 46 | * How far will it scale? How far does it need to? 47 | 48 | With these ambiguous problems, sometimes the best answer can be “keep doing the thing we’ve been doing.” That was a tough lesson to learn. Keep this in mind when designing a solution: 49 | 50 | * Consider how much risk any new project might add to the system 51 | * It’s okay to fail. If you never fail then you’re not stretching yourself 52 | * Get feedback early! 53 | 54 | To get that feedback communication is crucial. Tell people what you’re going to build before you build it and let them warn you about any pitfalls before you step into one. 55 | 56 | But collecting feedback requires a soft skill: empathy. Can you understand why people disagree with you? What are they valuing differently? 57 | 58 | You may not always agree with the feedback, but you have to understand it. Only then can you move forward with a new vision that everyone can get behind. 59 | 60 | ### Build Consensus 61 | 62 | When given a task, ask yourself who needs to be bought in. Try to get everyone involved, informed, gather feedback, and ultimately bought into the solution. 63 | 64 | * Get your manager to agree and gather their input early 65 | * Build consensus with the rest of your team 66 | * Even people outside your team who have a stake in your work 67 | 68 | You'll be tasked with things that span multiple teams. First step was talking to them all to really understand their concerns and priorities. 69 | 70 | See if you can "change the constraints", and shift a problem so that you can address concerns from all sides. Learn to say "no" to make the solution fit the given constraints. 71 | 72 | ### Wrap-up 73 | 74 | That’s the general flow of any project you work on at the senior levels: You research the problem, gather the pieces, understand the world better. You design a solution, collect feedback and adjust course as needed. Then the implementation begins. 75 | 76 | So how do you learn all these skills? Experience. Jump out of the nest and flap your wings. If an opportunity shows up, take it. You won’t feel ready, no one does, but that’s what makes it a learning experience. 77 | 78 | Ask for help. Listen to the answers you get. Keep trying. At the end of the project ask for feedback and use it to improve faster. You only learn these skills by practicing. 79 | -------------------------------------------------------------------------------- /software-engineering/success-as-a-software-engineer/seven-pieces-of-advice.md: -------------------------------------------------------------------------------- 1 | # Seven Pieces of Advice 2 | 3 | **Source:** [https://blog.pragmaticengineer.com/advice-to-myself-when-starting-as-a-software-developer/](https://blog.pragmaticengineer.com/advice-to-myself-when-starting-as-a-software-developer/) 4 | 5 | Here are seven pieces of advice the author wishes they would have started doing sooner. Habits that could have helped them grow faster and in a more focused way. 6 | 7 | 1. **Take the time to read two books per year on software engineering** 8 | 2. **Learn the language you use at work in-depth, to the very bottom** 9 | 3. **Pair with other developers more often** 10 | 4. **Write unit tests and run them against a CI** 11 | 5. **Make refactoring a habit and master refactoring tools** 12 | 6. **Know that good software engineering is experience. Get lots of it.** 13 | 7. **Teach what you learn** 14 | 15 | Each of these is expanded on in more detail below. 16 | 17 | ### **Take the time to read two books per year on software engineering** 18 | 19 | * Pick two software**-**related books a year to read and process carefully 20 | * This includes taking notes, talking chapters through with others, doodle diagrams, trying out, going back, and re-reading. Read rather slowly. Do a chapter or two in one sitting. Take notes or highlight. 21 | * Look for books that go deeper than what you know now. This could be a book on a specific technology, or on software engineering practices. 22 | * Don't go overboard: one book every six months is already great. Pick a book, and spend the time to _properly_ read it 23 | * [Here's the list of books](https://blog.pragmaticengineer.com/my-reading-list/) the author has read and is reading 24 | 25 | ### **Learn the language you use at work in-depth, to the very bottom** 26 | 27 | * Whichever your primary stack is at work, go deep into it and learn the internals 28 | * Learn about threading, how garbage collection, performance bottlenecks, and other internals 29 | * This knowledge becomes an advantage both at work, and when interviewing for other jobs 30 | * The more languages you know, the more you can evaluate their strengths and weaknesses. And the more languages you know, the easier it is to pick up new ones - and go deep easier when you need to do so. 31 | 32 | ### **Pair with other developers more often** 33 | 34 | * Pairing with another developer can provide learning leaps that greatly accelerate your development 35 | * Pair to understand how other developer's think and learn from one another 36 | * Pair in order to write better and more maintainable code 37 | 38 | ### **Write unit tests and run them against a CI** 39 | 40 | * Unit testing is essential but in order to understand why you have to experience it saving you 41 | * You need to grunt away, and write those tests, have them run against a CI \(continuous integration\) 42 | * If you are just getting started, you can use [Travis CI](https://travis-ci.org) for free 43 | * Good test coverage on your code can really save a project as the team grows and evolves 44 | * The tests protect new developers from breaking things and pushing bugs to production 45 | * Tests allow you to make huge refactors and re-designs without fear 46 | 47 | ### **Make refactoring a habit and master refactoring tools** 48 | 49 | * Learn how to comfortably do both small and large refactors 50 | * Learn your IDE really well and how to use the editor to make refactors easier 51 | * Extracting a method, renaming a variable, moving into a constant 52 | * Make small refactoring a weekly habit 53 | 54 | ### **Know that good software engineering is experience. Get lots of it.** 55 | 56 | * The best software engineers have a mix of learned knowledge and real-world experience. The knowledge you can learn. The experience, you need to go after. 57 | * Look for opportunities to work on different stacks, different domains, and challenging projects. 58 | * Volunteer to work on new projects and try out new technologies as the first in the team 59 | * When you push yourself and work with engineers your senior, you accelerate quickly 60 | 61 | ### **Teach what you learn** 62 | 63 | * The best way to learn something is to teach it. 64 | * Write blog posts or create presentations for others in the company or communities 65 | * If you want to learn something well, sign up to do a public talk about that thing 66 | * The nice thing about teaching others is you can only win. Not only will you learn something by teaching, but you'll also help and inspire others. 67 | * Become a teacher and mentor for others. The earlier you start giving back and teaching, the more natural this will come. 68 | 69 | -------------------------------------------------------------------------------- /software-engineering/success-as-a-software-engineer/standing-out-in-entry-level.md: -------------------------------------------------------------------------------- 1 | # Standing Out at Entry-Level 2 | 3 | **Source:** [https://www.linkedin.com/pulse/how-stand-out-entry-level-software-engineer-xavier-e-l%C3%B3pez/](https://www.linkedin.com/pulse/how-stand-out-entry-level-software-engineer-xavier-e-l%C3%B3pez/) 4 | 5 | The author hopes that applying some of these will make you stand out and accelerate your early career as a developer. 6 | 7 | * **Always be learning** 8 | * Learning is considered a lifelong journey in this field 9 | * Read books and articles, take courses, and participate in workshops and hackathons 10 | * Sometimes, companies pay for you to do this, ask your manager about this 11 | * **Don't assume existing code is untouchable** 12 | * Well-intentioned code can have anti-patterns in it, be hard to read, get stale over time, and it can create bugs. So go ahead and suggest a change to the code, it may need it. 13 | * **If in doubt, underpromise and overdeliver** 14 | * Your goal should be to match and exceed expectations consistently 15 | * Best to consistently deliver on your goals and surprise people with your speed than to promise the moon but always be late. 16 | * **Embrace the grunt work** 17 | * See a problem? Volunteer to help fix it. See an area of improvement? Say yes to working on it. 18 | * As a result of it, the product improves, the productivity and morale of those around you go up, you learn a new skill, and you gain the respect of others. 19 | * You can then use this goodwill and track record to work on more exciting things over time. 20 | * **Code is social** 21 | * Review your teammates' code and learn from it. 22 | * Don't just read it, but also comment on it and ask questions. Learn from how people write code. 23 | * **Feedback = Improvement** 24 | * Explicitly ask for feedback from your manager and teammates. 25 | * Use this feedback to transform yourself continuously. 26 | * Remember that one of the best ways to learn is by doing the wrong thing, realizing why it's wrong, and then not doing it anymore. Rinse and repeat. 27 | * **Take ownership of something** 28 | * Work with your manager to find something that can be yours. 29 | * Working on a project of your own gives you a way to be unique, learn about all the stages of development, and cultivate accountability. 30 | * **Look for the low-hanging fruits** 31 | * There are many small things in the codebase that you can do with your current skillset. 32 | * Taking these on and showing off your skills right away is an excellent way to get noticed. 33 | * **Be everywhere** 34 | * Show up every day to discuss problems, answer your teammates' questions, celebrate wins, and provide moral support when things go wrong. 35 | * You want others to think that you've been at the company for much longer. 36 | * **Speak up** 37 | * It's a good idea to be humble in general, but you also want to communicate your thoughts, even if you lack experience. 38 | * People like to see new people with different perspectives add to the conversation. 39 | * **Rely on your manager** 40 | * Ask your manager to help you plan out your goals and to keep you accountable. They're there for you, use their time and support wisely. 41 | * **Have fun** 42 | * You want to enjoy doing this because you'll likely be doing it for many years. Find projects that connect with you, work on problems that excite you. 43 | * **Find informal mentors** 44 | * Have lunch, coffee with more experienced engineers, develop a rapport with them, and ask them questions you have. 45 | 46 | -------------------------------------------------------------------------------- /software-engineering/your-questions-answered/on-miscellaneous.md: -------------------------------------------------------------------------------- 1 | # On Miscellaneous 2 | 3 | ### How can I build up my programming fundamentals in Java? 4 | 5 | Chances are that you will be introduced to Java, Python, Lisp, and/or C++ in school at various points over your 4-years in college. Often, you might take a 101 intro class that starts you off with one of these languages. If you feel that your understanding of Java or other languages is lacking, this is nothing to be worried about, it’s very common for you to need to reinforce the concepts learned in class through additional online resources before having a deeper understanding. If you are interested in diving deeper with Java, check out our [Diving Deeper with Java](../../domain-specific/a-deeper-understanding-of-java.md) resources for a good place to start. 6 | 7 | ### Before graduating college, how important is your GPA as opposed to side projects in acquiring your first internship? 8 | 9 | If you have a strong GPA, make sure to list that on your resume. Include the higher of your cumulative GPA and your major GPA. If they’re both less than 3.5, leave them off your resume entirely. 10 | 11 | The importance of GPA depends on the company. Generally speaking, even if you don’t include your GPA on your resume, this will not be asked about and won’t prevent you getting an interview. Having side projects, hackathons, and other interesting real-world portfolio pieces will often provide you more impact in many cases than a high GPA. Of course, your mileage may vary and it never hurts to get good grades. 12 | 13 | ### Does it matter to companies if your CS Degree is a BA or a BS? Does it have any impact at all? And also what about a BA/MA and not a BS/MS? 14 | 15 | If you can pick and have the option, you may want to go with the BS. But for the most part, a computer science degree is a computer science degree and many companies/recruiters won’t differentiate. Some employers favor a BS degree because it is often more difficult and requires higher level math and sciences. **Bottom line is that you will be able to find great technical software engineering opportunities either way.** 16 | 17 | ### I’m studying something other than Computer Science, but I enjoy software stuff. How likely is it for non-traditional majors to slide into software roles? 18 | 19 | [“Software is eating the world”](https://a16z.com/2016/08/20/why-software-is-eating-the-world/). There is software powering every other modern professions. In addition, more and more companies are open to hiring STEM majors who are not Computer Science majors, especially if you have side projects and a Github profile. **In this case, your project portfolio is even more important. Be sure to work on side projects.** 20 | 21 | -------------------------------------------------------------------------------- /software-engineering/your-questions-answered/on-technical-interviews.md: -------------------------------------------------------------------------------- 1 | # On Technical Interviews 2 | 3 | ### What topics do I need to know in order to pass common technical interviews at top tech companies for internships or as a new college graduate? 4 | 5 | Technical internships or new college graduate roles often have the following: 6 | 7 | * Technical coding interviews \(data structures and algorithms\) 8 | * Past experience interviews \(“what have you done”\) 9 | * Domain-specific interviews \(“what do you know”\) 10 | 11 | Check out this [internship interview guide here](../../technical-interviewing/technical-interviewing-guide.md) for a look at all the details on how to prepare and what to expect. 12 | 13 | ### What courses on campus should I be taking while I am in college that are most important after I graduate? 14 | 15 | There are many foundational courses which are important as you go through your CS program. In particular, here are some classes and topics you’ll be glad you paid extra attention to: 16 | 17 | * **Data Structures and Algorithms.** Used in various ways and for technical interviews. 18 | * **Object-oriented programming.** Used almost everywhere. 19 | * **Functional programming.** Concepts such as callbacks and closures. 20 | * **Databases.** Any class on schema design and databases or SQL. 21 | * **Data Science / Machine Learning** \(for data science roles\) 22 | * **Regular expressions** \(useful all the time\) 23 | * **Compilers** \(good foundational parser knowledge\) 24 | * **Network security.** Buffer overflows, XSS, SQL injection, etc. 25 | * **Operating Systems.** This includes memory management, schedulers, etc. 26 | * **Project Management.** Anything related to managing technical projects. 27 | 28 | ### What kind of qualifications, qualities, skills, or knowledge, do companies look for in interns/prospective employees? 29 | 30 | Much of this is already covered in the other answers. It is important to know at least one language really well and to have applied this language in a context outside of class. Companies love finding interns and college hires who are excited about working there and that have side projects or previous software experience. 31 | 32 | -------------------------------------------------------------------------------- /software-engineering/your-questions-answered/on-the-internship-search.md: -------------------------------------------------------------------------------- 1 | # On the Internship Search 2 | 3 | ### How do I prepare an effective resume? 4 | 5 | Check out our [building an effective resume guide](../../artifacts/student-resume-guide.md) for a detailed look at the most important tips and tricks. 6 | 7 | ### How does one become a software engineer or get themselves to that position? 8 | 9 | If you are still in college, becoming a software engineer [starts with a technical internship search](https://medium.com/@seaon/3-step-guide-to-nail-your-internship-search-82ed58f7f6a). Check these articles for a bunch of specific details and steps on getting started. 10 | 11 | ### Where can I find lists of companies and open software development internships and roles? 12 | 13 | If you are interested in finding software companies that are looking for software engineers for full-time roles and internships, check out this list of [places to find software roles online](../../internship-and-job-search-strategy/finding-roles.md). This is a great way to explore the types of software skill-sets companies are most often hiring for. 14 | 15 | -------------------------------------------------------------------------------- /success-checklist.md: -------------------------------------------------------------------------------- 1 | # ✅ Success Checklist 2 | 3 | This guide provides a broad-ranging checklist to work towards a successful career as a software engineer. 4 | 5 | Whether you are a Freshman or a Senior, there is always plenty of things you can do right now to improve your chances of success in the technology industry. 6 | 7 | {% hint style="warning" %} 8 | Note that no one is an expert at everything and no one will be able to complete 100% of the items below. It’s okay and normal that you won’t know everything, and that you won’t complete this entire checklist. 9 | {% endhint %} 10 | 11 | Take things one step at a time. Try to focus your learning and time around particular goals. There’s an enormous amount to learn and do, and it’s really easy to get overwhelmed. Think of this as a guide towards getting your first/next technical internship and then first full-time role after graduation. 12 | 13 | **Top-level goals:** 14 | 15 | * Create an [effective resume and LinkedIn](artifacts/student-resume-guide.md) to prepare for your internship search 16 | * Acquire [technical internship interview readiness](technical-interviewing/technical-interviewing-guide.md) for phone screens and on-site interviews 17 | * Acquire confidence developing in one [industry tech stack](software-engineering/software-career-tracks.md) beyond what’s taught in classes 18 | * Work in at least one software internship position by summer of Junior year 19 | * Strengthen [your professional network](networking-and-communication/the-art-of-the-follow-up.md) with more engineers and motivated peers 20 | 21 | **Key action items:** 22 | 23 | * Develop an understanding of [what being a software engineer involves](software-engineering/your-questions-answered/) 24 | * Sign up for our “[Mobile App Design](http://codepath.org/classes/mobileappdesign)” workshop series to learn about mobile app design, how to code mobile apps, and learn from industry experts. 25 | * Apply for 3+ [early pre-internship summer programs](internship-and-job-search-strategy/early-internship-programs.md) (_Freshman/Sophomore_) 26 | * Complete a first course (SE101 or SE102) of our [software fundamentals course series](https://codepath.org/classes/interviewprep) 27 | * Complete one or more of our special topics courses (iOS, Android, Cybersecurity, etc) 28 | * Complete a second course (SE102 or SE103) of our [software fundamentals course](https://codepath.org/classes/interviewprep) series 29 | * Participate in our [virtual career fairs](https://codepath.org/career) which connects students directly to companies 30 | * Apply for as [as many technical internship positions](https://medium.com/@seaon/3-step-guide-to-nail-your-internship-search-82ed58f7f6a) as you possibly can (_Sophomore/Junior_) 31 | 32 | **Or complete additional action items:** 33 | 34 | * Further [studying for technical interviewing](technical-interviewing/studying-for-tech-interviews/), either by yourself or with peers leveraging online resources 35 | * Find [at least one mentor](bonus/finding-a-mentor.md) you can check-in with periodically that can provide you support or [sign up for a mentor through our tech mentorship program](https://codepath.chronus.com/) 36 | * Personally mentor at least one student earlier in their career than you to strengthen your own understanding 37 | * Help lead a class as a TechFellow on at least one course they completed or provide technical support to other students 38 | * Work in a 2nd technical internship before graduation 39 | * Contribute to [your first open-source project](software-engineering/your-questions-answered/#how-can-we-contribute-to-open-source-software-and-how-do-we-approach-or-get-started) 40 | * Launch a side project (web app or mobile) that some number of people other than yourself actually use 41 | * Attend local hackathons or coding events to collaborate on code and meet new students/engineers 42 | -------------------------------------------------------------------------------- /technical-interviewing/anatomy-of-an-interview.md: -------------------------------------------------------------------------------- 1 | # Anatomy of an Interview 2 | 3 | ## Ex-Googlers Guide to Interviewing 4 | 5 | When given a coding problem in an interview, whether on a whiteboard or on a hackpad, you’ll generally want to resist the temptation to jump straight into code, and instead solve the problem collaboratively with the interviewer roughly following a specific set of steps in order. 6 | 7 | ### Walkthrough Video 8 | 9 | Check out this [video by an ex-Googler for a walkthrough](https://youtu.be/uQdy914JRKQ): 10 | 11 | {% embed url="https://www.youtube.com/watch?v=uQdy914JRKQ&feature=youtu.be" %} 12 | Cracking a Google Interview 13 | {% endembed %} 14 | 15 | ### Steps Recap 16 | 17 | There are six key steps to follow within a coding interview: 18 | 19 | * **Step 1: Ask Clarifying Questions** - Ask the interviewer questions to better understand the problem. Check about edge cases, possible inputs, assumptions you can or can’t make, and verifying your understanding of the correct outputs. 20 | * **Step 2: High-level Discussion** - Explain the ideas you have in concept first without using much code to avoid wasting time writing code on a solution that won’t work. Instead, draw or diagram out a basic approach without code and explain the basic solution idea. If the problem is complex or you aren’t confident about the optimal approach, list out a few potential approaches you think might work (e.g iterative vs recursive, use data structure X or Y, etc). Discuss with the interviewer to get their feedback and look for any hints or guidance from them if they are more communicative (“Should I start coding with this approach?”). 21 | * **Step 3: Choose an Approach and Confirm Inputs and Outputs** - Pick a potential approach from above and then explain that you are going to start coding with that one in mind if the interviewer confirms this seems like a good direction. From there, you might start documenting the method “header” to confirm you understand the inputs being provided to you as well as explaining the outputs. You should list out several examples of inputs and then the expected outputs. Confirm the header, and the examples align with the interviewer's expectations and look for any hints or guidance they provide. 22 | * **Step 4: Start Writing Code and Thinking Aloud** - Start writing the body of your solution in code. The process is iterative, where you might write a bit of code, and then circle back to make sure that will work for all the example inputs. Then continue writing code. Think with specific examples in mind as you start on the code. Be sure to be talking while your work on the code, explaining aloud your thought process whenever possible for what you are doing. 23 | * **Step 5: Test Your Solution** - Walk through your code line by line using several examples of inputs, and verifying outputs. In other words, make sure your solution works reliably, especially for edge cases, blank inputs, or odd inputs. Track the output as it’s being created and show the interviewer, you believe each example works or if you do find an issue with a case, be clear that you caught a failing case for your current code. 24 | * **Step 6: Discuss Complexity** - If there is time at the end, check to see if your interviewer wants you to discuss space and/or time complexity of the code. You’ll explain the current time complexity of your solution, and then explain the space complexity of your solution. These are both using [Big-O notation and complexity analysis of code](https://www.interviewcake.com/article/java/big-o-notation-time-and-space-complexity), which are important concepts to understand before you interview. 25 | 26 | ## Whiteboard Interview Guidelines 27 | 28 | **Source**: [https://twitter.com/bria\_sullivan/status/1171852539551199232](https://twitter.com/bria\_sullivan/status/1171852539551199232) 29 | 30 | Here's an even more concise step of steps for tackling a whiteboard interview compatible with the more detailed framework above. 31 | 32 | #### Clarifying questions 33 | 34 | * Interviewers are usually asking you something vague on purpose. They want you to identify this. 35 | * For example: Is there a max character length on the input string? Are we expecting positive numbers only? 36 | 37 | #### Test Cases 38 | 39 | * Show your understanding by coming up with different inputs and outputs. 40 | * This also helps me come up with a solution and helps me understand the problem better. (It also helps me to actually write it out on the board) 41 | 42 | #### Propose a solution with pros and cons 43 | 44 | * Propose a possible solution then discuss the pros and cons. 45 | * Always mention storage and time complexity. 46 | * Also if your solution isn’t the most optimal, say that. It’s much better to have a working inefficient solution by the end than an unfinished solution trying to make it O(log n). 47 | * You’ll probably come up with a more optimal solution as you go anyway 48 | 49 | #### Start Coding the Solution 50 | 51 | * Actually write out the code. 52 | * Make sure to check for null. 53 | * Write the method signature, account for inputs, etc. 54 | * If you get stuck, Pause. 55 | * Build an example (maybe those inputs and outputs you had from earlier) and step through every single line. 56 | * Write down what each variable stores along the way (yay for dry erase I guess?) 57 | * This usually shows me what I need to do to get unblocked 58 | * If you reach this point (hopefully you do) and you have something that works (again, doesn’t have to be optimized) 59 | 60 | #### Try to break your code 61 | 62 | * Build more test cases and walk through your code to try to break it! 63 | * Usually, this is where I’ve seen places to make the solution better 64 | * Talk it out. Every time you write a conditional, say why. It’s usually conditional statements that make stuff work or not 65 | -------------------------------------------------------------------------------- /technical-interviewing/studying-for-tech-interviews/README.md: -------------------------------------------------------------------------------- 1 | # Studying for Tech Interviews 2 | 3 | Many technical interviews tend to involve being asked coding questions and then having to solve them. This typically involves working knowledge of data structures and algorithms. 4 | 5 | ### Getting Started 6 | 7 | #### What are “data structures and algorithms”? 8 | 9 | Data structures are just different ways or organizing and storing data within code. Examples of these are: Array, Linked Lists, Stack, Queues, Trees, Graphs, Sets, Hash Tables. 10 | 11 | Algorithms are simply a particular approach to solving a problem with code. Algorithms involve writing lines of code which often access data structures and then performs operations and calculations on the data \(sorting, searching, adding, removing, etc\). 12 | 13 | Used together, you can select one or more data structures to store your data, and then use particular algorithms to achieve a particular goal or solution within your software programs. 14 | 15 | For example, you might be asked to “reverse a linked list” or “sort an array of numbers” which combines a data structure \(linked list or array\) with an algorithm \(reverse or sort\). 16 | 17 | #### How should I study for technical interviews? 18 | 19 | Generally, studying for technical interviews involves the following steps: 20 | 21 | 1. Buy a book like [Cracking the Coding Interview](https://www.amazon.com/Cracking-Coding-Interview-Programming-Questions/dp/0984782850) and others recommended below. 22 | 2. Learn about the [specific steps you should be taking in a coding interview](../anatomy-of-an-interview.md) 23 | 3. Learn about the major data structures and the most common algorithms via videos, written guides, books 24 | 4. Practice easy problems online coding solutions to various problems that involve different data structures and algorithms you’ve read about 25 | 5. Learn about Big-O notation and how to evaluate how efficient your solution is 26 | 6. Review optimized solutions available to see how you can improve your solutions 27 | 7. Repeat. Practice more. Repeat again. Lots of repeating. 28 | 29 | Be aware that there are many different data structures and algorithms, and many different difficulty levels of problems ranging from relatively straightforward to very advanced techniques. 30 | 31 | Becoming confident and proficient in the full range of common interview questions could take months of studying and hundreds of hours. **Don’t get discouraged, be patient and remember to take things one step at a time**. 32 | 33 | #### How does a coding interview usually work? 34 | 35 | Check out our guide here for a [detailed breakdown of how interviews work](../technical-interviewing-guide.md). There are [specific steps to how to tackle a problem](../anatomy-of-an-interview.md) during a coding interview which should review carefully and practice. 36 | 37 | ### Core Topics for Review 38 | 39 | The following topics tend to be encountered most often in coding interviews broken up into multiple levels. Do not attempt to review all of them at once, instead study a few and then do some practice problems with them on sites linked later in this guide. 40 | 41 | If you are looking for introductions to these concepts that are fun and accessible, check out [BaseCS](https://hackmd.io/s/HJ9YQDE2b) and the [related podcast](https://www.codenewbie.org/basecs). You can also read through this [algorithms tutorial series](https://adrianmejia.com/blog/2018/04/04/how-you-can-change-the-world-learning-data-structures-algorithms-free-online-course-tutorial/). 42 | 43 | **Level 1** 44 | 45 | * Basic data structures I: [Hash Tables](https://www.interviewcake.com/concept/hash-map), [Stacks](https://www.interviewcake.com/concept/stack), [Queues](https://www.interviewcake.com/concept/queue) 46 | 47 | **Level 2** 48 | 49 | * Basic data structures II: [Linked Lists](https://www.interviewcake.com/concept/linked-list), [Arrays](https://www.interviewcake.com/concept/array), [Strings](https://medium.com/modernnerd-code/java-for-humans-string-manipulation-5573acac6aa5) 50 | * Complexity Analysis: [Big-O Notation](https://www.interviewcake.com/big-o-notation-time-and-space-complexity) 51 | 52 | **Level 3** 53 | 54 | * Traversal data structures: [Binary Trees](https://www.interviewcake.com/concept/binary-tree), [Graphs](https://www.interviewcake.com/concept/graph) 55 | * Searches: [Binary Search](https://www.interviewcake.com/concept/binary-search), [Breadth First Search](https://www.interviewcake.com/concept/bfs)/[Depth First Search](https://www.interviewcake.com/concept/dfs) 56 | 57 | **Level 4** 58 | 59 | * Advanced I: [Recursion, Backtracking and Combinatorials](https://www.interviewcake.com/concept/java/bottom-up) 60 | * Advanced II: [Dynamic Programming](https://www.interviewcake.com/concept/overlapping-subproblems) and [Greedy Algorithms](https://www.interviewcake.com/concept/greedy) 61 | 62 | Check the books and links below for more resources to use while practicing and learning data structures and algorithms. 63 | 64 | ### Buy a Book: Cracking The Coding Interview 65 | 66 | If you only want one book for technical interview prep, download [Cracking The Coding Interview](https://github.com/sunilsoni/Interview-Preparation/raw/master/books/Cracking%20the%20Coding%20Interview%2C%206th%20Edition%20189%20Programming%20Questions%20and%20Solutions.pdf) or [buy the book on Amazon](https://www.amazon.com/Cracking-Coding-Interview-Programming-Questions/dp/0984782850). 67 | 68 | * The “Before the Interview” section goes over resume tips, common non-technical questions you may be asked, and an overview of the technical topics you want to familiarize yourself with. 69 | * The “Interview and Beyond” section has general strategies for how to approach the interview, solving technical questions, and negotiating once you get an offer. \(We highly recommend reviewing this section\). 70 | * The rest of the book is the interview questions split into different sections based on topic, focus on the topics you’re least comfortable with. For intern/new grad applicants, I’d recommend prioritizing Chapters 1-4, 8, 9, and 11 since those sections cover the core topics. 71 | 72 | If you are looking for additional books that are complementary to CTCI, we recommend: 73 | 74 | * [Algorithms to Live By: The Computer Science of Human Decisions](https://www.amazon.com/Algorithms-Live-Computer-Science-Decisions/dp/1250118360) - This is more of a casual look and more “fun” then CTCI 75 | * [The Algorithm Design Manual](https://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena/dp/1849967202/) - Great for interview prep but also more in-depth and better at painting the big picture. Also provides interesting real life case studies of certain algorithms and data structures. 76 | * [Introduction to Algorithms](https://www.amazon.com/Introduction-Algorithms-3rd-MIT-Press/dp/0262033844) - This is not as accessible to newcomers or beginners, but if you want a comprehensive and exhaustive algorithms bible, this is the book for you! 77 | 78 | ### Practicing Problems 79 | 80 | You can review and practice problems at all these websites below: 81 | 82 | * [Leetcode](https://leetcode.com/): LeetCode is a great platform to help you enhance your skills, expand your knowledge and prepare for technical interviews. 83 | * [InterviewBit](https://interviewbit.com/) - Online site for practicing interview questions 84 | * [Firecode.io](https://www.firecode.io/): For daily technical interviews practice which incorporates fundamentals. 85 | * [HackerRank](https://www.hackerrank.com/):Leading end-to-end technical recruiting platform for hiring engineers. 86 | * [Career Cup](https://www.careercup.com/page): Peers post interview questions they have been asked, and other can contribute their own answers to these questions. A major goal of this website is to give users an inside look at the interview process of different companies. They also offer a mock interview service. 87 | * [Project Euler](https://projecteuler.net/): Project Euler is a series of challenging mathematical/computer programming problems that will require more than just mathematical insights to solve. 88 | * [Python Tutor](http://pythontutor.com/visualize.html#mode=edit): Python Tutor helps students overcome a fundamental barrier to learning programming: understanding what happens as the computer runs each line of source code. Visualize Python, Java, JavaScript, TypeScript, and Ruby code execution. 89 | 90 | You can practice interviewing on a video chat with: 91 | 92 | * [Pramp](https://www.pramp.com/#/) - Practice coding interviews live! 93 | * [Interviewing.io](https://interviewing.io/): Free, anonymous technical interview practice with engineers. 94 | 95 | -------------------------------------------------------------------------------- /technical-interviewing/studying-for-tech-interviews/interview-prep-resources-part-2.md: -------------------------------------------------------------------------------- 1 | # Prep Resources, Part 2 2 | 3 | **Source:** [https://twitter.com/RandallKanna/status/1263309093457944576](https://twitter.com/RandallKanna/status/1263309093457944576) 4 | 5 | * [TeachYourselfCS](https://teachyourselfcs.com) includes incredible book suggestions for learning everything you need to know about CS. I have a ton of these books. 6 | * [Harvard's \(free!\) Introduction to Computer Science course](https://t.co/uaCiaJgiGA?amp=1) is a classic. 7 | * Feeling overwhelmed and need somewhere to start? Want a great JavaScript resource? [Try this course](https://t.co/3SqMVNJtgs?amp=1) 8 | * [Data Structure and Algorithm Course](https://www.udemy.com/course/coding-interview-bootcamp-algorithms-and-data-structure/) on Udacity \(and a [good follow-on course](https://www.udemy.com/course/js-algorithms-and-data-structures-masterclass/)\) 9 | * A [multi-month study plan for winning at an interview](https://t.co/1oRpUXbYu7?amp=1) with Google or Facebook even if you don't have a CS degree. Definitely the most thorough guide I've ever seen. 10 | * [Leetcode to practice questions for interviews](https://leetcode.com/problemset/all/) 11 | * [Get some experience interviewing with free mock interviews online](https://www.pramp.com/) 12 | * [Gaming CS Interviews](https://blog.transitivebullsh.it/gaming-cs-interviews/) - Great article on how to succeed in technical interviews 13 | * [HackerRank Interactive Prep Kit ](https://www.hackerrank.com/interview/interview-preparation-kit) 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /technical-interviewing/studying-for-tech-interviews/interview-prep-resources-part-i.md: -------------------------------------------------------------------------------- 1 | # Prep Resources, Part I 2 | 3 | ℹ️ Below is an even longer list of resources for technical interview prep you can check out: 4 | 5 | ### Courses 6 | 7 | * [Udacity Interview Course](https://www.udacity.com/course/technical-interview--ud513) 8 | * [Cousera Interview Course](https://www.coursera.org/learn/introduction-to-algorithms) 9 | * [10 Suggested Courses on the Coding Interview](https://hackernoon.com/10-data-structure-algorithms-and-programming-courses-to-crack-any-coding-interview-e1c50b30b927) 10 | 11 | ### Articles 12 | 13 | * [Ace the coding interview, every time](https://medium.com/@nickciubotariu/ace-the-coding-interview-every-time-d169ce1fd3fc#.3w767vppf) 14 | * [Get That Job at Google](http://steve-yegge.blogspot.com/2008/03/get-that-job-at-google.html) 15 | 16 | ### Cheat Sheets 17 | 18 | * [Google Interview University](https://github.com/jwasham/google-interview-university) 19 | * [Tech Interview Cheat Sheet](https://gist.github.com/TSiege/cbb0507082bb18ff7e4b) 20 | * [Algorithms, Data Structures, & Big O Cheat Sheet](http://cooervo.github.io/Algorithms-DataStructures-BigONotation/) 21 | * [Big O Cheat Sheet](http://bigocheatsheet.com/) 22 | * [Princeton Algorithms and Data Structures Cheat Sheet](http://algs4.cs.princeton.edu/cheatsheet/) 23 | * [Algorithmic Cheat Sheet](https://sinon.org/algorithms/#data-structures) 24 | 25 | ### Explainers 26 | 27 | * Big O & Complexity Analysis 28 | * [Big O Notation](https://www.interviewcake.com/article/java/big-o-notation-time-and-space-complexity) 29 | * [The Idiots Guide to Big O](http://www.corejavainterviewquestions.com/idiots-guide-big-o/) 30 | * Java 31 | * [Guide to Selecting Appropriate Map/Collection in Java](http://www.sergiy.ca/guide-to-selecting-appropriate-map-collection-in-java/) 32 | * Visualizations 33 | * [VisuAlgo](http://visualgo.net/) - visualising data structures and algorithms through animation 34 | * [15 Sorting Algorithms in 6 Minutes](https://www.youtube.com/watch?v=kPRA0W1kECg) 35 | * [Data Structure Visualizations](https://www.cs.usfca.edu/~galles/visualization/Algorithms.html) 36 | * [Sorting Algorithms Animations](https://www.toptal.com/developers/sorting-algorithms/#) 37 | 38 | ### Code 39 | 40 | * [Algorithms and Data Structures implemented in Java](https://github.com/phishman3579/java-algorithms-implementation) 41 | 42 | ### Books 43 | 44 | * [Elements of Programming Interviews](https://www.amazon.com/Elements-Programming-Interviews-Insiders-Guide/dp/1479274836) 45 | * [Algorithms \(4th Edition\)](http://www.amazon.com/gp/product/032157351X/) 46 | * [Algorithms in a Nutshell](https://www.amazon.com/Algorithms-Nutshell-OReilly-George-Heineman/dp/059651624X) 47 | 48 | ### Concept Overview 49 | 50 | The “computer science” technical interviews are probably one of the most important parts of getting a job at a company like Facebook, Google, or Microsoft. You need to understand them to be prepared for an interview. Studying for these problems is the best way to become comfortable enough to be able to solve challenges they throw at you. These questions are about topics such as: 51 | 52 | * Data Structures \(Linked List, Binary Tree, Graphs\) 53 | * Data Traversal and Manipulation \(Sorting, Constructing\) 54 | * String and Token Parsing 55 | * Array Manipulation 56 | * Regular Expressions 57 | * Combinatorial Sets or Permutations 58 | * Recursive Algorithms 59 | 60 | Here’s a few specific topics in-more depth to ensure you are familiar with \(sourced from [this article](http://steve-yegge.blogspot.com/2008/03/get-that-job-at-google.html)\): 61 | 62 | * **Algorithm Complexity**: you need to know Big-O. It’s a must. If you struggle with basic big-O complexity analysis, then you are almost guaranteed not to get hired. It’s, like, one chapter in the beginning of one theory of computation book, so just go read it. You can do it. 63 | * **Sorting**: know how to sort. Don’t do bubble-sort. You should know the details of at least one n\*log\(n\) sorting algorithm, preferably two \(say, quicksort and merge sort\). Merge sort can be highly useful in situations where quicksort is impractical, so take a look at it. 64 | * **Hashtables**: hashtables are arguably the single most important data structure known to mankind. You _absolutely have to know how they work_. Again, it’s like one chapter in one data structures book, so just go read about them. You should be able to implement one using only arrays in your favorite language, in about the space of one interview. 65 | * **Trees**: you should know about trees. basic tree construction, traversal and manipulation algorithms. You should be familiar with binary trees, n-ary trees, and trie-trees at the very least. Trees are probably the best source of practice problems for your long-term warmup exercises.You should be familiar with at least one flavor of balanced binary tree, whether it’s a red/black tree, a splay tree or an AVL tree. You should actually know how it’s implemented. You should know about tree traversal algorithms: BFS and DFS, and know the difference between inorder, postorder and preorder. 66 | * **Graph:** There are three basic ways to represent a graph in memory \(objects and pointers, matrix, and adjacency list\), and you should familiarize yourself with each representation and its pros and cons. You should know the basic graph traversal algorithms: breadth-first search and depth-first search. You should know their computational complexity, their tradeoffs, and how to implement them in real code. 67 | 68 | If you understand these topics, that should act as a baseline for being prepared for an “algorithms”-based interview. 69 | 70 | -------------------------------------------------------------------------------- /technical-interviewing/studying-for-tech-interviews/study-game-plan.md: -------------------------------------------------------------------------------- 1 | # Study Game Plan 2 | 3 | **Source**: [The One Year Plan For Cracking Coding Interviews](https://medium.com/@anjaliviramgama/the-one-year-plan-for-competitive-coding-6af53f2f719c) 4 | 5 | It can take a year to become proficient in coding interviews for getting internships at top tech companies, but it is possible with practice and a good gameplan. 6 | 7 | ### Here’s the plan: 8 | 9 | * Month 1: Big O Notation, Arrays, and Strings 10 | * Month 2: Linked Lists 11 | * Month 3: Stacks and Queues 12 | * Month 4: Trees, Binary Search Trees, AVL Trees 13 | * Month 5: Hashmap, Dictionary, HashSet 14 | * Month 5: Graphs 15 | * Month 6: Recursion, Dynamic Programming, Backtracking 16 | * Month 7: Sorting and Searching 17 | * Month 8: Reading\(about system design, scalability, PM questions, OS, threads, locks, security basics, garbage collection, etc. basically expanding your knowledge in whatever field required, depending on your target role\) 18 | * Month 9, 10, 11, 12: A mix of medium and hard questions in your preferred website. Practice by participating in contests, focusing on topics that you are weak at, mock interviews, etc. 19 | 20 | ### Notes: 21 | 22 | * Here’s how I approach every topic in each month — Let’s say you are in month 4, and focusing on trees. You need to first understand what trees are, different types of trees, and be able to define class Node and Tree. You then need to be able to perform basic operations like adding, finding, and deleting an element, pre-order, in-order, post-order, and level-by-level traversal. Lastly, you practice different tree questions available on Hackerrank, Leetcode, or a website of your choice. You should target the easy questions first, and once you are comfortable, move on to medium and hard. 23 | * The last 4 months are for solving a mix of different questions, via contests or otherwise, which is necessary because when you are practicing tree questions, you know you have to use a tree. But if you are given a random question, how will you know a tree would be the best approach? Also, always look for the most optimal solution in forums after solving it yourself. 24 | * You have an entire month, and if you manage to dedicate 40–70 hours a week, you’ll be able to master trees in such a way that if a tree question is thrown at you in an interview, you’ll be able to mostly solve it since you trained your mind to think that way with intense practice. If you are a student, dedicating this much time is definitely doable, even with side projects, homework, etc. Your grades might take a hit \(my As became Bs in that one semester\(month 9,10, 11, 12\) when I was dedicating over 8 hours a day to competitive coding\) but it was worth it. 25 | * You should also try to build projects or do research on the side while preparing. 26 | * Some people learn better by participating in contests in CodeForces, CodeChef, etc. while others prefer practicing questions. Again, there is no benefit of one over the other, do what you personally prefer. 27 | * I do not believe in practicing particular topics for a particular company, some websites claim to have a set of questions dedicated to a particular company, eg: cracking the Google interview. I think the goal should be to be a better developer overall, focusing on just a few topics that Google tends to test candidates on may not be the best way to follow. 28 | * Interviewers also judge you based on your LinkedIn, Resume, past experiences, courses taken, Github, degrees and certifications, projects, research papers, etc. Practicing competitive coding does not guarantee a job, but it does guarantee you’ll be able to crack technical interview rounds most of the time, and you’ll also be a better developer overall, which might help you when you build projects. 29 | * Lastly, don’t stop. It may seem easy at first when you are motivated, but that fuel dies in a month or so. Keep your goal in mind, of course, it’s going to be hard, but the only ones who make it are those who stick to the plan. You can edit the plan if you need to, but once done, stick to it, even on your lazy days, even when you have a college fest or a party to attend, even when you are sleepy. Like I said, the ones who succeed are the ones who \***stick to the plan**\*. 30 | 31 | -------------------------------------------------------------------------------- /technical-interviewing/studying-for-tech-interviews/technical-interview-types.md: -------------------------------------------------------------------------------- 1 | # Technical Interview Types 2 | 3 | **Source**: [https://www.freecodecamp.org/news/software-engineering-interviews-744380f4f2af/](https://www.freecodecamp.org/news/software-engineering-interviews-744380f4f2af/) 4 | 5 | ### **Algorithm Interviews** 6 | 7 | The most common type of interview you will encounter. The interviewer will ask you to solve a problem on a whiteboard which will assess your knowledge of data structures, sorting algorithms, recursion, time/space complexity analysis as well as pattern and edge-case recognition. In this interview, you will most typically come up with a brute-force solution, and then try to improve upon that solution and discuss the tradeoffs, if there are any, with the different solutions you propose. 8 | 9 | ### **Architecture Design Interviews** 10 | 11 | The interviewer will ask you to design a system \(on a whiteboard of course\) such as a car park ticketing system, chat messenger, twitter feed, amongst other common systems. 12 | 13 | What you’re being assessed on is how you take a broad concept and design a system which meets all the requirements and constraints. But it’s up to the candidate to ask the right questions, which define the requirements and constraints. This interview is more of a conversation mixed in with some drawing diagrams and perhaps even class structuring. Everything is quite high-level, so you won’t be writing any actual implementation code. 14 | 15 | Naturally, you should steer the conversation to cover your knowledge of how systems work. If you’re a backend engineer, you wouldn’t really go into the mechanics of the client application details unless you had some previous expertise in that area. I’m an iOS engineer, so I talked about architecture patterns, modularisation of functionality, design patterns instead of how to scale the API endpoints, adding workers, AWS**,** and such. 16 | 17 | ### **Behavioral Interviews** 18 | 19 | The interviewer will ask you questions about yourself and how you deal with certain types of situations. The preparation for this one isn’t as difficult as the others but does require a lot of introspection on your own behalf. 20 | 21 | The questions are typically along the lines of: 22 | 23 | * _How do you deal with failure?_ 24 | * _What is your biggest weakness?_ 25 | * _How do you resolve conflicts?_ 26 | * _What would you do differently?_ 27 | 28 | Just be genuine, show passion for your work, own your flaws, show initiative for improvement and you’ll do fine. 29 | 30 | ### **Pair Programming** 31 | 32 | An interesting category for which you will be paired with another engineer in front of a computer which has been set up with a development environment, much like what you would be using in the real world. You’re given a basic task with a list of requirements which you must complete, as you finish each task the interviewer will ask you to implement more functionality until the time limit is reached. You’re free to use whichever resources you want, such as Stack Overflow or online documentation. 33 | 34 | I feel like a lot of a candidate’s success in this interview would be determined by exposure to real-world experiences. Unlike whiteboarding, writing syntactically correct code is required, so you should know your language and environment inside and out because you don’t want to be spending too much time on the internet or documentation searching for answers. 35 | 36 | ### **Testing Domain Knowledge** 37 | 38 | Programming is fundamentally the same across most of the common languages we see today. Chances are if you know object-oriented programming in one language, those skills will mostly transfer to another. 39 | 40 | However, this interview focuses on the aspects that cannot be transferred between languages or frameworks. You will be interviewed on environment specificities relating to API, memory management, capabilities, constraints, history, and so forth. 41 | 42 | ### **Culture Fit** 43 | 44 | This is usually paired with the Behavioural interview and is focused on finding whether you are aligned with the company’s values. For example, Facebook follows the hacker-like culture of being bold and shipping new ideas, trial by experimentation, not being afraid to break things. Whereas Airbnb wants to create a world where people feel like they belong anywhere they go, so they look for people with great hospitality skills. 45 | 46 | A lot of the big tech companies put a lot of emphasis on the culture and hire people based on that person’s alignment with their values. If you’re interviewing at one of these companies, it’s important that you look up their values and find past experiences in which you’re able to relate and communicate to your interviewer. 47 | 48 | ## **Minimum knowledge** 49 | 50 | If anyone were to ask me what I felt would be areas to focus on, I’d suggest the following: 51 | 52 | * **Learn to write code by hand** on paper and a whiteboard first and then throw it into an IDE for syntax highlighting, this should become second nature to you. 53 | * **Develop deep knowledge of data structures**, their strengths, and weaknesses in comparison to each other. I discovered that implementing data structures and their behaviors from scratch taught me so much more than what I knew from their abstract concepts. 54 | * **Completely understand Big O notation** for both time and space complexities, this will pair perfectly with your algorithm and sorting questions. 55 | * **Grasp all major sorting algorithms** because the difference in time/space complexities have the potential to derail your optimum solution for an algorithm you’re trying to solve. 56 | 57 | ### **When to start** 58 | 59 | Depending on your timeline, you may want to start sooner than later. A lot of the companies I interviewed with had a 12 month cooling period before a failed candidate could reapply. On the flip side, if you know you won’t be ready within a year, you may as well start the process now and get a small taste of what it’s like to go through the interview process so when you are ready, it won’t be nearly as scary. 60 | 61 | ## **Resources** 62 | 63 | **Mock Interviews** 64 | 65 | * [interviewing.io](https://interviewing.io/) \(beta\), Free 66 | * [Pramp](https://www.pramp.com/#/), Free 67 | * [CareerCup](https://careercup.com/interview), Paid 68 | 69 | **Algorithms** 70 | 71 | * [Cracking the Code Interview](https://www.amazon.com/Cracking-Coding-Interview-Programming-Questions/dp/0984782850/ref=sr_1_1?s=books&ie=UTF8&qid=1506042558&sr=1-1&keywords=cracking+the+code+interview), Book 72 | * [byte by byte](http://www.byte-by-byte.com/), Website & YouTube 73 | * [CS50](https://www.youtube.com/user/cs50tv), YouTube 74 | * [Interview Cake](https://www.interviewcake.com/), Website 75 | * [HackerRank](https://www.hackerrank.com/), Website 76 | * [LeetCode](https://leetcode.com/), Website 77 | 78 | **Operating Systems** 79 | 80 | * [Operating System Concepts](https://www.amazon.com/Operating-System-Concepts-Abraham-Silberschatz/dp/1118063333/ref=sr_1_1?s=books&ie=UTF8&qid=1506042402&sr=1-1&keywords=Operating+System+Concepts), Book 81 | 82 | **Architecture Design** 83 | 84 | * [Intro to Architecture and Systems](https://www.youtube.com/watch?v=ZgdS0EUmn70), YouTube 85 | 86 | **Behavioral** 87 | 88 | * [Intro to Behavioural Interviews](https://www.youtube.com/watch?v=PJKYqLP6MRE), YouTube 89 | 90 | -------------------------------------------------------------------------------- /what-is-codepath.org.md: -------------------------------------------------------------------------------- 1 | --- 2 | description: >- 3 | In this section, we explore what CodePath is, how we got started, what we 4 | offer to students, and why we look forward to working with you. 5 | --- 6 | 7 | # 💻 What is CodePath.org? 8 | 9 | ## Why CodePath.org? 10 | 11 | CodePath.org isn’t about taking a class or a program. Our focus as a non-profit organization is to **help every potential and current CS student accelerate their pathway to becoming a successful software engineer**. And perhaps as importantly, to **work to transform and improve the tech industry** with all of your help each step along the way. 12 | 13 | Over the past seven years, we've trained thousands of engineers within some of the biggest companies in Silicon Valley including Facebook, Netflix, Airbnb, Youtube, Dropbox, and more. 14 | 15 | We are sponsored by [many of the largest employers in the US](https://blog.codepath.org/microsoft-walmart-and-cognizant-invest-3-million-in-codepath/) including Walmart, Microsoft, Facebook, and Cognizant. We wanted to use our years of experience as entrepreneurs, engineers, and educators to create a bridge from the industry back to university students all across the United States. 16 | 17 | {% hint style="success" %} 18 | As a 501(3)(c) non-profit educational organization, we are incredibly proud to share that **all of our programs and services are 100% no-cost for students** (outside of the normal costs in the case of for-credit courses we provide at your campus). This is a critical value for us, we remember first-hand how difficult it is in college, and would never want to limit participation in these programs. 19 | 20 | In addition, we provide ample opportunities for students to step up into paid contracting roles, and pathways into their first technical internships and software roles. 21 | {% endhint %} 22 | 23 | ### Video Overview 24 | 25 | Check out our video here to learn more about how we got started and our mission from **Tim Lee**, [CodePath.org](https://codepath.org) Co-founder: 26 | 27 | {% embed url="https://www.youtube.com/watch?v=QAWNiJ3zNWI&feature=youtu.be" %} 28 | Listen to Tim Lee, one of the co-founders of CodePath on "Why CodePath?" 29 | {% endembed %} 30 | 31 | ### Benefits Overview 32 | 33 | Participating in our programs should span multiple courses, signing up to our career center, and access to direct opportunities for internships through our career fair. Benefits of being a part of CodePath include: 34 | 35 | * **Real-world domain experience**. The more experience you have with practical industry skills such as mobile, web, or Cybersecurity, the more confident and prepared you’ll be in interviews and once you are on the job. 36 | * **Industry career center**. All CodePath.org students that complete the prereqs have access to our software engineering career center, including resume/LinkedIn review & feedback, 1:1 coaching sessions, and virtual career fairs introducing you directly to companies. 37 | * **Building out your portfolio**. One important aspect of getting internships and positions is having a portfolio of projects you can talk about in interviews and that recruiters can review online. 38 | * **Developing your network**. Expanding your connections and meeting professional engineers is an important part of finding opportunities in industry. Over your time with CodePath, you’ll have access to mentors from industry and connect with many other students that share similar goals. 39 | 40 | The first major step to success after graduation is **landing a summer technical internship** (or co-op). _80% of CodePath students get a technical internship before their Senior year._ This is crucially important because an internship makes getting a great full-time job much easier after you graduate. 41 | 42 | ### Shared CodePath Values 43 | 44 | As part of being a student with CodePath, we hope to share with you the following values: 45 | 46 | * **Never give up a sense of curiosity and humility.** The desire and curiosity to learn new skills, and the courage to admit you don't know are some of the most valuable skills you can hold onto as you advance in your career. There is always more to learn, there are always things you don't know, and there are always ways to grow. Seek those out and be open to them along the way. 47 | * **Mastery through service.** No matter if you just started out, or if you've been working as an engineer for 20 years, there's always someone else that you can help and support. The more you mentor and teach others, the better you understand the concepts yourself. The best thing you can do is start mentoring and teaching whenever possible as part of your own journey into being a leader. 48 | * **Never forget the journey.** Related to the above, and intertwined is the importance of lifting others while you climb in tech roles yourself. Remember how difficult it can be to start out, how little you know at the beginning, how difficult it can be to get that first internship or that first role. How nervous you were before the first technical interview. Remembering this is the first step to the next item. 49 | * **Actively work to transform and reform the existing systems.** There is a near infinite room for improvement in the tech industry on every front. Work with us and other students and industry engineers to help change and improve the industry from within. As your influence, ability, and network grows, so does your responsibility to help think about the tech industry itself as a system: what is working? what is broken? what can I do to help push things in the right direction? 50 | 51 | ### You Should Know... 52 | 53 | * Within software engineering, there are [many exciting specializations and disciplines](software-engineering/software-career-tracks.md). However, the majority of the jobs by far are in application development, whether that be web, mobile, or desktop products. 54 | * This is a great time to get into the tech industry. Salaries for software engineers can often be six figures right out of college in major tech hubs (San Francisco, Seattle, Portland, Boston, New York, etc). A few years into a career as a mobile engineer, you'll often be making 125-150k a year or more. 55 | * Beyond salary, often the challenges you get to work on are interesting, there are a lot of different products to work on ranging across the spectrum of interests in Healthcare, Entertainment, Finance, et al. Work is very collaborative and creative, working with other engineers as well as product managers and designers. 56 | * There's a lot of flexibility as a software engineer, you can find roles that are working from home, or where you start at 11am, or where you work mostly by yourself, or where you are frequently collaborating with others. There's a tremendous range of options of how, when and where you work as an engineer. 57 | 58 | ### What Courses Does CodePath Have? 59 | 60 | We have a number of [different courses for you take](https://codepath.org), some run on your campus and others happening remotely via Zoom classroom. Our available courses each year include: 61 | 62 | * **Software Fundamentals Series** - Free summer technical interview prep series 63 | * **Cybersecurity** - Learn the secrets of hacking in our Cybersecurity course 64 | * **iOS** - Learn how to design and build apps for your iPhone 65 | * **Android** - Learn how to design and build apps for your Android phone 66 | 67 | In addition to these courses, we plan to offer new courses in the future focused on any exciting career tracks in software engineering. 68 | --------------------------------------------------------------------------------