The developersIndia Community Wiki

All Contributors Discord Subreddit subscribers

Welcome to the DevelopersIndia Community Wiki repository! This repository is home to our face-lifted community wiki which you'll find across all the platforms our community is active on. So, feel free to read through our wiki or perhaps if you're interested in contributing to the project, this README will come in handy for you.

What wiki(s) to contribute?

The first and foremost goal of a wiki is that it helps the community, and becomes an official standing on the topic. We have a bunch of topics being requested over time. We request any author to have a look over them before creating a new proposal.

Contributing to the Wiki

We welcome community contributions to the project! If you would like to share a word or two that you believe will help the community achieve something good, please read this section for instructions.

First off, we use the mdbook project to maintain, create & generate the static version of our wiki. So, if you would like to get your hands dirty with this project, make sure you've read the official mdbook documentations. Besides the CLI tool, we also write our wiki content in GitHub Flavoured Markdown. So if you need a rundown on how to write in Markdown, the Markdown Guide will be helpful for that cause.

That said, before contributing to the project make sure you've read & understood the contributing guidelines of our community. Once you have read through it, please keep the following points in mind to create a wiki entry:

  1. Ensure your wiki is comprehensive enough & benefits the community in some ways.
  2. Ensure your wiki entry is thoroughly reviewed for correctness & quality by one of the moderators (you can reach out to us over Discord).
  3. Follow the issue & pull request templates to create a wiki entry for one of the moderators to review it. Expect the review process to take a while before it can be merged.

For a more detailed guide on contributing or creating a wiki, refer to the contributing guidelines document of the project.

License & Usage Terms & Conditions

The community wiki is licensed under the terms & conditions (T&Cs) of the Creative Commons license. If you're interested in reading more about it, please take a look at the LICENSE document.

Contributors ✨

Thanks go to these wonderful people (emoji key):

Bhupesh Varshney
Bhupesh Varshney

👀 🖋 🤔 📆
Somraj Saha
Somraj Saha

👀 🖋 🤔 📆 🚇 🔧 💻
Shreyas Gupta
Shreyas Gupta

🖋 🤔
Govind S Nair
Govind S Nair

🖋
Triach Rold
Triach Rold

🖋
Sanam Dhar
Sanam Dhar

🖋
Akash
Akash

🖋

This project follows the all-contributors specification. Contributions of any kind are welcome!

How to Start DSA

Every company is having Competitive Programming-based OA rounds and is asking DSA in tech rounds these days. If you're not doing DSA, the number of companies you can apply to gets drastically reduced. So here's a guide on how you can get started with DSA to ace those OAs and interviews.

Pick a Language

The most popular languages for doing DSA are C++, Java, and Python (in decreasing order). You can do DSA in any language you desire; however, picking one of the popular options is better since you will have access to many more resources and help online. If you have no language bias, I would recommend C++.

When doing competitive programming, it's generally preferred to use C++ or Java over Python since you're working with a time limit, and Python, being an interpreted language, is a bit slower than the other two options.

Get Started

Syllabus

Here is a rough syllabus of topics that you'll need to cover:

  • Programming Basics
    • Data types
    • I/O
    • etc.
  • Time Complexity and Space Complexity
  • Searching
    • Linear Search
    • Binary Search
  • Sorting
    • Selection Sort
    • Bubble Sort
    • Merge Sort
    • Quick Sort
  • Data Structures
    • Sets
    • Maps
    • Stacks
    • Queues
    • Linked Lists
  • Number Theory
  • Bit Manipulation
  • Recursion
  • Greedy Algorithms
  • Graph Theory
    • DFS
    • BFS
    • Dijkstra
    • Binary Search Trees
  • Dynamic Programming
  • Other Specific Algorithms:
    • Hashing
    • Sliding Window
    • Divide and Conquer

Learning Resources

Okay, I know the syllabus, where do I learn from?

Books

If you prefer the book learning approach, you are covered:

Video Lectures

If you prefer the video lecture approach:

  • Luv CP/DSA Playlist - Not to be confused with Luv Babbar, this is a different guy. The playlist is great, and he's a great teacher. The playlist is C++-focused, but the explanation of concepts will be language agnostic. Warning: This playlist is in Hinglish.
  • Aditya Verma - Very popular for his Dynamic Programming playlist but also has playlists on other concepts like Binary Search, Recursion, Stacks, Sliding Window, etc.
  • Striver - Very popular for his problem set but has nice playlists explaining some topics like Recursion, DP, Greedy Algos, Binary Search, Trees
  • LuvBabbar - Not a big fan of the guy personally, but this is a well-compiled playlist to study all the topics.

Roadmaps

If you want to follow a laid-out roadmap:

Other Helpful Websites

To quickly brush up on any algorithm:

  • CP-Algorithms - An absolutely brilliant resource website. You can look up any algorithm, and this website will give you a great theory explanation along with pseudocode, if not full C++ code. It also provides relevant questions from CP websites. No BS, to-the-point website.

Questions

I know the syllabus, I have understood the concepts, where and which questions do I solve?

If you're starting off with the absolute basics, before jumping onto the problem sets, consider doing some practice on the easy questions. For that, you can jump onto Leetcode Easy and keep solving until you feel comfortable solving any Easy question insight. Then you can move on to the problem sets and start solving topic-wise questions.

Compiled Problem Sets

