{"name":"languages","slug":"languages","paginate_by":null,"paginate_path":null,"render":true,"feed":false} {"name":"Typescript","slug":"typescript","path":"/languages/typescript/","permalink":"https://martin-thurau.de/languages/typescript/","pages":[{"relative_path":"story/drklein.md","colocated_path":null,"content":"<p>Dr. Klein Privatkunden is a financial intermediary for property loans, insurance and instalment loans for consumers. It\nuses <a href=\"https://www.holacracy.org/\">Holocracy</a> as it's organization scheme, which provides a unique way of influencing the\ndecision making process of the organization. I worked in the Team &quot;Plattform&quot; to create a software platform that connects\nproperty-related partners like real estate agents and architects with customers. <span id=\"continue-reading\"></span> When I joined, the\nproject was in it's beginning stages so I had the opportunity to work on various parts of the project:</p>\n<h2 id=\"development-lead-for-the-brand-new-customer-portal-from-start-to-production\">Development lead for the brand new customer portal from start to production</h2>\n<p>The customer portal is based on a micro-frontend architecture written in Angular that communicates with multiple Spring\nBoot microservices in the backend via a RESTful API, which are all tied together by a Kafka based event system. It\nfeatures a section for the personal data of customers, a view on the current customer service agent, a multi-step wizard\nfor all the relevant property loan data and a document upload. Property loans require a lot of paperwork which was\npreviously managed manually and offline by sales agents. The document upload provides a way for customers to upload all\nthe relevant documents which are then automatically organized according to their type and are directly available in the\nsoftware that the sales agents use. This greatly reduced the complexity of this part of the customer journey by making\nthe process fully digital for the customer and our sales agents.</p>\n<h2 id=\"maintenance-for-login-and-registration\">Maintenance for login and registration</h2>\n<p>With the growing number of features and team members I took over the maintenance and future development of our core\nauthentication and authorization system and the API gateway. All users of the system authenticate via an OAuth2 based\nlogin system and all internal and external requests are validated by a central API gateway before being processed. This\nallowed us to publicly expose all of our APIs which makes integration of other internal and external systems easy. We\nalso dogfooded our APIs with our own frontends. My tasks involved continued improvement and bug-fixing of the login and\nregistration process and the aforementioned authentication process.</p>\n<h2 id=\"involvement-and-architecture-und-devops\">Involvement and Architecture und DevOps</h2>\n<p>I was part of the architecture and devops circles. The architecture circle aimed to facilitate the continued improvement\nof our general architecture and also served as a decision making entity for it. It is also the place to exchange, discuss\nand approve architectural decisions of the individual subteams which we do with regular work meetings. The DevOps circle\nbrought together all developers that hold the &quot;DevOps hat&quot; in the subteams. We used an infrastructure-as-code based\napproach based on Terraform (for general provisioning) and Kubernetes. Most of the actual day-to-day devops work was\nmostly handled autonomously by the developers in the subteams. This circle was the central place to discuss ideas and\nsolve problems. We also did most of the overarching groundwork here.</p>\n<h2 id=\"migrating-our-event-system-from-rabbitmq-to-kafka\">Migrating our event system from RabbitMQ to Kafka</h2>\n<p>Our microservice architecture used an event based architecture for propagating state and data between services and\nespecially context boundaries. Those events were previously published via RabbitMQ in publish/subscribe configuration.\nIn order to keep logical consistency we wanted to keep certain ordering guarantees which required custom logic for all\nreaders. This proved to be a cumbersome and poorly performing part of our overall architecture so we decided to switch\nover to Kafka as an event bus. My work here involved prototyping and testing, writing and maintaining the shared\nintegration library (based on Spring Kafka) as well as supporting other developers in the migration.</p>\n<h2 id=\"maintaining-internal-libraries\">Maintaining internal libraries</h2>\n<p>Additionally to the Kafka related library I also maintained an internal Java library for our Spring Boot microservices.\nThe library handles common tasks for monitoring, tracing, authentication for internal and external requests and testing.</p>\n<h2 id=\"exploring-new-technologies-and-tools\">Exploring new technologies and tools</h2>\n<p>In some extra time I explored various new tools and languages and introduced them to the team. I brought in Kotlin as a\nsecondary JVM language for our Spring Boot microservices (the document upload is fully written in Kotlin) and also\ndeveloped an auxiliary monitoring tool with Rust to get some insight into the language. Additionally, I wrote a Yeoman\nbased code generator to reduce the amount of code that has to be written for new entities which saved a lot of typing\nhours for my teammates and me.</p>\n<h2 id=\"developer-support\">Developer support</h2>\n<p>Being a full stack developer and also a pretty early member of the team I knew most parts of the system to some degree.\nBecause of this I was frequently asked by other team members about details of our system. I was also sometimes involved in\ndebugging and the onboarding of new team members.</p>\n<p>Additionally I also held multiple Holocracy related roles such as facilitator (who leads and mediates meetings) and\nsecretary (who organizes and documents said meetings).</p>\n","permalink":"https://martin-thurau.de/story/drklein/","slug":"drklein","ancestors":["_index.md","story/_index.md"],"title":"Dr. Klein Privatkunden AG","description":null,"updated":null,"date":null,"year":null,"month":null,"day":null,"taxonomies":{"languages":["Kotlin","Java","Rust","Javascript","Typescript"],"technologies":["Spring Boot","Kafka","MySQL"]},"authors":[],"extra":{"work_from":"2019-04-01","work_until":"2021-09-30","link":"https://www.drklein.de","logo":"story/drklein_logo.png"},"path":"/story/drklein/","components":["story","drklein"],"summary":"<p>Dr. Klein Privatkunden is a financial intermediary for property loans, insurance and instalment loans for consumers. It\nuses <a href=\"https://www.holacracy.org/\">Holocracy</a> as it's organization scheme, which provides a unique way of influencing the\ndecision making process of the organization. I worked in the Team &quot;Plattform&quot; to create a software platform that connects\nproperty-related partners like real estate agents and architects with customers. ","toc":[{"level":2,"id":"development-lead-for-the-brand-new-customer-portal-from-start-to-production","permalink":"https://martin-thurau.de/story/drklein/#development-lead-for-the-brand-new-customer-portal-from-start-to-production","title":"Development lead for the brand new customer portal from start to production","children":[]},{"level":2,"id":"maintenance-for-login-and-registration","permalink":"https://martin-thurau.de/story/drklein/#maintenance-for-login-and-registration","title":"Maintenance for login and registration","children":[]},{"level":2,"id":"involvement-and-architecture-und-devops","permalink":"https://martin-thurau.de/story/drklein/#involvement-and-architecture-und-devops","title":"Involvement and Architecture und DevOps","children":[]},{"level":2,"id":"migrating-our-event-system-from-rabbitmq-to-kafka","permalink":"https://martin-thurau.de/story/drklein/#migrating-our-event-system-from-rabbitmq-to-kafka","title":"Migrating our event system from RabbitMQ to Kafka","children":[]},{"level":2,"id":"maintaining-internal-libraries","permalink":"https://martin-thurau.de/story/drklein/#maintaining-internal-libraries","title":"Maintaining internal libraries","children":[]},{"level":2,"id":"exploring-new-technologies-and-tools","permalink":"https://martin-thurau.de/story/drklein/#exploring-new-technologies-and-tools","title":"Exploring new technologies and tools","children":[]},{"level":2,"id":"developer-support","permalink":"https://martin-thurau.de/story/drklein/#developer-support","title":"Developer support","children":[]}],"word_count":809,"reading_time":5,"assets":[],"draft":false,"lang":"en","lower":null,"higher":null,"translations":[{"lang":"de","permalink":"https://martin-thurau.de/de/story/drklein/","title":"Dr. Klein Privatkunden AG","path":"/opt/buildhome/repo/content/story/drklein.de.md"},{"lang":"en","permalink":"https://martin-thurau.de/story/drklein/","title":"Dr. Klein Privatkunden AG","path":"/opt/buildhome/repo/content/story/drklein.md"}],"backlinks":[]},{"relative_path":"story/esailors.md","colocated_path":null,"content":"<p>eSailors is a software provider for online lottery platforms. They run a mutli-tenant, multi-language eCommerce platform\nwith over 400.000 monthly active users. I worked in the &quot;Games&quot; area which provides the front- and backend parts for the\nactual lottery experience of the platform.<span id=\"continue-reading\"></span></p>\n<h2 id=\"development-and-improvement-of-lotteries\">Development and improvement of lotteries</h2>\n<p>The stack is mainly JVM focused with over 70 micro (sometimes not-so-micro) services all running inside a Kubernetes\ncluster. I worked in the front- and backend to add new features to existing lotteries as well as implement completely\nnew ones. Implementing new lotteries involved touching many parts of our system from the actual UI, over the purchase\nprocess into the ticket history view as well as payment and hedging. Some of the work was done directly by team “Games”\nwhile others where coordinated with other teams inside eSailors.</p>\n<h2 id=\"extracting-the-lotteries-into-micro-frontends\">Extracting the lotteries into micro-frontends</h2>\n<p>The core frontend (called “the webshop”) was a Spring-Boot + Angular monolith that took a long time to deploy due to an\nover-complicated build system and hundreds of (sometimes flaky) integration tests. To gain the ability to deploy our\nassets independently the team Games started extracting our games core into a separate project that could be tested and\ndeployed independently and was then loaded into the core frontend via a small wrapper using an IFrame. While this worked\nout great eventually there were lots of challenges on the way.</p>\n<h2 id=\"migration-from-angularjs-to-angular\">Migration from AngularJS to Angular</h2>\n<p>The frontend for the lotteries was originally done with AngularJS. During my time we completely migrated the lotteries\nfrontend themself and also most parts of the rest of the frontend from AngularJS to Angular. This was done iteratively\nwhile keeping the shop running and continuously deploying to production. The frontend was a large, monolithic\napplication that also involved some server side rendering for certain pages. Keeping that all together and running\nsmoothly during such an invasive migration uncovered lots of interesting corner cases and bugs that we had to solve to\nkeep the site running</p>\n<h2 id=\"internationalization-of-lottery-platform\">Internationalization of lottery platform</h2>\n<p>The company decided to go into the international lottery market (starting with Ireland, followed by Scotland and\nRomania). The system was previously German only and not, in the most parts, no preparation for internationalization.\nAdding this to the front- and backend was a huge task that occupied most of the engineers for a long time. We added\nsupport for multiple languages but also different currencies and had a lot of fun fixing layout bugs because text was\nnow suddenly a lot shorter or longer than previously anticipated and finding a solution where we programmatically built\ntext from snippets.</p>\n","permalink":"https://martin-thurau.de/story/esailors/","slug":"esailors","ancestors":["_index.md","story/_index.md"],"title":"eSailors IT Solutions GmbH","description":null,"updated":null,"date":null,"year":null,"month":null,"day":null,"taxonomies":{"languages":["Typescript","Java","Javascript"],"technologies":["Angular","AngularJS","Kubernetes","Protractor","Jasmine","Pupeteer"]},"authors":[],"extra":{"work_from":"2016-10-01","work_until":"2019-03-31","logo":"story/esailors_logo.png","link":"https://www.lotto24.de/"},"path":"/story/esailors/","components":["story","esailors"],"summary":"<p>eSailors is a software provider for online lottery platforms. They run a mutli-tenant, multi-language eCommerce platform\nwith over 400.000 monthly active users. I worked in the &quot;Games&quot; area which provides the front- and backend parts for the\nactual lottery experience of the platform.","toc":[{"level":2,"id":"development-and-improvement-of-lotteries","permalink":"https://martin-thurau.de/story/esailors/#development-and-improvement-of-lotteries","title":"Development and improvement of lotteries","children":[]},{"level":2,"id":"extracting-the-lotteries-into-micro-frontends","permalink":"https://martin-thurau.de/story/esailors/#extracting-the-lotteries-into-micro-frontends","title":"Extracting the lotteries into micro-frontends","children":[]},{"level":2,"id":"migration-from-angularjs-to-angular","permalink":"https://martin-thurau.de/story/esailors/#migration-from-angularjs-to-angular","title":"Migration from AngularJS to Angular","children":[]},{"level":2,"id":"internationalization-of-lottery-platform","permalink":"https://martin-thurau.de/story/esailors/#internationalization-of-lottery-platform","title":"Internationalization of lottery platform","children":[]}],"word_count":439,"reading_time":3,"assets":[],"draft":false,"lang":"en","lower":null,"higher":null,"translations":[{"lang":"en","permalink":"https://martin-thurau.de/story/esailors/","title":"eSailors IT Solutions GmbH","path":"/opt/buildhome/repo/content/story/esailors.md"},{"lang":"de","permalink":"https://martin-thurau.de/de/story/esailors/","title":"eSailors IT Solutions GmbH","path":"/opt/buildhome/repo/content/story/esailors.de.md"}],"backlinks":[]},{"relative_path":"story/keeeb.md","colocated_path":null,"content":"<p>keeeb was initially developed as a platform to collect and share information (think Evernote/Google Keep/etc.) on the\nweb. After a pivot we focused more on the enterprise sector as a tool for collective information gathering and knowledge\nstorage. I worked here part time during my time as a student and later as a full-time developer.<span id=\"continue-reading\"></span></p>\n<h2 id=\"cross-browser-extension-to-collect-information\">Cross browser extension to collect information</h2>\n<p>keeeb as a information collection software required a way for users to actually collect things they are interested in\nwhile browsing the web. When I initially joined this was done through a bookmarklet that would inject Javascript and CSS\ninto the site and they present a simple UI to collect snippets. I migrated this to a real browser extension that was\nwritten with the help of the Kango Framework which allowed writing an extension that would run in all major browsers\nwithout the need to do a rewrite for each of them.</p>\n<h2 id=\"cross-platform-mobile-app\">Cross platform mobile app</h2>\n<p>Given the small team size and tight money constraints we simply could not have dedicated developers to build mobile\napplications. Because of this I built an app for Android and iOS that used Phonegap as a base and Backbone.js for the\nrendering. Given how junior I was at the time I’m very proud of past-me how well the app performed.</p>\n<h2 id=\"frontend-rewrite\">Frontend rewrite</h2>\n<p>As a replacement for our old, static frontend we designed and implemented a completely new one. This frontend was built\nas a single page application based on AngularJS. My work involved initial design and implementation. Later I worked on\nadding new features and maintenance. I also designed and implemented most parts of our build system (based on Gulp) to\nensure easy development and clean deployment.</p>\n<h2 id=\"day-to-day-maintenance\">Day to day maintenance</h2>\n<p>I also did some maintenance work on our Pyramid based backend servers and implemented new features. During this time I\nhelped with the migration from MongoDB to PostgreSQL. We also added a full-text search based on Elasticsearch and\nmigrated our backend job-system from a homebrew version to something based on Celery and RabbitMQ.</p>\n<h2 id=\"director-of-development\">Director of development</h2>\n<p>Due to some changes in the company structure I was also asked to take over the role of “Director of development”. The\nwork here involved planning and designing of new features as well as project management and organisation of our\ndevelopment team.</p>\n","permalink":"https://martin-thurau.de/story/keeeb/","slug":"keeeb","ancestors":["_index.md","story/_index.md"],"title":"keeeb GmbH","description":null,"updated":null,"date":null,"year":null,"month":null,"day":null,"taxonomies":{"technologies":["Angular","AngularJS","Kubernetes","Protractor","Jasmine","git"],"languages":["Typescript","Java","Javascript"]},"authors":[],"extra":{"work_from":"2013-04-01","work_until":"2016-10-30","logo":"story/keeeb_logo.png","link":"https://www.keeeb.com/"},"path":"/story/keeeb/","components":["story","keeeb"],"summary":"<p>keeeb was initially developed as a platform to collect and share information (think Evernote/Google Keep/etc.) on the\nweb. After a pivot we focused more on the enterprise sector as a tool for collective information gathering and knowledge\nstorage. I worked here part time during my time as a student and later as a full-time developer.","toc":[{"level":2,"id":"cross-browser-extension-to-collect-information","permalink":"https://martin-thurau.de/story/keeeb/#cross-browser-extension-to-collect-information","title":"Cross browser extension to collect information","children":[]},{"level":2,"id":"cross-platform-mobile-app","permalink":"https://martin-thurau.de/story/keeeb/#cross-platform-mobile-app","title":"Cross platform mobile app","children":[]},{"level":2,"id":"frontend-rewrite","permalink":"https://martin-thurau.de/story/keeeb/#frontend-rewrite","title":"Frontend rewrite","children":[]},{"level":2,"id":"day-to-day-maintenance","permalink":"https://martin-thurau.de/story/keeeb/#day-to-day-maintenance","title":"Day to day maintenance","children":[]},{"level":2,"id":"director-of-development","permalink":"https://martin-thurau.de/story/keeeb/#director-of-development","title":"Director of development","children":[]}],"word_count":393,"reading_time":2,"assets":[],"draft":false,"lang":"en","lower":null,"higher":null,"translations":[{"lang":"de","permalink":"https://martin-thurau.de/de/story/keeeb/","title":"keeeb GmbH","path":"/opt/buildhome/repo/content/story/keeeb.de.md"},{"lang":"en","permalink":"https://martin-thurau.de/story/keeeb/","title":"keeeb GmbH","path":"/opt/buildhome/repo/content/story/keeeb.md"}],"backlinks":[{"permalink":"https://martin-thurau.de/story/master/","title":"Universität zu Lübeck"}]}],"page_count":3}