Career Profile
My name is Tjeerd Verhagen and as a freelance Full Stack Developer / DevOps Engineer I have more than 20 years of experience. During my career I have always shown interest in all aspects of development. From initial customer need to running software in the production environment. Apart from the technical knowledge required for this, I am also interested in what methods there are to organize the work, how to get the most out of a team. If it happens that way, I like to give a presentation or workshop and thereby inspire others, so that they can make a flying start.
- Full Stack Developer
- DevOps Engineer
T-Shaped
- Analytical
- Accurate
- Inquisitive
- Inspire
Methods
Kanban; Scrum; Agile Manifesto; Extreme Programming; Test Driven Development; Clean Code; Specification by Example; Domain Driven Design; Anglo-Saxon Model vs Rhineland Model
Technology
Source Code Management; Issue Tracking; Code Review; Unit-Testing; Code Coverage; Code Metrics; Continuous Integration; Continuous Delivery / Deployment; Virtualization; Source Code Analyzing; Artifact Repository; Document Generation
Languages
Java 8/11; Python; TypeScript; Bash
Tools
Eclipse; Eclipse-Plugins; Git; GitLab; GitHub; BitBucket; Mercurial; Gradle 6/7; Maven 3; Maven-Plugins; TestNG; Mockito; JaCoCo; NodeJS; npm; Grunt; Angular; Jenkins Pipeline; Travis-CI; Artifactory; Nexus; SonarQube; XL-Deploy; XL-Release, Spring 4; SpringBoot; Jersey; Cucumber; Selenium; IBM WebSphere; Jboss EAP; Jetty; Nginx; Docker; Kubernetes; Nolio; VmWare ESXi; Vagrant
Operating Systems
OS-X; RedHat; Debian; Cent-OS; Ubuntu; Free-BSD; LTSP
Interests
OpenAPI (Swagger); AWS; Docker; Kubernetes; Kafka; MongoDB; OrientDB; Cassandra; NodeJS; Express; ElasticStack; Angular; Kotlin; SaltStack
Experiences
As the logs flow from production to the back office, they pass through a Sensitive Data Scanner. This Scanner did require some maintenance, especially updating the Java and Kafka versions.
The setup of the project and the lack of (unit) tests, made it also hard to maintain and making changes in the code.
What did I do:
- Introducing the Maven Module structure
- Adding unit tests and mutation testing
- Refactoring the code, so it became better testable
- Solving issus in the code, so the vulnerability scans
- Knowledge transfers, with other developer
- Using git-repo with feature branches
- Setting up the build in Cloudbees-CI Environment (Jenkins)
- Set up creation of Docker image
- Deploying the Docker image and it’s configuration with Ansible
- Improving the Ansible deploymnt, so it’s more inline with other unix applications
- Adding the log4j configuration, as part of the deployment (and no longer only in the jar)
- Updating to Kafka version in production
- Replacing deprecated Kafka features (branch -> split)
- Updating to Java 17
- Updating Maven dependencies and plug-ins
- Improving configuration
- Allow different formats (plain text, properties, json, csv)
- Allow comments in the configurations
- Adding some design patterns: Chain of Responsibility, Visitor, Fluent Interface
- Removing duplicated code
- Improving the creation of Kafka Topologies
- Adding Feature Toggles for:
- switching between implementations of topology models
- sending output as avro record
- sending output as json
- Updating the logging, to use latest feathers of log4j2
- Logging as json, instead of flat message
- Using new features of the Java language and libraries
- Improving the cli by adding Picocli
- Adding version info, git hash as code in the build, so it can be used for logging during startup
- Adding version info, of libraries used
- Adding documentation
Scrum / Agile, Java 17, Maven 3.8, (Gradle 8), Kafka 3.3, JUnit 4/5, Mockito, jsonassert, Cloudbees-CI, Nexus, Jenkins, SonarQube, NexusIQ, Synopsys Converity, Git, BitBucket, Confluence, Jira, Crucible, MatterMost, Teams, Docker, Ansible Tower, RedHat, Universal Base Image, VmWare
Cleanup implementation of functionality, no longer in use. Implement new business requirements.
Implement several business validations, in C# and TypeScript, which could then be used by the PowerApps application.
Scrum / Agile, IntelliJ, Java 8, Maven 3, JBoss, LiquiBase, Jira, Confluence, FitNesse, Visual Code (TypeScript, C#)
- Adding Lima functionality for the new 2022 DMFA (multifunctionele aangifte) rules from the Belgian tax office;
- Importing data through batch import from Excel;
- Importing attachments / avatars through batch import from Zip file;
- Exporting data as Excel files;
- Creating enum-generator-maven-plugin for generating source code based on database content.
Scrum / Agile, Java 8, Maven 3, Git, GitLab, Junit 4, Mockito, Spring, Angular, TypeScript, Vagrant, Docker, Informix, DB-Viewer, IntelliJ, Jira, Confluence, Teams, Slack
During the conversion of the application Handmatig Opvoeren Betalingen, from WebSphere v8.5 to WebSphere v9.0, I’ve solved a nasty bug.
Initially I’ve been adding and updating existing Robot Framework scripts, but soon the question was asked if this is the best way to regression test the functional requirements. Also the learning curve for Robot Framework is quite high and maintainability quite hard. After setting up a POC for Cucumber as well as Karate API Testing, the team decided in favour of Cucumber. It looks better maintainable and is a lot developer friendly! An additional advantage, which was ‘discovered’ during the conversion of some initial Robot Framework test to Cucumber scenario’s, was the ability to debug!
WebSphere 8.5 / 9.0, Scrum, SAFe, Java 8, Maven 3, Git, BitBucket, Jenkins Pipeline, Junit 5, Mockito, Cucumber, Selenium, Karate, Robot Framework
As team member of the Search Team, I simplified the Integration Tests, by using a locally launched (and stopped) Elasticsearch Node, through Maven. Instead of through a Docker instance. This makes it easier and faster. As well as easier to change to a newer version for testing.
Developed a Maven plug-in, which creates an Elastic script, for creating index, mapping and initial data filling.
Designed the architecture for a Time-Machine based File-Store as well as developed it, with use of Verticles from Vert.x (comparable with Actors in Akka). Through this implementation of the File Store, there are stable data sets available. Which is a great improvement for testing. There is a restful interface, which makes it possible to directly upload a specific set of documents into a specific Elasticsearch cluster.
Vert.x, ElasticSearch, Java, GitLab CI, Maven, Maven Plug-in, Karate API Testing
The development of TotalPatentOne is in a crucial phase, as they like to replace the older TotalPatent solution by the new version. One of the most critical pieces, the TPO search language, contained several issues. As member of the search team, I was involved in defining the search specific grammar for patent documents. This search grammar is written in Antlr4. Based on the generated Antlr classes, we implemented the TPO query model, which is a tree model. This tree is then used by several visitors, for optimizing the tree, calculating search complexity, validating specific input details. And finally to create the ElasticSearch specific query.
Antlr4, Spring-Boot, ElasticSearch 6, TDD, Scrum, Maven 3, GitLab, Junit 4, Mockito, Git, Karate
As a member of the Continuous Integration and Delivery Deployment Team, there were a lot of challenges. As a team we were dealing with the transition from a green field project to a service delivery team. The green field project was set up to automatically roll out the new RedHat-based environments for all DevOps team within DUO. An important part of this is the Provisioning Self Service Portal, through which developers and testers can request and manage their own environment (s). This means that they have their own JBoss EAP instances at their disposal. Possibly supplemented with Static Content instances and database schema links. Where test data can be loaded if necessary.
- Infrastructure as Code
- Immutable Infrastructure
- Infrastructure as a Service
- Self-Service
Configured filebeat and logstash for additional logging from JMeter results in Jenkins. Giving testers easy access to the results. Involved in the upgrade from ElasticSearch 3 to 5 / 6 including additional tool stack.
RedHat Linux 7 (500+ VM’s), JBoss EAP, Nginx, RedHat IPA, RedHat Satellite, Zabbix, Puppet, Elastic Stack, XL-Deploy, XL-Release, Jenkins master / slaves, Artifactory, SonarQube, HPE-Fortify, Subversion, Git, Gerrit, GitLab, Jira, Confluence, VmWare vSphere, VmWare ESXi, Docker, Microsoft Orchestrator, Maven, Java, AngularJS, Python, Bash shell scripting, IBM DB2, Redis
Setting up integration tests on the basis of Specification by Example, within the Programma Vernieuwing Studiefinanciering (PVS) (Program Renewal of Student Finance), in the Integration Test Team. Developing a glue library, allowing setting up basic principle for the various integration tests. Give workshops to other team members, so they understand the new technology stack as well. Workshops DUO wide for mostly testers. With subjects like TDD, BDD and API testing in a Java environment. But also with things like use of Eclipse, Git, Maven 3, Jenkins.
Agile, Scrum, Java, Cucumber, Git, GitLab, Selenide, Maven 3, Jenkins, Junit 4, Selenium, WebDriver, GitLab, Docker, CentOS
Within the Programma Vernieuwing Studiefinanciering (PVS) (Program Renewal of Student Finance), as member of the Integration Test Team, investigate the possibilities to use Parasoft Virtualize, for simulating connected systems. This was for internal as well as for external PVS systems.
Parasoft Virtualize; Parasoft SOATest
Our DevOps Team was responsible for converting ING backoffice web forms to the new technology stack. Together with the Product Owner, we were responsible for all aspects from initial requirements till running it production.
- Building and testing of forms build with AngularJS;
- Building and testing of Java Rest-APIs;
- Building and testing of SOAP-service clients;
- Deployen through DTAP environment;
- Administration of the Team own Linux development server.
Agile / Scrum, J2SE 7, J2EE 6, AngularJS, Maven 3, Jenkins, Junit 4, Mockito, Karma, Protractor, Eclipse, Git, Parasoft Virtualize, SoapUI, Jetty, JSON, Nolio, Debian
Design and development of various internet banking wizards, which are part of the ING internet banking web application. Both front-end development and connecting with backend system through Tibco web services.
- Design, construction and testing of web applications in a Scrum team;
- Deployment of the web application through the DTAP;
- Improving the code issues that appear in the existing code in the Sonar / Fortify checks. Include refactoring as part of the daily activities;
- Being part of the open-source projects within ING, similar to Eclipse / Apache open-source projects;
- Implementing improvements in the local development environment and CI environment;
- Manage the Team own Linux development server;
- Writing documentation, about setting up a development environment.
Agile / Scrum / XP, Java 6, Spring MVC, Spring WS, Nexus, Maven 3, Jenkins, Sonar, Fortify, Git, Junit, Eclipse, RSA, WebSphere, Jetty, Selenium, Fitnesse, Confluence, Jira, TDD, Continuous Integration, Continuous Delivery, XSD, XML, Web-Services, SOAP, JavaScript, Balsamiq, Debian
Implementation of the design, in several sprints, where each sprint demo showed the new additions and improvements.
AppCelerator, Xcode, Android SDK, iPhone, iPad, Android phone, JavaScript, Balsamiq
This assignment was asked to do an audit of the already developed software. The audit paid attention to various points, including: performance (suitability for this purpose); price (production, license and management costs); amount of functionality realized. The audit report has been the basis on which various IT components have, or have not been taken over by Stichting NL (NL Foundation).
PHP 5, Symfony 2.0, Doctrince 2.0, MySql 5.1, Zend Paginator, JQuery, MongoDB, Groovy, Liferay
Providing advice on technical improvements to application architecture, particularly in the field of OSGi. Reduce the time to market, for the software developed. Daily deploments. Re-establishing Continuous Integration environment. Give advice on what to use for the Issue Management system and how to set it up. Activities:
- Evaluate the architecture of the OSGi application;
- Improve the design of the OSGi bundles;
- Improve the Maven setup;
- Setting up CI environment;
- Advise on how to set up an issue management system;
- Developing OSGi bundles, for new functionality;
- Code reviews.
Apache Felix, Apache Karaf, Spring DI, Spring DM, Spring ORM - Hibernate - PostgreSQL, JPA, Apache ActiveMQ, Wicket, Maven 2/3, Nexus, Jenkins, Jira
In addition to the AC-Server, there are a large number of AC-Interfaces, with which financial data from data vendors can be loaded in the AC-Server in a standardized manner. The changes that the various data vendors implement in their product can have an effect on the corresponding AC-Interface. In addition to adjusting the various interfaces, Tjeerd has worked to improve the (automated) testability, improve the development process, improve the Continuous Integration and professionalize the accompanying documentation. Generating PDFs and HTML based on DocBook XML. In doing so, he wrote, among AC-Interface functionality, Maven-Plug-ins, Eclipse-Plugins and Junit extensions. With these JUnit extentions specific AC-Interface tests, could be run like Junit tests.
Java 5/6, Maven 2, VmWare LabManager, DocBook, XSL, XSLT
At the request of a customer, the On Demand Asset Request Service was developed. This service can be used to retrieve the details of an asset, based on a direct question, at one of the data vendors. Because high demands were made on availability and there was a high chance of changes, the modularity of OSGi was chosen.
OSGi Equinox, Java 5/6, Maven 2
- Setting up the Hudson server;
- Updating all project from Ant to Maven.
Hudson, Nexus, Maven, csv
The existing AC-Desktop was not user-friendly and had arisen from a technical approach. As a result, AC-Desktop 2.x was unnecessarily complex for the largest group of end users. The development of AC-Desktop 3 is based on the users who do data handling. The desktop is a Swing application, which connects to the AC Server. This allows the end users to gain insight into the financial data stored in the AC Server. Tjeerd has done both part of the development and looked at the continuous integration system. Until then, Ant was used in combination with Continuous Integration. In this project, the existing system was also used (trial run) with Maven, Hudson and Nexus.
Java 5, Swing, Continues Integration, Ant, Maven, Hudson, Nexus
Setting up the automated test environment through VmWare LabManager. Using client images for the different environments. The software under test was automatically installed. Then the integration tests were carried out and the results were retrieved. These could then be compared from within the CI environment with previous results.
VmWare Server, VmWare LabManager, Ant, Continuous Integration, MQ-Series, Sonic-MQ, WebSphere, Jboss, Oracle Application Server
Updating the existing application, which until then made of accessed multiple databases directly. The databases where replaced by other systems, which could be accesed by SOAP messages.
Java 1.4/5, SOAP, Apache Axis 2, WSDL, Ant, Maven, commons logging, Jira
Participate daily in the construction of the Order Manager within the Scrum Team.
- Automatic generation of Release Notes in the form of PDF and HTML. A part of the data was extracted from Jira. Each release of the Order Manager, therefore, also provided the corresponding Release Notes.
Agile / Scrum, Java 1.4, Spring-DI, Spring-AOP, Spring-ORM, Hibernate, Oracle Application Server, cvs, Ant, Maven, DocBook, XML, XSL, XSLT, Jira, Apache Axis
Based on the change request from the customer, adjustments had to be made to the Service Order Gateway (SOG) client application, in which Tjeerd functioned as a developer. To gain more insight into the functioning of the application, Tjeerd has made a number of UML diagrams of the application to supplement the existing documentation. With the knowledge and experience from previous projects with regard to automatic build and release processes, Tjeerd has implemented a number of changes, making it easy to compile, run and test the application both on the local workstations and on the server. Partly on the advice of Tjeerd during the project was chosen to change source version management tool, the choice is made for cvs.
Java, Swing, cvs, Ant, UML
For PIMS, Tjeerd defined the architecture of this web application.The techniques to be used had already been recorded and consisted of Java, JSP, Tomcat and Oracle. Various open source components were added for such things as logging, database connection pooling, user input validation and unit testing. Furthermore, the MVC concept was chosen as the basis for the web application. POJOs were used to transport information within the application. These were generated on the basis of an XML schema. In the development use was made of open standards such as XML, XML schema, CSS and HTML 4. When designing the application, the viewed design patterns for web applications such as MVC, DAO, Plug-In were used as much as possible.In addition, the source code version management set up and introduced to the other team members. This supplemented with build, test and release scripts.
Java 1.3, Apache Struts, Oracle SQLJ, Castor, XSD, HTML, CSS, Ant, Junit, cvs
The Tibco middleware consists of a number of basic products and an extensive range of standard adapters for various back-office systems. However, there is no standard adapter for the Cordaptix billing package. The technical design for this had to be made first. It was very important to get a quick insight into the functioning of the various back-office systems that sent Tibco messages towards Cordaptix. As a starting point for thecommunication with Cordaptix served the new interface based on XML-SOAP. When designing as much use as possible of design patterns noted in UML. The implementation has been done by means of Tibco adapter SDK. In addition, use was made of various open source standards and components, such as XML, XML Schema, FreeMarker, log4j, etc.
Java, Tibco-SDK, SOAP, FreeMarker, Log4j, Cvs, Ant, UML