Here are some compiled problem sets that are considered enough to conquer any interview you want:

  • InterviewBit Question Set - Topic-wise questions that are asked many times by top companies, ranging from easy to hard. Personally, I used this site during my placement season. Major recommendation.
  • 450 DSA Cracker - Luv Babbar's 450 question list. Very popular list among students.
  • Blind 75 LC - Popular list of 75 questions that, if you can solve, you can confidently crack any interview.

For OA Practice

A big factor in interviews for DSA questions as well as in OA Rounds is time. You have to be able to solve the questions within a certain time limit. Thus, it's good to give a few contests on CP websites so that you can get used to constraints. Here are some beginner-friendly ones:

  • Codeforces Contests - To start off, give only the Division 3 contests and solve the A and B questions, and slowly aim to solve C. You can start to give Div 2 contests as well once you feel comfortable.
  • LeetCode Contests - To start off, aim to solve at least 2 questions in all the weekly and biweekly contests.
  • Atcoder Contests - To start off, just give the 'Beginner Contests'.
  • Codechef Contests - Codechef has fallen off the throne for a while because of its degrading quality and user base, but it's still a decent site for beginners. To start off, I wouldn't recommend the Long contests because it has unnecessary brute force questions. Instead, just do the timed contests like Cook-off, Lunchtime, and Starters.

Other Practice Platforms

NameLink
HackerRankhackerrank.com
CodeSignalcodesignal.com
TopCodertopcoder.com
InterviewBitinterviewbit.com
Codewarscodewars.com
Project Eulerprojecteuler.net
Spojspoj.com
GeeksforGeeksgeeksforgeeks.org

This wiki was originally written by u/sggts04.

Later revisions done by:

Discovering Small GitHub Projects for Contributing to FOSS

Did you know there are more than 60k small FOSS projects on GitHub most likely open to contributions? Have you ever thought about contributing to them? If not, then you should. This guide is about helping the reader identify these projects on GitHub. The guide is meant to encourage both new and experienced contributors to find software that have a small impact and contribute to them in any way.

There are existing sites like Up For Grabs and First Timers Only that use crowdsourcing as a way to add & find projects and issues to contribute to but there's a big chance that authors of small projects may not be well represented in this list (marketing projects takes a lot of effort), or even worse you are missing out to work on some interesting hidden gems.

What this guide covers?

  • Understanding the importance of contributing to small projects.
  • How to search projects on GitHub effectively.

What it doesn't cover?

  • How to contribute to FOSS, this guide is only about finding small projects & their impact on the FOSS ecosystem. There are thousands of guides on how to contribute to open-source projects on the internet, the things taught in those guides apply to projects of all sizes.
  • Finding small projects on other platforms like GitLab, Self-hosted Git instances, etc.

Why contribute to small projects?

You can make a significant impact

  • Due to less traffic (or activity) on small projects, your contributions are more likely to be noticed and appreciated.
  • It's comparatively easier to get started on small projects because of less codebase and complexity, which ultimately lowers your overwhelmness to get started.

This is the "Real" FOSS that needs your help

  • Small FOSS is the real FOSS that needs your help. They are not backed by big companies and are not as popular as big projects. They are the ones that require your help the most.

Smaller Fuck Around & Find Out domain

  • Large FOSS projects that are maintained by a community usually have a set of docs to get started. Conversely, small projects may not have those guides.
  • This is a golden opportunity for folks trying to learn by doing. Throw yourself in this clueless, unknown codebase, and see if you find and learn new things. Sure you can do this with big projects as well but hey, the more no. of contributors, the more no. of chances of code patterns plus with a small impact understanding small codebases will be easier and less time-consuming and eventually more rewarding.

You chance for being an early adopter

  • You never know what projects on github might get some traction over the years. If you participate in contributing to small FOSS consistently, it's possible that you might eventually become one of the maintainers.
  • Not just that, it's possible that the project converts into a product or gets used by another big projects.

How to find small projects on GitHub?

We now look at how to use GitHub search effectively to hunt small projects. Let's understand the criteria with which we will filter out these "small projects".

Base Search Criteria

We combine a bunch of search prefixes to build the following criteria:

template:false archived:false fork:false stars:100..500 forks:>=3 is:public topics:>=3 license:0bsd license:mit license:apache-2.0 license:gpl license:MPL-2.0 license:Unlicense license:AGPL-3.0 license:WTFPL license:CC

alt text

Judging the criteria to filter small projects

  • stars:100..500
    • At first glance, filtering by stars may not be a good idea since they can possibly be bought nowadays, but it's a good starting point for us. Projects sitting in this category have some traction and are not completely unknown to the internet but they most likely lack marketing.
    • Reaching this milestone with the number of stars is a sign that the maintainer/author may be serious about the project and is willing to maintain it for the long run. Hence, open for contributions.
  • archived:false
    • Avoid projects where the author has given up on the project or the maintainers no longer wish to continue the development.
  • forks:>=3
    • A project with at least 3 forks is a good sign that the project is being used by others. You can make this criteria more strict by increasing the number of forks.
  • template:false
    • Very few projects qualify as a template, so we exclude them.
  • topics:>=3
    • An author willing to add topics to their project is a good sign that they are serious about making their project visible to the internet. Topics are a great way to categorize your project and make it discoverable.
  • fork:false
    • Avoid duplicate copies of the same project. This works in conjugation with forks>=3 filter, we need to only find the main repositories, not their forks.
    • This has a side effect of excluding forks that are now well maintained & supported by the community. But that doesn't matter in the long run, since the users of that niche project are most likely already aware of the fork. It's also possible that the author of the original project lists the fork in their README.
  • license:0bsd license:mit license:apache-2.0 license:gpl license:MPL-2.0 license:Unlicense license:AGPL-3.0 license:WTFPL license:CC
    • A presence of a license is a very small sign that a project is serious about being open-source. It's a good idea to filter out projects that don't have a license. We have included the most popular licenses here, you can add more if you want. The full license keyword list is available in github docs

