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! And 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 run down 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 from 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 the 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 goes 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

🖋

This project follows the all-contributors specification. Contributions of any kind 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 for 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 much 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 - 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, also accompanied by 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 till 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 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 bruteforce 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 orignially 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 lof 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 consistenly, its possible that you might eventually become one of the maintainers.
  • Not just that, its 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 and 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 testcases given for the particular problem and try to reverse-engineer the demands of the question.

Clearing out a logical path.

  • The 2nd 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 little 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 should be tested on a 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 it 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 skill 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 tradeoffs 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 formulae, 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 you can resonate with, by community we mean a collection of self-motivated developers/engineers/programmers. You are already at right place 😉.
  • Read and watch what people are asking and discussing about
  • 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 StackOverflow). If you like JavaScript, find subreddits related to javascript and join them.

Write Code & Create Software Projects

  • This has been asked & repeated thousands of time by everyone on Internet, Just build stuff!
  • Learn how to contribute to FOSS, if you don't have ideas yourself 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 its something forgettable (and most of the things in software are) then log it somewhere.
  • Build a notes sites just for yourself, no need to be fancy. Open a text file, write about what you learned, store in a git repo or in google docs.
  • You can optionally choose to share you 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. Angelist
  4. CutShort
  5. Hirect

Not to mention job portals like shine, 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. echo jobs

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 protection of computer systems or networks from malicious actors that may result in 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 web applications to see how they behave or maybe reverse engineering , if you like to see how the applications works.

Basics

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

Learn about the vulnerabilites 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 are 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 OWSAP 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.

Burpsuite

Burp Suite is a software security application used for penetration testing of web applications. It is a HTTP proxy tool which is used to intercept and manipulate the HTTP traffic of application which we are testing. To go ahead with practicing to look for vulnerabilites , 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 creaters of Burpsuite. They have detailed information about different vulnerability topics along with the real world scenario. Must recommended for anyone who wants to learn basics of how to look for the web vulnerabilites.
  • Tryhackme is a online platform for learning cyber security, using hands-on exercises and labs, all through your browser. It has both paid and free rooms which covers all topics about security through as series of CTF.
  • Kontra is a free platform to learn about application security through their series of interactive execises of vulnerabilities in the real world scenario.
  • Owasp Juice Shop is a modern insecure application which has vulnerabilites from Owasp Top 10 and other security issues found in the real world applications.

Test your skills in real world

So now after gaining the 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 the vulnerabilities in the 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 India based bug bounty platform which hosts bug bounty programs for various Indian companies.

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

References

This wiki is maintained by u/Sanamdhar