├── README.md ├── .gitignore ├── scripts └── auto_organizer.py └── How_to_Contribute.md /README.md: -------------------------------------------------------------------------------- 1 | # 2024 New Grad Full-time Positions in Europe 🎓 2 | 3 | Welcome! 🎉 4 | This is a collection of full-time job openings for new grads in 2024 in the fields of Software Engineering (SWE) and other tech roles in Europe. 5 | 6 | 🙏 **This repository is copied from [ReaVNail](https://github.com/ReaVNaiL)'s repository called [New-Grad-2024](https://github.com/ReaVNaiL/New-Grad-2024) as Europe version. While the original repository contains job postings in America, Remote and Canada locations, this repository contains new grad job postings in the Europe.** 🙏 7 | 8 | 👨🏻‍💻 **You can find the guidelines to contribute in [How to Contribute](https://github.com/shintalha/New-Grad-Europe-2024/blob/main/How_to_Contribute.md) file. As this repository is copied from [New-Grad-2024](https://github.com/ReaVNaiL/New-Grad-2024), you can follow the guidelines and issues in the original one.** 9 | 10 | ## Roles Status: 11 | The icons next to roles in the table below signify the following: 12 | 13 | - ✅: Available / Open. 14 | - 🔒: No Longer Available / Closed / Not Open Yet. 15 | 16 | ## Jobs 17 | 18 | ---- 19 | 20 | | Name | Location | Roles | Citizenship/Visa Requirements | Date Added
dd/mm/yyyy | 21 | | ------------ | ------------ | -------------------- | ----------------------------- | --------------------------- | 22 | | [Booking.com](https://careers.booking.com) | - Amsterdam, Netherlands
- Amsterdam, Netherlands
- Manchester, England | 🔒 [Graduate Data Science & Analytics Programme – Amsterdam]()
🔒 [Graduate Software Engineering Programme – Amsterdam]()
🔒 [Graduate Software Engineering Programme – Manchester]() | -
-
- | 3/12/2023 | 23 | | [Databricks](https://www.databricks.com) | - Amsterdam, Netherlands | ✅ [Software Engineer - New Grad (2024 Start)](https://www.databricks.com/company/careers/university-recruiting/software-engineer---new-grad-2024-start-6866549002) | - | 3/12/2023 | 24 | 25 | [⬆️ Back to Top](#jobs) 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /scripts/auto_organizer.py: -------------------------------------------------------------------------------- 1 | import os 2 | import re 3 | from datetime import datetime 4 | 5 | 6 | class README: 7 | def __init__(self, lines, start, end, header_and_formatting, sorted_table_lines): 8 | self.lines = lines 9 | self.start = start 10 | self.end = end 11 | self.header_and_formatting = header_and_formatting 12 | self.sorted_table_lines = sorted_table_lines 13 | 14 | def overwrite_table(self): 15 | self.lines[self.start : self.end - 1] = self.header_and_formatting + self.sorted_table_lines 16 | 17 | 18 | class READMEOrganizer: 19 | def __init__(self, filename): 20 | self.filename = filename 21 | 22 | def get_job_date(self, job_line): 23 | """ 24 | Extracts the date from a job line in the table. 25 | Returns a datetime object representing the date. 26 | """ 27 | date_match = re.search(r"\b(\d{1,2})/(\d{1,2})/(\d{4})\b", job_line) 28 | if date_match: 29 | date_str = f"{date_match.group(1)}/{date_match.group(2)}/{date_match.group(3)}" 30 | return datetime.strptime(date_str, "%m/%d/%Y").date() 31 | return None 32 | 33 | def sort_jobs(self, jobs): 34 | """ 35 | Sorts the jobs list by date in descending order. 36 | Jobs with non-standard dates are placed after the valid dates. 37 | Invalid jobs without dates are sorted alphabetically. 38 | """ 39 | valid_jobs = [] 40 | invalid_jobs = [] 41 | for job in jobs: 42 | job_date = self.get_job_date(job) 43 | if job_date: 44 | valid_jobs.append((job_date, job)) 45 | else: 46 | invalid_jobs.append(job) 47 | 48 | sorted_valid_jobs = sorted(valid_jobs, key=lambda x: x[0], reverse=True) 49 | sorted_jobs = [job[1] for job in sorted_valid_jobs] + sorted(invalid_jobs) 50 | return sorted_jobs 51 | 52 | def get_jobs_table_lines(self, lines): 53 | """ 54 | Extracts the lines containing the jobs table from the README. 55 | Returns the start and end line indices of the table, 56 | and the lines in between as a list. 57 | """ 58 | start, end = -1, -1 59 | for i, line in enumerate(lines): 60 | if "## Jobs" in line: 61 | start = i + 2 62 | if start != -1 and line.startswith("[⬆️ Back to Top](#jobs)"): 63 | end = i 64 | break 65 | 66 | if start == -1 or end == -1: 67 | print("Could not find Jobs table in README.md") 68 | return None 69 | 70 | table_lines = lines[start + 4 : end - 1] 71 | return start, end, table_lines 72 | 73 | def capitalize_jobs(self, table_lines): 74 | """ 75 | Capitalizes the job names in the table lines. 76 | """ 77 | return [ 78 | re.sub(r"\[(.*?)\]\(", lambda m: f"[{m.group(1)[0].upper() + m.group(1)[1:]}](", line) 79 | for line in table_lines 80 | ] 81 | 82 | def organize_readme(self): 83 | try: 84 | with open(self.filename, "r", encoding="utf-8") as file: 85 | lines = file.readlines() 86 | except FileNotFoundError: 87 | print("README.md not found.") 88 | return 89 | except PermissionError: 90 | print("Permission denied to read README.md.") 91 | return 92 | 93 | table_start, table_end, table_lines = self.get_jobs_table_lines(lines) 94 | if table_lines is None: 95 | return 96 | 97 | header_and_formatting = lines[table_start : table_start + 4] 98 | 99 | sorted_table_lines = self.sort_jobs(table_lines) 100 | sorted_table_lines = self.capitalize_jobs(sorted_table_lines) 101 | 102 | readme = README(lines, table_start, table_end, header_and_formatting, sorted_table_lines) 103 | readme.overwrite_table() 104 | 105 | try: 106 | with open(self.filename, "w", encoding="utf-8") as file: 107 | file.writelines(readme.lines) 108 | except PermissionError: 109 | print("Permission denied to write to README.md.") 110 | return 111 | 112 | print("README.md was organized successfully!") 113 | 114 | 115 | if __name__ == "__main__": 116 | filename = os.path.join(os.path.dirname(__file__), "..", "README.md") 117 | organizer = READMEOrganizer(filename) 118 | organizer.organize_readme() 119 | -------------------------------------------------------------------------------- /How_to_Contribute.md: -------------------------------------------------------------------------------- 1 | ## How to Contribute to 2024 New Grad Full-time Positions in Europe?🎓💼 2 | 3 | ### Need Before You Contribute 4 | * **Company Name** 5 | * **Location** 6 | * **Roles** / **Links** to Job Posting 7 | 8 | ### Adding A Job Opening / Updating A Job Opening 9 | 10 | 1. **Fork the Repository**: Click the "Fork" button at the top-right corner of the repository to create your own copy of the repository. 11 |
12 | 13 | 2. **Clone the Forked Repository**: Clone the forked repository to your local machine. 14 |
15 | 16 | 3. **Add the Job Opening**: Add the job opening to the table in the `README.md` file. 17 | Please follow the existing format of the table. 18 | 19 |
20 | Table Example -- click here
21 | 22 | - If you were **ADDING** a job opening for *Booking.com*: 23 | 24 | | Company Name | Location | Roles | Citizenship/Visa Requirements | Date Added
mm/dd/yyyy | 25 | | ------------ | -------- | ----- | ----------------------------- | --------------------------- | 26 | | [Booking.com](https://careers.booking.com) | - Amsterdam, Netherlands | ✅ [Graduate Software Engineering Programme – Amsterdam](https://careers.booking.com/early-careers/)| - | 3/12/2023 | 27 | 28 | 29 | Placeholders for the table are defined as follows: 30 | - `Company Name`: Represents the name of the company. 31 | - `Location`: Denotes the place(s) where the job position is available. 32 | - When there are multiple locations, each location should be prefixed with a dash `-`, and a `
` tag should be inserted before each location, starting from the second location. 33 | - Example: `- {location1}
- {location2}` 34 | - `Roles`: Refers to any additional roles or links to the job posting. 35 | - Including "✅" is optional, but if you want to maintain consistency with the rest of the repository, you can add it at the beginning of the role listing. 36 | - `Citizenship/Visa Requirements`: Indicates the citizenship or visa requirements for the job opening. 37 | - `Date Added`: Specifies the date when the job opening was added to the repository. The date should be in the format `mm/dd/yyyy`. 38 | - This helps in keeping the most recent job openings at the top of the table. 39 | 40 | 41 | ```java 42 | | [Company Name](link-to-job-posting) | Location (s) | [Position Name](link-to-job-posting)| US Citizen, Permanent Resident, Sponsorship | dd/mm/yyyy | 43 | ``` 44 | 45 |
46 | 47 | - If **UPDATING** a job opening, please follow the same format as above, but replace the link to the job posting with the new link, or add a new position name separated by a `
` tag. 48 | 49 | | Company Name | Location | Roles | Citizenship/Visa Requirements | Date Added
mm/dd/yyyy | 50 | | ------------ | -------- | ----- | ----------------------------- | --------------------------- | 51 | | [Booking.com](https://careers.booking.com) | - Amsterdam, Netherlands
- Manchester, England | ✅ [Graduate Software Engineering Programme – Amsterdam]()
✅ [Graduate Software Engineering Programme – Manchester]()| Europe Citizen, Permanent Resident, OPT, Sponsorship, etc. | 3/12/2023 | 52 | 53 | ```java 54 | | [Company Name](link-to-job-posting) | - Location
| [Position Name](link-to-job-posting),
[New Position Name 2](link-to-job-posting-2)| Europe Citizen, Permanent Resident. | dd/mm/yyyy | 55 | ``` 56 | 57 | 58 |
59 |
60 | 61 | 4. **Run the script** [OPTIONAL]: Run the py script to ensure that the table is formatted correctly. You can do this by running the following command: 62 | 63 | ```bash 64 | python scripts/auto_organizer.py 65 | ``` 66 | 67 | - If the script fail, please fix the errors before proceeding to the next step. 68 | 69 | 5. **Commit the Changes**: Commit the changes to your forked repository using the following commands: 70 | 71 | ```bash 72 | git add . 73 | git commit -m "Add " 74 | ``` 75 | 76 | - The actual commit message can be anything you want, but it's best to keep it short and simple and related to the changes you made. 77 | 78 | 6. **Create a Pull Request**: 79 | * You can create a pull request from your forked repository to the original repository by clicking on the **"Compare & pull request"** button on your forked repository page. 80 | 81 | **OR** 82 | 83 | * You can also create a pull request from your forked repository to the original repository using the following commands: 84 | 85 | ```bash 86 | git push origin main 87 | ``` 88 | Then, create a pull request from your forked repository to the original repository. Please ensure that the pull request and commit message adhere to the [contribution guidelines](#guidelines). 89 | 90 |
91 | 92 | 7. **Review Pending / Done!** 🎉 Thank you for your contribution! Your pull request will be reviewed and merged as soon as possible. 93 | 94 | > ⚠️ NOTE: No worries, worst case scenario, we can always edit your pull request and fix any issues together. 95 | 96 | ### Removing A Job Opening 97 | 98 | This section is for removing a job opening from the table in the `README.md` file. 99 | 100 | It's very similar, assuming you have already forked the repository and cloned it to your local machine. 101 | 102 | 1. **Find the Job Opening**: Find the job opening you want to remove from the table in the `README.md` file. 103 | 104 | 2. **Close the Job Opening**: 105 | - Simply add a `🔒` before the Roles or links to the job posting. (Be mindful of the space) 106 | - Then remove the link to the job posting from both the company name and position name. *The parentheses should be empty* 107 | - Finally, remove the citizenship/visa requirements and replace it with a dash `-`, unless the position has another role open. 108 | 109 |
110 | Table Example
111 | 112 | - This is what the *table* would look like if you were removing a job opening for *Walmart*: 113 | 114 | | Company Name | Location | Roles | Citizenship/Visa Requirements | Date Added
mm/dd/yyyy | 115 | | ------------ | -------- | ----- | ----------------------------- | --------------------------- | 116 | | [Booking.com](https://careers.booking.com) | - Amsterdam, Netherlands | 🔒 [Graduate Software Engineering Programme – Amsterdam](https://careers.booking.com/early-careers/)| - | 3/12/2023 | 117 | 118 | Placeholders for the table are as follows: 119 | - `Company Name`: The name of the company. 120 | - `Location`: The location(s) of the job opening. 121 | - `Roles`: Any additional Roles or links to the job posting. 122 | 123 | ```java 124 | | [Company Name]() | - Location (s) | 🔒 [Position Name]()| - | dd/mm/yyyy | 125 | ``` 126 | 127 |
128 | 129 | If the job opening has multiple roles, and you want to close one or more: 130 | 1. Repeat the same steps as above, but only add `🔒` to the roles you want to close. 131 | - If you want to close all the roles, then add `🔒` to all the roles. 132 | - If you want to close some of the roles, then add `🔒` to the roles you want to close while separating them with a `
` tag. 133 | 2. Move the closed job opening to the bottom of the company's list of job openings. 134 | 3. Add `

` if it doesn't already exist between the open and closed job roles. 135 | 136 | ### Guidelines 137 | 138 | - Please ensure that the job listings you add are for New Grad positions in the fields of: 139 | * **Software Engineering (SWE)** / **Software Development Engineer (SDE)** 140 | * **Other tech roles.** 141 | - Make sure that the job openings are for the year 2024 and are located in the **Europe**. 142 | - Provide accurate and up-to-date information for each job listing. 143 | - Follow the existing format of the table in the `README.md` file. 144 | - Not already listed in the table or previously submitted in a pull request. 145 | 146 | 147 | ### Thank You 148 | 149 | We appreciate your contributions to the 2024 New Grad Full-time Positions repository! Your efforts help keep this resource valuable and up-to-date for new grads seeking job opportunities. 150 | 151 | Good luck with your job search! 🌟 152 | --------------------------------------------------------------------------------