How to apply and use the filter query?

GitHub is kind enough to provide us with a "Saved Searches" feature. You can save the filter query as a saved search and apply it whenever you want to find small projects. Let's see how to do that.

Step 1: Search for the filter query

Head over to GitHub's search page and copy-paste our filtering criteria in the search bar and hit enter.

template:false archived:false fork:false stars:100..500 forks:>=3 is:public topics:>=3 license:0bsd license:mit license:apache-2.0 license:gpl license:MPL-2.0 license:Unlicense license:AGPL-3.0 license:WTFPL license:CC
search github with small foss criteria

Click the "Create save search" button to save the search. You can name the search anything you like. We recommend naming it something like "small-foss". Avoid using spaces in the name.

save github search

Once you have saved the search, you can use it anytime by referencing it via saved:<search-name> in the search bar.

use saved github search

As visible from the above UI, you can also choose to edit this search by clicking on "Manage saved searches" anytime.

You can combine other filters with saved searches as well. For example, to find small FOSS Python projects, you can use the following filter query:

saved:small-foss language:python

# or combine multiple languages

saved:small-foss language:C++ language:Java 
customize saved github search

Step 5: Sort by recently updated

You can sort the search results by "Recently updated" to find the most active projects in this new filtered search. We could do this by adding pushed>=YYYY-MM-DD to the filter query but that would require us to update the date every time we want to use the search. Sorting by "Recently updated" is a better option.

Sort by recently updated

Small projects have high chances of being abandoned, so it's a good idea to sort by "Recently updated" to find the most active projects.

Note that we have solely relied on GitHub's documentation to build this filter query. We recommend the reader to read the docs to modify the query as per their needs.

What's missing?

  • There's no way to tell if the project has a valid description or not. You can however search for a query inside the description to filter out projects. A missing description is a sign that the author may not be serious about the project.
  • We didn't cover filtering projects based on how many open issues they have. Unfortunately there's no direct filter that will help us know whether issues exist on a repository. Although GitHub offers us 2 prefixes to look for good-first-issues and help-wanted-issues.
    saved:small-foss good-first-issues:>1 help-wanted-issues:>1
    

FAQs

What if I don't trust the projects I find?

  • You can always check the project's README, CONTRIBUTING.md, and the issues to get a better understanding of the project and its maintainers.
  • Look for authors on external platforms like LinkedIn, Twitter, etc, and see if they actively talking about the project.
  • In rare cases its also possible that the authors set-up a blog, newsletter or a YouTube channel to talk about the project. This is an opportunity for you to understand the author's vision and the project's future.

What if my PRs are not getting merged?

  • If your PRs are not getting merged, don't worry. You can always ask for feedback and improve your PRs.
  • In the real world, not all PRs will get merged. That's not new and applies to all projects, big or small.
  • Having said that, it's a good idea to move on to another project as soon as you feel you can't contribute anymore. There are plenty of projects out there that need your help.
  • Lastly, if the project is not active, you can always fork it and maintain it yourself :)

What if there are no open issues on these small projects?

Here's your chance to do a lot of things.

  • Install and run the project, find potholes in that process, open issue.
  • Look for bugs in the code, open issue.
  • Run a test suite if it's available, open issue if it fails.
  • Add tests if they are missing, open PR.
  • README looks outdated? Open PR and improve the documentation. Avoid fixing typos, they are not worth the Maintainer's time, unless of course, the project in itself is documentation.
  • There's no CI/CD pipeline? Open a PR with a GitHub Actions workflow.
  • The project is not following best practices? Open the issue and discuss.
  • Lastly, become an enabler for the project. Evangelize the project on social media, write a blog post, etc.

This wiki is maintained by u/BhupeshV

How to approach a DSA problem?

Understanding the problem.

  • The first step in approaching a DSA problem is to understand the essence of the problem itself. We must try to figure out what the problem demands.
  • Not understanding the basic needs of the problem asked is a big mistake. If the wording of the question is unclear, look at the test cases given for the particular problem and try to reverse-engineer the demands of the question.

Clearing out a logical path.

  • The second step involves building a clear picture of the answer's logic in our head. If the logic of your answer statement is fairly complicated, consider writing down comments while implementing the logic in your code.
  • Once the logic is thought of, try to think of alternate ways to approach the problem if it doesn't meet the complexity constraints. Repeat this step until you're happy with your desired logic for the answer. Using pseudocode or diagrammatic representations to refine the algorithm before coding can help to understand the logic and essence of the program well.

Effective Implementation.

  • Implement the logic in your code. As said before, consider adding comments to your code to make the logic "flow" better while solving it. Eventually, with enough problem-solving, you won't require the comments to implement logic(s) anymore, though it is a good habit to do so.
  • Another "cosmetic" tip is to name your variables well. Try to use as few variables as possible to minimize the storage space required for your code. Try to include various problem-solving paradigms such as greedy, dynamic programming, divide and conquer paradigms to guide the design of your algorithms.

