Skip to content

Commit

Permalink
add education & experience
Browse files Browse the repository at this point in the history
  • Loading branch information
axherrm committed Dec 4, 2023
1 parent fde8500 commit 21fe92b
Show file tree
Hide file tree
Showing 15 changed files with 236 additions and 71 deletions.
120 changes: 91 additions & 29 deletions src/app/app.component.html
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<main #main>
<main #main id="main">

<div id="main-background">
<div #arrow_down id="arrow-down-container">
Expand All @@ -14,11 +14,7 @@ <h2 id="main-subheading" class="text-color-grey-dark-2">Software Engineer</h2>
<img id="profile-pic" ngSrc="assets/profile-pic.jpeg" alt="Profile photo of Axel Herrmann" width="450" height="450" priority="">
</div>
</div>
<div #personal_infos id="personal-infos">
<div style="width: 100%; text-align: center">
<heading-box text="Persönliches" style="width: 70vh; display: inline-block;"></heading-box>
</div>

<heading-section #personal_infos id="personal-infos" heading="Persönliches" width="70vh">
<div class="personal-container">
<mat-icon class="personal-icon" fontIcon="child_care"></mat-icon>
<div class="vr"></div>
Expand All @@ -39,32 +35,98 @@ <h2 id="main-subheading" class="text-color-grey-dark-2">Software Engineer</h2>
<div class="vr"></div>
<div class="personal-text"><a href="https://www.linkedin.com/in/axherrm/">linkedin.com/in/axherrm/</a></div>
</div>
</div>
</heading-section>
</div>

<!-- Similar to TextSplit: https://github.com/ayhanexe/gsap-class-based-splitText-plugin-->
<div id="right-side" style="width: calc(50% - 80px); margin-left: 50%; padding-right: 40px; padding-left: 40px">
<div style="height: 80px"></div>
<div #general style="transform: scale(0.9)">
<heading-box text="Allgemein"></heading-box>
<p class="capitalize general-text">
Axel Herrmann - wer ist das?
Momentan bin ich ein 21-jähriger Student an der <i>Universität Stuttgart</i> im Studiengang <i>Software Engineering B.Sc.</i>, der seine Bachelorthesis schreibt.
Doch meine Geschichte mit Informatik beginnt viel früher, denn ich konnte mich schon früh für Informatik begeistern.
Bereits in der 7. Klasse hat mein Vater mir einen Online-Blog über Java gezeigt, durch den ich meine ersten Zeilen Java Code geschrieben habe.
Als ich dann in der 10. Klasse das erste Mal die Chance hatte, Informatikunterricht zu besuchen, wusste ich sofort, was ich in Zukunft machen will.
Immer auf der Suche nach echten Aufgaben, bei denen ich programmieren kann, habe ich 2018 mit Freunden am #IoT Hackthon meiner Schule teilgenommen.
Da mein Informatik-Lehrer sah, wie viel Spaß mir das machte, gab er mir als einzigem Schüler die Möglichkeit, an der Verwaltungssoftware für das Schulprojekt Schule als Staat (SaS) mit ihm zu entwickeln.
Als erstes etwas größeres Projekt, an dem ich gearbeitet habe, hat das meine Entscheidung gefestigt, Informatik studieren zu wollen.
So habe ich nach der Schule direkt damit angefangen.
Besonders viel Spaß haben mir dabei immer die Module gemacht, bei denen ich programmieren konnte.
</p>
<p class="general-text">
Um mehr Bezug zur Praxis zu haben und Erfahrung zu sammeln, suchte ich mir bereits im 3. Semester meines Studiums eine Werkstudentenstelle.
So bin ich bei <i>levigo solutions</i> gelandet, wo ich ab Beginn 2022 1,5 Jahre am Produkt <i>jadice flow</i> mitentwickelt habe.
Hier konnte ich erste Erfahrungen mit renomierten Technologien wie Docker und Kubernetes sammeln und hatte viel Spaß bei der Arbeit.
</p>
<div style="overflow-x: hidden">
<div #right_side id="right-side" style="width: calc(50% - 2vw); margin-left: 50%; padding-right: 1vw; padding-left: 1vw">
<div style="height: 80px"></div>
<!-- <div class="dot">TODO</div>-->
<heading-section #general heading="Allgemein" style="transform: scale(0.9)">
<p class="capitalize text">
Axel Herrmann - wer ist das?
Momentan bin ich ein 21-jähriger Student an der <i>Universität Stuttgart</i> im Studiengang <i>Software Engineering B.Sc.</i>, der seine Bachelorthesis schreibt.
Doch meine Geschichte mit Informatik beginnt viel früher, denn ich konnte mich schon früh für Informatik begeistern.
Bereits in der 7. Klasse hat mein Vater mir einen Online-Blog über Java gezeigt, durch den ich meine ersten Zeilen Java Code geschrieben habe.
Als ich dann in der 10. Klasse das erste Mal die Chance hatte, Informatikunterricht zu besuchen, wusste ich sofort, was ich in Zukunft machen will.
Immer auf der Suche nach echten Aufgaben, bei denen ich programmieren kann, habe ich 2018 mit Freunden am #IoT Hackthon meiner Schule teilgenommen.
Da mein Informatik-Lehrer sah, wie viel Spaß mir das machte, gab er mir als einzigem Schüler die Möglichkeit, an der Verwaltungssoftware für das Schulprojekt Schule als Staat (SaS) mit ihm zu entwickeln.
Als erstes etwas größeres Projekt, an dem ich gearbeitet habe, hat das meine Entscheidung gefestigt, Informatik studieren zu wollen.
So habe ich nach der Schule direkt damit angefangen.
Besonders viel Spaß haben mir dabei immer die Module gemacht, bei denen ich programmieren konnte.
</p>
<p class="text">
Um mehr Bezug zur Praxis zu haben und Erfahrung zu sammeln, suchte ich mir bereits im 3. Semester meines Studiums eine Werkstudentenstelle.
So bin ich bei <i>levigo solutions</i> gelandet, wo ich ab Beginn 2022 1,5 Jahre am Produkt <i>jadice flow</i> mitentwickelt habe.
Hier konnte ich erste Erfahrungen mit renomierten Technologien wie Docker und Kubernetes sammeln und hatte viel Spaß bei der Arbeit.
</p>
</heading-section>

