Voor deze opdracht zijn we voor BAS (Basisapplicaties Strafrechtspraak) op zoek naar een senior ontwikkelaar met ruime kennis van Java/Kotlin. Kennis van Angular is een pré. De opdracht is het realiseren van veilige en kwalitatief herbruikbare componenten in Angular en Kotlin. De software waar je aan gaat werken is/wordt volgens een cloud-native micro-services architectuur ontwikkeld. Als senior back-end ontwikkelaar binnen de Base Ketensamenwerking, kom je te werken in een van de DevOps-teams, dat verantwoordelijk is voor applicatieontwikkeling van BAS. Momenteel en de komende jaren werkt IVO-Rechtspraak aan volledige vernieuwing van diverse applicaties in het domein Strafrecht. Hierbij wordt gebruik gemaakt van nieuwe technologie en een architectuur die gebaseerd is op microservices. Als applicatieontwikkelaar zal je meehelpen met de vernieuwing van de applicaties die onder verantwoordelijkheid vallen van de Base Ketensamenwerking.Je werkt graag in een DevOps-team en voelt je verantwoordelijk voor het eindproduct. Je hebt minimaal 5 jaar ervaring als senior back-end ontwikkelaar en kunt de ontwerpers ondersteunen op het gebied van het technisch ontwerp via microservices. Je bent in staat om deze kennis en ervaring op een prettige manier in te zetten en over te brengen aan je teamleden. Je bent goed in het realiseren van applicaties binnen vastgestelde architectuurkaders en het omgaan met verschillende meningen en werken in een omgeving waarin requirements kunnen wijzigen. Je kunt goed samenwerken, communiceert makkelijk en hebt ervaring met complexe ontwikkelomgevingen.Als back-end ontwikkelaar realiseer je veilige en kwalitatief herbruikbare componenten in Kotlin. Je ontwikkelt software die volgens een cloud-native micro-services architectuur zijn/worden ontwikkeld. De ontwikkelaar maakt onderdeel uit van een team waarin hij zich vooral richt op de (verdere) ontwikkeling van de back-end van de applicatie.Taken:Ontwikkelen van back-end Kotlin software en uitvoeren van code-reviews.Bijdrage leveren aan refinement.Onderhouden en aanpassen framework, componenten en routing binnen Angular/Kotlin.Implementatie van gemaakt design.Inrichten en mee onderhouden van monitoring op de applicatie met behulp van Grafana.Begeleiden van junior/medior ontwikkelaars.Organisatorische contextBij IVO Rechtspraak werken we met de laatste technologieën. Java, Splunk, AppDynamics, Archimate, ReadyAPI, noem maar op. Waar mogelijk gebruiken we slimme marktoplossingen. En we pakken projecten altijd agile aan, in SCRUM-teams en met DevOps. Het leuke is dat je dicht op gebruikers zit. Net als op het nieuws. Want jij werkt op de achtergrond mee aan zaken waar ze in de media over praten. Dat doe je samen met je collega’s. In een prima werksfeer, met veel vrijheid én ruimte voor ontwikkeling. Als IT’er bij de Rechtspraak werk je samen met collega’s uit andere vakgebieden en bundel je de krachten met ketenpartners en marktpartijen. Ook werk je mee naar een nieuwe manier van werken in zelfstandige teams die bestaan uit zowel ontwikkelaars als beheerders en de eindgebruiker (BusDevOps).
Eisen voor de opdracht:Je hebt hbo werk- en denkniveau.Je hebt minimaal 5 jaar ervaring als senior back-end developer in een Java-omgeving.Je hebt ervaring met werken in een Agile/Scrum/DevOps-omgeving.Je hebt ervaring met Java 17+, Kotlin, Spring Boot 3+, Maven 3+, OpenShift/Kubernetes, Liquibase en (Oracle) databases.Je hebt ervaring met Git, Azure DevOps, Nexus, Splunk, Grafana en AppDynamics.Wensen voor de opdracht:Je hebt ervaring met front-end werkzaamheden in Angular.Competenties:Analyserend vermogen: legt verbanden, weegt oplossingsrichtingen af en komt tot een goed advies.Kritisch: realiseren van kwalitatief goede systemen die waarde leveren voor eindgebruikers.Proactief, transparant, open communicatie en resultaatgericht.Kennis van security en privacy richtlijnen (CISSP en AVG).
Referentienummer2026-05868
LocatieUtrecht
Startdatum2 juli 2026
Einddatum2 juli 2027
Optie op verlengingNee
Uren per week36u p/w
Sluitingsdatum6 juli 2026
10:30
Begint jouw trail hier?Stuur ons je CV met een korte opdrachtgerichte motivatie.
Discover your BlueTrailOnze weg naar jouw nieuwe carrière
Nadat jij op een opdracht hebt gereageerd, nemen wij binnen 24 uur contact met jou op en behandelen we jouw reactie.
We gaan met jou in gesprek. Wij kijken niet alleen naar je kennis en werkervaring, maar vooral naar jou als persoon. Dit is voor zowel de professional als de opdrachtgever belangrijk, wij willen de juiste match maken! Als we eenmaal de juiste match hebben gevonden, dan begint jouw BlueTrail en stellen we je voor aan de opdrachtgever!
Bij een succesvolle match worden de contracten opgesteld. Door middel van innovaties en digitalisering proberen wij dit proces zo kort mogelijk te maken. Zo kun jij doen waar je goed in bent, terwijl wij zorgen voor alle administratie!
Ook tijdens jouw opdracht staan wij altijd voor je klaar. Onze fieldmanagers zorgen er persoonlijk voor dan alles succesvol verloopt!
Follow our trail
E-mailadres
gform.initializeOnLoaded( function() {gformInitSpinner( 2, 'https://www.bluetrail.nl/core/modules/934d581a4a/images/spinner.svg', true );jQuery('#gform_ajax_frame_2').on('load',function(){var contents = jQuery(this).contents().find('*').html();var is_postback = contents.indexOf('GF_AJAX_POSTBACK') >= 0;if(!is_postback){return;}var form_content = jQuery(this).contents().find('#gform_wrapper_2');var is_confirmation = jQuery(this).contents().find('#gform_confirmation_wrapper_2').length > 0;var is_redirect = contents.indexOf('gformRedirect(){') >= 0;var is_form = form_content.length > 0 && ! is_redirect && ! is_confirmation;var mt = parseInt(jQuery('html').css('margin-top'), 10) + parseInt(jQuery('body').css('margin-top'), 10) + 100;if(is_form){jQuery('#gform_wrapper_2').html(form_content.html());if(form_content.hasClass('gform_validation_error')){jQuery('#gform_wrapper_2').addClass('gform_validation_error');} else {jQuery('#gform_wrapper_2').removeClass('gform_validation_error');}setTimeout( function() { /* delay the scroll by 50 milliseconds to fix a bug in chrome */ }, 50 );if(window['gformInitDatepicker']) {gformInitDatepicker();}if(window['gformInitPriceFields']) {gformInitPriceFields();}var current_page = jQuery('#gform_source_page_number_2').val();gformInitSpinner( 2, 'https://www.bluetrail.nl/core/modules/934d581a4a/images/spinner.svg', true );jQuery(document).trigger('gform_page_loaded', [2, current_page]);window['gf_submitting_2'] = false;}else if(!is_redirect){var confirmation_content = jQuery(this).contents().find('.GF_AJAX_POSTBACK').html();if(!confirmation_content){confirmation_content = contents;}jQuery('#gform_wrapper_2').replaceWith(confirmation_content);jQuery(document).trigger('gform_confirmation_loaded', [2]);window['gf_submitting_2'] = false;wp.a11y.speak(jQuery('#gform_confirmation_message_2').text());}else{jQuery('#gform_2').append(contents);if(window['gformRedirect']) {gformRedirect();}}jQuery(document).trigger("gform_pre_post_render", [{ formId: "2", currentPage: "current_page", abort: function() { this.preventDefault(); } }]); if (event && event.defaultPrevented) { return; } const gformWrapperDiv = document.getElementById( "gform_wrapper_2" ); if ( gformWrapperDiv ) { const visibilitySpan = document.createElement( "span" ); visibilitySpan.id = "gform_visibility_test_2"; gformWrapperDiv.insertAdjacentElement( "afterend", visibilitySpan ); } const visibilityTestDiv = document.getElementById( "gform_visibility_test_2" ); let postRenderFired = false; function triggerPostRender() { if ( postRenderFired ) { return; } postRenderFired = true; gform.core.triggerPostRenderEvents( 2, current_page ); if ( visibilityTestDiv ) { visibilityTestDiv.parentNode.removeChild( visibilityTestDiv ); } } function debounce( func, wait, immediate ) { var timeout; return function() { var context = this, args = arguments; var later = function() { timeout = null; if ( !immediate ) func.apply( context, args ); }; var callNow = immediate && !timeout; clearTimeout( timeout ); timeout = setTimeout( later, wait ); if ( callNow ) func.apply( context, args ); }; } const debouncedTriggerPostRender = debounce( function() { triggerPostRender(); }, 200 ); if ( visibilityTestDiv && visibilityTestDiv.offsetParent === null ) { const observer = new MutationObserver( ( mutations ) => { mutations.forEach( ( mutation ) => { if ( mutation.type === 'attributes' && visibilityTestDiv.offsetParent !== null ) { debouncedTriggerPostRender(); observer.disconnect(); } }); }); observer.observe( document.body, { attributes: true, childList: false, subtree: true, attributeFilter: [ 'style', 'class' ], }); } else { triggerPostRender(); } } );} );