Testing and submission.

  • Once implemented, test your code. Your code should be tested on an exhaustive set of inputs and outputs. This exhaustive testing will allow you to find and fix any edge cases that slipped under the radar the first time.
  • Try to think about why your code breaks at that edge case and see if it's a basic logical fallacy in your code or simply a case that could have slipped between the cracks during the implementation.
  • Try using systematic debugging techniques such as print statements, debugging tools, or test case generators to identify and resolve errors more efficiently. This would allow you to pinpoint the source of all the errors and allow you to fix them surgically.

Dealing with fallacies.

  • If all else has failed, try a brute force method to meet all the constraints of the problem and work your way from there. Try to look at your logic and think about ways it can be optimized, even at the cost of storage space. Try to think of any way to make your code run faster.
  • Try to think of more "elegant" ways that would not require recursion in any form. Thinking about creative ways to solve problems will allow you to level up your skills as well as make you think about the logic of your program more deeply.

Effective debugging.

  • Breaking your code down into smaller parts would allow you to approach the problem in a more appealing way, allowing you to debug and test it easily. Identify patterns between logic(s) of various problems and think about why they resemble each other.
  • Try thinking about possible trade-offs between speed and memory usage. Balancing both is key in real-world situations.

Patience is key.

  • Most importantly, you must be patient throughout the whole process. Getting stuck is a part of the journey. Apart from that, solving more DSA problems will make you better at it. That is pretty much true for every replicable activity. Solving more problems, especially harder questions, would allow you to step out of your comfort zone by a lot.
  • Learning new algorithms, mathematical formulas, etc. are all things that would make you a better programmer in the long run.

Attribution

This wiki was maintained/written by Triach Rold.

How to Constantly Upskill Yourself

Hangout in Forums & Communities

  • Choose a community with which you can resonate. By community, we mean a collection of self-motivated developers/engineers/programmers. You are already in the right place 😉.
  • Read and watch what people are asking and discussing.
  • A good example is reading questions on stackoverflow or Software Engineering - StackExchange.
  • Join programming-related subreddits (Reddit is the best place for software folks after Stack Overflow). If you like JavaScript, find subreddits related to JavaScript and join them.

Write Code & Create Software Projects

  • This has been asked and repeated thousands of times by everyone on the internet: Just build stuff!
  • Learn how to contribute to FOSS if you don't have your own ideas to build.
  • Constantly learning new stuff is useless if you can't apply those new techniques.

Write about what you learn

  • No matter how small things are, if they are forgettable (and most things in software are), then log them somewhere.
  • Build a notes site just for yourself; it doesn't need to be fancy. Open a text file, write about what you learned, and store it in a git repo or in Google Docs.
  • Optionally, you can choose to share your knowledge with the rest of the world via blogs.

Where to find interesting stuff?

Read Newsletters

Listen to Podcasts

Attend/Watch Conferences

 

This wiki is maintained by u/BhupeshV

How to Create an Appealing Software Engineering Resume

Job search (especially in the competitive Software Engineering field) is a time-consuming and often stressful task. Hence it is important to optimise and streamline each step of this task as much as possible to better the chances of landing a good job offer.

Part of the job search procedure is to draft an appealing resume according to certain standard protocols and format. This guideline therefore attempts to share with your some of those protocols (along with a few tips and tricks) to draft a resume to improve your chances of landing your ideal job offer.

Understanding the Hiring Pipeline

Over the years as I reviewed and screened a lot of resumes, one thing is always apparent - the applicant lacks insight of the hiring process. Hence I would like to start this guideline by attempting to educate you about it first.

The hiring process is usually divided into multiple stages. Now the exact pipeline is never the same and it varies depending on the size and financial capabilities of the organisation but the core concept is pretty much very similar.

The first stage of the hiring pipeline is when a Hiring Manager (who is usually a senior technical member of the organisation/team) requires additional resources and prompts the HR team about the same. The HR team is provided a list of requirements the candidate is supposed to have to fulfill the Hiring Manager's needs. The HR then proceeds to put up a job advert on various platforms like LinkedIn or some other platform. As soon as you apply to a job advert through the said portal, your application (and your resume) is stored in an Application Tracking System (ATS) for further screening.

Now a common misunderstanding is about drafting resumes are that "it should ATS-friendly". I do not understand where this common misconception arose but you should be aware that the ATS is just a software to store and track applicants to a job position. Most commonly used ATSes do not have intelligent OCR capabilities to parse through your resume (if its in a PDF format). The organisations which can afford to utilise ATSes with more feature-rich and OCR capabilities are rare and not very common. To give you a heads up, the inbuilt LinkedIn ATS does not provide any such feature and you need not worry whether your resume will "pass the ATS test".

With your application (and resume) tracked on the ATS, it is the HR's call to screen through the thousands and thousands of resume they receive each day! A vast majority of the resumes are often spam and unrelated to the job advert. Hence HRs are incentivised to scan a bunch of resumes/applications for not more than a few seconds "looking for certain keywords". The said keywords are chosen based on the requirements list provided to them by the Hiring Manager. All resumes which pass this initial HR screening are forwarded to the Hiring Manager for further review. The Hiring Manager approves a select few of those screened resumes for an interview call (or sometimes even a quick phone interview as is the case in smaller seed startups).

The key takeaway here is, your resume should be optimised to showcase the best version of you at a quick glance! Keep it in mind, the HR screening your resume will not be spending more than 3-5 seconds of a glance reading through the resume. You can discuss more details of yourself during the phone call or face-to-face interview with the Hiring Manager!