<heading-section #education heading="Bildungsweg">
<lifeline-entry
title="Allgemeine Hochschulreife"
subTitle="Schönbuch-Gymnasium Holzgerlingen"
date="09/2012 - 07/2020"
[bulletPoints]="['Abschlussnote: 1,4']"
>
Neben der allgemeinen Bildung habe ich hier meine ersten Erfahrungen in der Informatik sammeln können.
Ab der Oberstufe habe ich Informatikunterricht besucht.
</lifeline-entry>

<lifeline-entry
title="Software Engineering B.Sc."
subTitle="Universität Stuttgart"
date="01/2022 –09/2023"
[bulletPoints]="['Abschlussnote: 2,0']"
>
In Abgrenzung zum verwandten Studiengang Informatik konnte ich hier einige praktische Erfahrungen mehr sammeln.
Diese kleinen Programmierprojekte konnten mich im Studium bisher am meisten begeistern.
</lifeline-entry>
</heading-section>

<heading-section #experience heading="Erfahrung">
<lifeline-entry
title="Teilnahme am #IoT Hackathon"
subTitle="Schönbuch-Gymnasium Holzgerlingen"
date="2018"
[bulletPoints]="[]"
>
Im Rahmen des Hackathon habe ich das erste Mal etwas praktischere Erfahrungen in der Softwareentwicklung gesammelt.
</lifeline-entry>
<lifeline-entry
title="Entwicklung Verwaltungssoftware SaS"
subTitle="Schönbuch-Gymnasium Holzgerlingen"
date="2018-2019"
[bulletPoints]="[]"
>
Dank meines Informatik-Lehrers habe ich als einziger Schüler die Möglichkeit bekommen, mit an der Verwaltungssoftware für das Schulprojekt „Schule als Staat“ zu entwickeln.
Dabei wurde eine Webseite in PHP realisiert.
</lifeline-entry>
<lifeline-entry
title="Werkstudent Software Developer"
subTitle="levigo solutions, Holzgerlingen"
date="01/2022 –09/2023"
[bulletPoints]="[]"
>
Im Rahmen dieser Anstellung hatte ich das erste Mal die Gelegenheit, professionelle praktische Erfahrungen zu sammeln.
Ich habe größtenteils am Backend des Produkts jadice flow gearbeitet.
Dabei habe ich viel in Java und SpringBoot, teilweise auch in Java-/Typescript geschrieben.
Aufgrund der Microservices-Architektur des Produkts hatte ich viel Erfahrungen mit Docker gesammelt und erste Einblicke in Kubernetes bekommen.
Bei dem agilen Vorgehen in 2–3-wöchigen Sprints habe ich das erste Mal mit Scrum gearbeitet.
</lifeline-entry>
<lifeline-entry
title="Bachelor-Thesis"
subTitle="levigo solutions, Holzgerlingen"
date="09/2023 – 03/2024"
[bulletPoints]="[]"
>
Insgesamt ein halbes Jahr habe ich bei levigo solutions meine Bachelorthesis über das Thema Refactoring von Microservices- Architekturen: Eine industrielle Fallstudie geschrieben.
Dabei habe ich weiter an der Architektur des Produkts jadice flow entwickelt.
Die Thesis wird in Zukunft öffentlich zu finden sein.
</lifeline-entry>
</heading-section>
<div style="padding-bottom: 20000px"></div>
</div>
<div style="padding-bottom: 20000px" id="wrapper"></div>
</div>
</main>
12 changes: 4 additions & 8 deletions src/app/app.component.scss
Original file line number Diff line number Diff line change
Expand Up @@ -75,18 +75,14 @@
font-size: xx-large;
color: var(--color-grey-dark-1);
}
.general-text {
color: var(--color-grey-dark-2);
font-size: 2.3vh;
margin-left: 20px;
margin-right: 20px;
}
.dot {
height: 20px;
width: 20px;
height: 12px;
width: 12px;
margin-top: 11vh;
background-color: var(--color-grey-dark-1);
border-radius: 50%;
display: inline-block;
z-index: -100;
}
#main-background {
width: 100%;
Expand Down
49 changes: 25 additions & 24 deletions src/app/app.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,30 @@ import {CommonModule, NgOptimizedImage} from '@angular/common';

