├── 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 |
--------------------------------------------------------------------------------