Using the Right Structure/Format for the Resume

To ensure the resume is optimised for the HR screening stage, it is important to use a correct format for the resume. This section of the guide will walk you through the steps to draft a resume with a correct structure. Now do note, the structure shared here is applicable to the industries of most parts of Asia, Western Europe and the US. If you are looking to apply elsewhere you will probably have to perform your due research on what the accepted structure of the resume for that particular industry is.

That said, the structure of the resume you should be working with is as follows:

  1. Always start the resume with your name (in bold and prominent font size), contact information like email, GitHub profile, current location and your a phone number to reach out to you.

  2. Divide the entire resume into multiple sections and each should be structured exactly like this:

    • Technical Skills, where you list all the skills you want to showcase.
    • Work Experience, where you share detailed description of your previous work experience.
    • (Optional) Projects, achievements, certifications and such where you want to showcase extra-curricular activities relevant to the job advert.
    • Education, where you share information about your academics.
  3. Ensure your resume is read top-down like a normal book or a professional document. Resist the temptation to draft a resume in a column style, such resumes are often outright rejected!

  4. Ensure chronological order of pretty much any/all relevant sections like your latest work experience should be on top of the previous ones. Or your latest education should be before the older previous one.

  5. Resist the urge to prettify the resume with unnecessary details. Remember it is a professional document and you will not want to read such documents written by an amateur.

Some Tips & Tricks to Write Professionally

As discussed in the previous section, drafting the resume professionally is very important. This section will share some tips and tricks to create one such professionally drafted resume.

Tip 1: Use the Right Font Family & Size

Please for the love of God, stick with either of this font families - Times New Roman, Arial or any Serif-type font. Anything else and especially if it is not a serif-type font is extremely unappealing to read!

A good font size of the general description section of the document is 10-11 points. Exception applies to the heading sections and the top of the document where you share your personal contact details and name.

Tip 2: Refrain from Adding Unnecessary Fluff

Professional documents do not require to look fancy with loads of colours and an oomph. Keep it simple and stupid (KISS) like the engineer in me would like it as!

The most beautification you should worry about is:

  1. Making sections of your resume bold and if you want to direct extra attention to it.
  2. Using italics style on lesser prominent sections of the document.
  3. Adding an underline and a blue font colour to hyperlinks to clearly distinguish them from the rest of the document as something of a point-of-interest.

Tip 3: Use Your Best Judgement to Add Projects/Achievements

Now adding a projects/achievements section to the resume can be quite subjective. While you might be super proud and confident about a certain project or achievement, others might not feel the same way about it!

I personally recommend adding such a section to the document only and only if you feel confident you have a chance at discussing some interesting points about it during the interview process. If you do not have something to boast about during the interview, the space might be better utilised to describe more about your work experience instead.

Tip 4: Update the Resume Very Often

Most people I know only remember about updating the resume during their job search phase which I strongly advice against. Instead I usually recommend maintaining a Bragdoc which is updated every other day (should not take you more than a minute or two post work hours). And then every three or so months should you pick your personal best achievement from the Bragdoc and add it to your resume.

This way not only are you ALWAYS ready with a resume but you will also never forget about an achievement you made at your workplace which could have made your resume look quite appealing.

Tip 5: Perform a Customary Grammar Check

It is a major turn off and a red flag to find a resume with loads of grammatical errors (keyword being loads). A professional document with grammatical errors make it looks amateurish and the candidate as someone to be slacking.

Take my word on it and do not make yourself a target to be joked on and just use tools like Grammarly & Hemingway Editor or some LLM-based chat bots like ChatGPT or Claude to review your resume for grammatical mistakes.

While the suggestions I have shared above will help you a long way ahead in securing your next job offer by enabling you write a very professional document, I want to share some additional resources which will provide additional marginal benefits.

  1. Use this resume template I created in Google Docs - Anonymous Resume.

  2. Get your resume reviewed from your peers. A second opinion will always polish out the remaining intricate mistakes here and there which you might've missed. Join our Discord community & ping me whenever you want to for a resume review (my Discord ID - Jarmos#8937).

  3. ALWAYS remember, job hunting is a numbers game! Don't lose patience and keep applying to jobs on all platforms you can think of. And don't hesitate to reach out to prospects & network with people. Be mindful though, asking for a job straight away might appear rude to some. See this article - How to Break Into the Tech Industry—a Guide to Job Hunting and Tech Interviews to find some insights & lessons.

  4. The r/EngineeringResumes Wiki .

If you feel I missed out on some advice and/or you could add additional insights, please feel free to make a pull request or ping me on Discord! Additionally, you can find more personal contact details about me on my personal website if you want to reach to me privately.

Where to Find Jobs?

Traditional Mediums

  1. LinkedIn
  2. InstaHyre
  3. Wellfound (formerly AngelList Talent)
  4. CutShort
  5. Hirect

Not to mention job portals like Shine and Indeed.