import gsap from 'gsap'
import { ScrollTrigger } from "gsap/ScrollTrigger"
import {HeadingBoxComponent} from "./heading-box/heading-box.component";
import {HeadingBoxComponent} from "./components/heading-box/heading-box.component";
import {MatIconModule} from "@angular/material/icon";
import Utils from "./utils/utils";
import {LifelineEntryComponent} from "./components/lifeline-entry/lifeline-entry.component";
import {HeadingSectionComponent} from "./components/heading-section/heading-section.component";

gsap.registerPlugin(ScrollTrigger);

@Component({
selector: 'app-root',
standalone: true,
imports: [CommonModule, NgOptimizedImage, HeadingBoxComponent, MatIconModule],
imports: [CommonModule, NgOptimizedImage, HeadingBoxComponent, MatIconModule, LifelineEntryComponent, HeadingSectionComponent],
templateUrl: './app.component.html',
styleUrl: './app.component.scss'
})
export class AppComponent {

@ViewChild('avatar') avatar: any;
@ViewChild('main') backgroundDiv: any;
@ViewChild('arrow_down') arrowDown: any;
@ViewChild('general') general: any;
@ViewChild('personal_infos') personal: any;
@ViewChild('avatar') avatar: ElementRef;
@ViewChild('main') backgroundDiv: ElementRef;
@ViewChild('arrow_down') arrowDown: ElementRef;
@ViewChild('general', {read: HeadingSectionComponent}) general: HeadingSectionComponent;
@ViewChild('general', {read: ElementRef}) generalElement: ElementRef;
@ViewChild('right_side') rightSide: ElementRef;
@ViewChild('personal_infos', {read: HeadingSectionComponent}) personal: HeadingSectionComponent;

ngAfterViewInit(): void {
if (window.scrollY < 10) {
Expand All @@ -39,10 +43,9 @@ export class AppComponent {
end: "+=1500",
markers: true, // TODO remove
scrub: true,
pin: this.general.nativeElement
pin: this.rightSide.nativeElement
}
});
timeline.addLabel("start", 0)

timeline
.from(this.avatar.nativeElement, {
Expand All @@ -55,33 +58,31 @@ export class AppComponent {
.to(this.arrowDown.nativeElement, {
opacity: 0,
duration: 50
}, "start")
}, 0);

const generalChildren = this.general.nativeElement.children;
for (let i = 0; i < generalChildren.length; i++) {
const textPart = generalChildren[i];
timeline.from(textPart, {
const generalParts = this.general.getParts();
for (let i = 0; i < generalParts.length; i++) {
timeline.from(generalParts[i], {
xPercent: 120,
scale: 0.2,
duration: 60
}, 10 + i * 30);
}

const personalChildren = this.personal.nativeElement.children;
for (let i = 0; i < personalChildren.length; i++) {
const personalPart = personalChildren[i];
timeline.from(personalPart, {
timeline.to(this.generalElement.nativeElement, {
scale: 1,
duration: 60
});

const personalParts = this.personal.getParts();
for (let i = 0; i < personalParts.length; i++) {
timeline.from(personalParts[i], {
xPercent: -120,
scale: 0.2,
duration: 60
}, 10 + i* 15);
}, 10 + i * 15);
}

timeline.to(this.general.nativeElement, {
scale: 1,
duration: 60
});

// this.childrenAnimationFrom(this.general, timeline, {
// xPercent: -120,
// scale: 0.2,
Expand Down
11 changes: 11 additions & 0 deletions src/app/components/heading-box/heading-box.component.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<div style="width: 100%; text-align: center">
<div class="heading-box-wrapper" [ngStyle]="{'width': width}">
<hr class="heading-box-line">
<div class="heading-box">
<p class="heading-box-text">
<ng-content></ng-content>
</p>
</div>
<hr class="heading-box-line">
</div>
</div>
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

}
.heading-box-wrapper {
display: inline-block;
transform: inherit;
width: inherit;
margin: 2vh 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@ import { CommonModule } from '@angular/common';
})
export class HeadingBoxComponent {

@Input({required: true}) text!: string;
@Input({required: false}) width: any = "100%";

}
10 changes: 10 additions & 0 deletions src/app/components/heading-section/heading-section.component.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<div class="heading-section-wrapper">
<div #heading_box>
<heading-box width="{{width}}">{{ heading }}</heading-box>
</div>
<div style="padding-left: 1vw; padding-right: 1vw">
<div #contentWrapper>
<ng-content></ng-content>
</div>
</div>
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
.heading-section-wrapper {
transform: inherit;
}
38 changes: 38 additions & 0 deletions src/app/components/heading-section/heading-section.component.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import {
Component,
ElementRef,
Input,
ViewChild
} from '@angular/core';
import {CommonModule} from '@angular/common';
import {HeadingBoxComponent} from "../heading-box/heading-box.component";

@Component({
selector: 'heading-section',
standalone: true,
imports: [CommonModule, HeadingBoxComponent],
templateUrl: './heading-section.component.html',
styleUrl: './heading-section.component.scss'
})
export class HeadingSectionComponent {

@Input({required: true}) heading!: string;
@Input({required: false}) width: any = "100%";

@ViewChild('heading_box') headingRef: ElementRef;
@ViewChild('contentWrapper') contentWrapper: ElementRef | undefined;

getParts(): HTMLElement[] {
if (this.headingRef && this.contentWrapper) {
const parts = [this.headingRef.nativeElement];
const children = this.contentWrapper.nativeElement.children;
for (let i = 0; i < children.length; i++) {
const part = children[i];
parts.push(part);
}
return parts;
} else {
return [];
}
}
}
14 changes: 14 additions & 0 deletions src/app/components/lifeline-entry/lifeline-entry.component.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<div style="margin-bottom: 4vh;">
<h3 class="lifeline-entry-title text-color-grey-dark-1">{{ title }}</h3>
<h4 class="lifeline-entry-subtitle text-color-grey-dark-1">
<span style="text-align: left">{{ subTitle }}</span>
<span style="text-align: right">{{ date }}</span>
</h4>

<p class="text">
<ng-content></ng-content>
</p>
<ul class="text"><!-- TODO als badge stylen -->
<li *ngFor="let bulletPoint of bulletPoints">{{ bulletPoint }}</li>
</ul>
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
.lifeline-entry-title {
letter-spacing: 2px;
}

.lifeline-entry-subtitle {
display: flex;
justify-content: space-between;
font-style: italic;
}
18 changes: 18 additions & 0 deletions src/app/components/lifeline-entry/lifeline-entry.component.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import {Component, Input} from '@angular/core';
import { CommonModule } from '@angular/common';

@Component({
selector: 'lifeline-entry',
standalone: true,
imports: [CommonModule],
templateUrl: './lifeline-entry.component.html',
styleUrl: './lifeline-entry.component.scss'
})
export class LifelineEntryComponent {

@Input({required: true}) title!: string;
@Input({required: true}) subTitle!: string;
@Input({required: true}) date!: string;
@Input({required: true}) bulletPoints!: string[];

}
9 changes: 0 additions & 9 deletions src/app/heading-box/heading-box.component.html

This file was deleted.

Loading

0 comments on commit 21fe92b

Please sign in to comment.