Remote

  1. We Work Remotely
  2. Entry Level Remote Job
  3. NoCommute - Remote jobs delivered to your inbox
  4. Remote OK
  5. Remotive.io
  6. Remote Leaf
  7. Remotists
  8. JustRemote (Doesn't have jobs in India)
  9. remote-developer-jobs.com
  10. Findwork.dev
  11. EchoJobs

Job Boards for HackerNews Jobs

  1. kennytilton.github.io
  2. hnjobs.emilburzo.com

Must check out

Understanding Software Licenses

What is a software license?

A software license is a legal instrument that gives you the right to install, use or otherwise interact with a specific computer program under given circumstances.

In simple terms, a software license defines a set of responsibilities for those who use the code and those who produce the code.

A software license is a requirement when releasing code to the public, as without one, the code is copyrighted to the developer by default.

Why are software licenses important?

Here are the reasons why software licenses are indispensable:

  • They define the usage rights (T&C) and prevent unauthorized usage of the software.

  • Software licenses are essential for establishing legal boundaries and preventing legal troubles such as fines and lawsuits.

  • Licenses are crucial for defining distribution permissions and limitations.

  • They allow developers to control how their software is used to prevent misuse and unapproved modifications.

  • Open-source licenses facilitate collaboration by providing a legal framework for a transparent development environment.

What are the types of Software Licenses?

There are mainly 4 main categories of Software Licenses based on the rights and restrictions they impose.

1. Public Domain

Public Domain software refers to software deliberately placed in the public domain, no longer protected by copyright, trademark or patent laws. As a result, it can be freely used without the permission of or payment to the developer.

Direct licensing for the public domain is not universally recognized. Here are two tools that you could use as alternatives.

  • Creative Commons Zero (CC0): CC0, provided by Creative Commons, is used for waving copyright interest in a work you've created and serves as a fallback as a public domain equivalent license.
  • The Unlicense: The Unlicense is similar to CC0 but offers a simpler, more direct statement of public domain dedication.

2. Permissive

Permissive licenses, often referred to as “BSD-style licenses”, contain minimal restrictions on how the software can be modified or redistributed.

The Open Source Initiative defines a permissive software license as a “non-copyleft license that guarantees the freedom to use, modify and redistribute”.

Some commonly used permissive licenses are:

  • MIT License: The MIT License is one of the most permissive licenses that allow you to use, copy, modify, distribute, sublicense and sell copies of the software as long as you add a copy of the original MIT License and copyright to it.
  • Apache License 2.0: Apache License is similar to MIT License but it explicitly addresses patents by providing the recipient with a license to any patents held by the contributor related to the project.
  • BSD-2-Clause: Much like the MIT License, the 2-Clause BSD License also allows you to use, modify, distribute and sublicense the software. However, it includes an additional requirement for attribution in advertising materials.

3. Copyleft

Copyleft licenses are more restrictive and less commercial-friendly. These require that anyone who modifies or distributes the software share their changes under the same or a compatible license.

Some commonly used copyleft licenses are:

  • GNU General Public License (GPL) 2.0: To utilise GPLv2 rights (copying, distribution & modifying), you must track changes and dates in the source file and share any changes under GPL terms.
  • GNU General Public License (GPL) 3.0: GPLv3 follows GPLv2 but also includes provisions for patents, allows adding extra permissions, improved internationalization and termination processes, etc.
  • GNU Affero General Public License (AGPL) 3.0: AGPLv3 and GPLv3 share core principles of copyleft, but AGPLv3 includes additional provisions to address the distribution of modified software over a network.

4. Proprietary

Also called closed-sourced, this license is used by developers or vendors to claim ownership of their work and software. Proprietary licenses restrict the user’s right to modify, distribute or access the underlying source code of the software. An example of a proprietary license is:

  • MS Reference Source License: The MS-RSL is a proprietary license that allows you to review the code and make copies of it, but you can’t use the code or change it in any way.

Comparison of Software Licenses

Here’s a table summarizing the software licenses we talked about earlier, including their types, key features and examples of projects corresponding to each license.

LicenseTypeKey FeaturesExample Projects
GNU General Public License (GPL)CopyleftRequires derivative works to be distributed under the GPL.Linux, Git, GNU tools
MIT LicensePermissiveAllows almost unrestricted use, modification, and distribution.Node.js, jQuery, Rails
Apache LicensePermissiveAllows usage of the software for any purpose, with limited conditions.Apache HTTP Server, Hadoop
BSD LicensesPermissiveSimple and permissive, allows use in proprietary projects.FreeBSD, NetBSD, Nginx
Creative CommonsVariousUsed for creative works, it provides different levels of sharing and usage permissions.Wikimedia Commons, Flickr
Mozilla Public License (MPL)CopyleftRequires modifications to be open-sourced under the MPL.Mozilla Firefox, Thunderbird
Eclipse Public License (EPL)Weak CopyleftSimilar to the MPL, but contains specific patent grant provisions.Eclipse IDE, Jetty
ISC LicensePermissiveShort and simple permissive license.OpenBSD, PostCSS
GNU Lesser General Public License (LGPL)Weak CopyleftAllows linking with non-GPL software.GTK+, GStreamer
UnlicensePublic DomainPlaces the work in the public domain with no restrictions.Bitcoin.php, CPython (prior to v3.5)

Which software license should I use?

When choosing an open-source license for your project, it’s crucial to ensure that your selection aligns with your ideological values and objectives. Additionally, consider the level of control you wish to maintain over your project, ensuring compatibility and compliance with the licenses of any software incorporated into it.

If you prefer a copyleft approach, where derivative work must also be open source, the GNU General Public License (GPL) is a strong candidate. This license ensures that modifications and improvements to your project also contribute to the open-source community.

If you prioritize making your software widely accessible with minimal restrictions, the MIT License is a popular choice. It allows for almost unrestricted use, modification and distribution.

There are also open-source software licenses for non-software works ranging from documentation to fonts.

Ultimately, the right license depends on your specific project requirements and how you envision collaboration within the open-source community. Take time to understand the terms and conditions of each license to make an informed decision that best suits your objectives.

Resources

Not sure which license to pick? Here are a few tools to help you out.

  • Choosealicense.com by Github offers comprehensive information on licensing options beyond those discussed here.
  • Public License Selector by ÚFAL is a tool that can help you choose the right open-source license for data and software.
  • Also, check out OSI's extensive FAQs which may offer solutions to your queries.

This wiki is maintained by u/govind_s_nair.

Resources To Get Started in Cybersecurity

What is cybersecurity?

Cybersecurity is the protection of computer systems or networks from malicious actors that may result in the theft of data or disruption to any services these systems provide. It has many fields such as web hacking, mobile hacking, reverse engineering, etc. To get started, you have to pick the field which interests you. It can be web hacking if you like to tinker around with web applications to see how they behave or maybe reverse engineering if you like to see how the applications work.

Basics

To get started with cybersecurity, it is recommended to have a basic understanding of computer networking, operating system fundamentals, as you have to know how it communicates to hack something. Check out the following resources to get a head start:

Learn about vulnerabilities and tools

After understanding the basics, it is time to learn some hacking skills.

OWASP Top 10 for Web

The very first step is to understand what vulnerabilities to look for in a system. OWASP Top 10 is a standard awareness document for developers and web application security. It represents a broad consensus about the most critical security risks to web applications.

Web Testing Guide

After learning about the OWASP TOP 10 vulnerabilities in web applications, you can use these comprehensive guides to learn step by step how to look for these vulnerabilities, along with the impact they have when exploited and how to remediate or fix those vulnerabilities.

Burp Suite

Burp Suite is a software security application used for penetration testing of web applications. It is an HTTP proxy tool that is used to intercept and manipulate the HTTP traffic of the application you are testing. To practice looking for vulnerabilities, it is necessary to learn how to use this tool to intercept and edit the HTTP request. It has both paid and free versions, but you can use the community edition, which is more than enough.

Practice

After you have some knowledge about the vulnerabilities in theory, it is time to practice them.

  • Portswigger Web Security Academy is a free online academy to learn about web security from the creators of Burp Suite. They have detailed information about different vulnerability topics along with real-world scenarios. Highly recommended for anyone who wants to learn the basics of how to look for web vulnerabilities.
  • Tryhackme is an online platform for learning cybersecurity, using hands-on exercises and labs, all through your browser. It has both paid and free rooms that cover all topics about security through a series of CTF.
  • Kontra is a free platform to learn about application security through their series of interactive exercises on vulnerabilities in real-world scenarios.
  • OWASP Juice Shop is a modern insecure application that has vulnerabilities from OWASP Top 10 and other security issues found in real-world applications.

Test your skills in the real world

Now, after gaining knowledge about vulnerabilities and practicing how to find them, it is time to use your skills in the real world. You can try to test for vulnerabilities in Bug Bounty programs.

Bug bounty programs offer monetary rewards to ethical hackers for successfully discovering and reporting a vulnerability or bug to the application's developer.

  1. HackerOne
  2. Bugcrowd
  3. Intigriti
  4. Bugbase: Bugbase is an India-based bug bounty platform that hosts bug bounty programs for various Indian companies.

You can use these platforms to hunt on various programs, or you can search for independent vulnerability disclosure programs that are self-hosted by various companies by searching for 'Company Name' vulnerability disclosure program or 'Company Name' bug bounty program on Google.

References

This wiki is maintained by u/Sanamdhar

Hackathons 101: A Step-by-Step Guide to Success

Table of Contents

Have you ever wondered why certain teams excel in hackathons?
Is it only about code, or is there more to the story?
Let's dig into the world of hackathons and learn how to construct a successful team, select the correct challenges, and create solutions that leave an impact on the judges.

Building the Dream Team

Imagine you're constructing a superhero team. Would you pick five Iron Men? Probably not. The same principle is applicable to hackathons. A varied staff is a tremendous resource. So, how do you discover the correct mix? First, strive for a combination of skills. Developers are essential, but don't forget about visionaries—designers and subject matter specialists who can give that special spark to your project. Consider your team to be a mini-startup that operates 24 hours a day. Wouldn't you want to cover all the bases? Speaking of coverage, what is the ideal team size? While there is no uniform solution, 4-5 members often reach the perfect spot. This size helps you to split work efficiently while avoiding confusion. Remember, even in a digital kitchen, too many cooks may ruin the soup!

The Art of Problem Selection

So, you've assembled your perfect squad. What happens next? It's time to choose your problem statement. But is every problem worth solving? The idea is to select the proper challenge—one that is neither too simple nor too difficult. How do you know when you've discovered it? Look for real-world applications. Will fixing this problem have an impact beyond the hackathon? Before you dive in, take a step back. What solutions already exist? Where are the gaps? This is your opportunity to create, not simply reinvent the wheel. In the hackathon world, the individual with a new, unique idea reigns supreme!

From Idea to Innovation

Now comes the enjoyable part: bringing your concept to reality. But how can you make your answer stand out amid an ocean of creativity? Begin with good research. Knowledge drives innovation in hackathons. Once you've figured out the landscape, let your imagination go wild. What twist can you apply to properly differentiate your solution? Choosing the right technological stack is analogous to picking the best tool for the job. It should be simple to use yet strong enough to wow. Pro tip: Do not waste time reinventing the wheel. Reusing code from past projects is not cheating; it is good time management! Before making your professional move, be sure you read the hackathon guidelines.

Handling Stress and Burnout

Given the intensity of hackathons, it is critical to handle stress appropriately. Take regular, brief breaks to keep focused and energized. Stay hydrated, eat well, and get some fresh air. Simple breathing techniques or brief meditation can also help keep stress levels under control. And if you get stuck, don't be afraid to ask for help—collaboration is essential in hackathons.

Building Connections Beyond the Code

Hackathons are more than simply coding marathons; they provide excellent networking opportunities. Here's how to make use of them:

  • During breaks, introduce yourself to members of the other teams.
  • Participate in social activities or seminars planned during the hackathon.
  • Connect with sponsors and judges; they might be potential employers or mentors.
  • After the event, follow up with your connections via LinkedIn or other professional sites.
  • Ethical Considerations in Hackathons Consider ethics when developing your answer. If your project includes data, make sure it is acquired ethically, used appropriately, and properly cited. Consider the potential negative effects of your approach and devise measures to reduce them. Strive for inclusive solutions that do not exclude or discriminate against any group. Be open about your solution's capabilities and limits.

Technical Preparation

Before the hackathon starts, make sure your development environment is ready to go. Prepare any code samples or templates you may require. Improve skills like API integration and data visualization. Consider assembling a "hackathon toolkit" from your favorite libraries and tools.

Useful Tools and Resources

The correct tools and resources may mean all the difference. Version control services like GitHub and GitLab are essential tools for collaboration. Tools like Slack or Discord may help your team communicate, especially during virtual hackathons. When it comes to design, prototyping tools like Figma and Sketch may help you visualize your concepts. Backend development technologies like Firebase and AWS Amplify can help speed up the process. Don't forget to include AI or machine learning frameworks like TensorFlow or PyTorch, which can provide your project with a competitive advantage.

Time Management

Effective time management is essential at a hackathon. To make the best use of your limited time, create a basic schedule. Spend the first 2-3 hours thinking and planning, studying relevant material, and locating current solutions. Dedicate the next 12–14 hours to** core development**, with a focus on creating the features listed in your issue description. Reserve the last 2-3 hours of this time for integration. After that, devote 4-6 hours to testing and tweaking your product to guarantee it is polished and ready for the judges. Finally, in the final 2-3 hours, prepare your presentation, compose a fascinating speech, and harness your inner Steve Jobs to make a lasting impact. Remember to take pauses, eat properly, and keep hydrated—free food and beverages are great advantages during hackathons!

Selling Your Solution

You've created something fantastic. Now, how can you ensure that everyone else perceives it this way? Consider your presentation as a tale. What is the problem? Why should anybody care? How does your solution help rescue the day? Remember that judges are human, too. They prefer intriguing storytelling over dull facts. Here's an unexpected tip: concentrate more on the problem than the solution. Why? Because a well-defined problem is already halfway resolved. It demonstrates that you have done your study and fully grasp the task at hand.

Remote Hackathon Strategies

As more events go online, participating in remote hackathons necessitates a few adaptations. Make sure you have a reliable internet connection. Create a pleasant, distraction-free workstation. Maintain team connection using video calls. Use online collaboration tools like Miro or Trello to brainstorm and organize tasks. Regular check-ins with your team can help keep everyone on target.

Beyond the Prize

Let's be honest: you may not win your first hackathon. Or your second. Or even a third. But does this imply you've failed? Definitely not! Every hackathon is a learning opportunity. Participating in hackathons helps you improve your abilities, broaden your network, and push your limits. The actual prize is not only the trophy but also the development and improvement you make along the way.

Dealing with Failure

Even if you don't win, you can still benefit greatly. Start by soliciting comments from judges and peers. Reflect on what went well and where you can improve. Consider working on your project after the hackathon; many great businesses started this way. Keep in contact with your team about potential partnerships. Remember that not winning doesn't imply your concept isn't viable; it might be the basis for something enormous.

Post-Hackathon Actions

Completing the hackathon signals the beginning of a new phase. Refine your project based on comments. Consider open-sourcing your code to solicit more feedback from the community. If your solution has potential, consider developing it into a company or product. Writing a blog post about your experience might help you reinforce your knowledge and share your findings with others. And, of course, start organizing your next hackathon—there's always another chance to create and advance.

Case Study: From Hackathon to Startup

Consider the tale of GroupMe, a group messaging service that began as a hackathon project at the TechCrunch Disrupt Hackathon in 2010. Jared Hecht and Steve Martocci, the creators, created the prototype in 24 hours. They did not win the hackathon, but they saw the potential in their proposal. They continued to build the software and gathered funds, and within a year, GroupMe was bought by Skype for more than $40 million. This example demonstrates how, with perseverance and hard work, a hackathon project may become a profitable enterprise.

Conclusion

In the realm of hackathons, the journey is equally crucial as the outcome. You might not win your first hackathon—or even get accepted into the first ones you apply to. But keep going, be resilient, and embrace every chance. Every line of code, brainstorming session, and presentation contributes to your development as a developer, creator, and individual.

So, are you ready to solve difficulties creatively and pave the route for success? The next hackathon might be your opportunity to demonstrate your abilities and create an impression. Will you seize it?


Compiling all the data into a single page is not easy. If you feel I missed out on some advice and/or you could add additional insights, please feel free to make a pull request or ping me! Additionally, you can find more personal contact details about me on my personal website if you want to reach to me privately for guidance.