Hi, I am Timme,
I am a fullstack software engineer with a passion for creating high-quality, efficient, and scalable web applications.
My expertise spans both frontend and backend development, including domain modeling, database design, unit testing, and architectural design.
Over the past 9+ years, I have worked on a variety of projects, from a small start-up to larger enterprise applications, and have developed a deep understanding of what it takes to build successful software solutions.
On this site, you will find examples of my work, as well as information about my skills and experience. Thank you for visiting, and I look forward to connecting with you!
1. Skills & Tools
Kotlin
Java
PHP
MySQL
Spring
DDD
DDD
JUnit
Mockito
Mockito
Android
CI/CD
CI/CD
Typescript
Javascript
React
JSS
NodeJs
Tailwind
Bootstrap
Express
Express
2. Previous Work
MoneyMonk
During my time at MoneyMonk, an accounting SaaS solution for freelancers, I contributed to various significant projects that helped the company evolve from its start-up phase into a successful scale-up. Some of the projects I worked on include an affiliate marketing system, a customer management system, a compliance management system, and a ticketing system (for both internal and external use).
Furthermore, I played a vital role in the development of hour and ride registration systems, a recurring invoicing system, and setting up invoice emailing.
Additionally, I created multiple dashboards, landing pages, and reporting tools. I also designed various user interfaces using both traditional PHP/HTML templates and React and ensured system reliability by implementing unit testing.
NewCraft
I worked at NewCraft on various projects for major Dutch telecom companies like KPN and Telfort.
One significant project was a payment portal for customers with unpaid telecom invoices resulting in a blocked connection. The portal offered an easy payment solution for customers to pay bills and get quickly reconnected.
Another project was the Business Rule Engine; a multi-tenant mobile subscription price and discount calculator. It allowed downstream clients to calculate the cost of a mobile subscription based on device type, data usage and other generic inputs. The project required an easily configurable setup and close collaboration with stakeholders to forecast possible business needs.
Informatieschermen
Working for Informatieschermen, a provider of plug and play narrowcasting solutions, I worked on migrating legacy Java code to updated Kotlin code, which ran on Android minicomputers, as well as envisioning a more stable screen rendering solution.
The migration improved the stability of the system as well as providing options for further development. Throughout the migration process, a new unit testing framework was implemented to minimize the risk of regression and ensure quality control.
Wat de fiets schaft
For the catering and food truck service "Wat de Fiets Schaft", I built a fully custom website using React and Typescript to ensure high-quality and high-performance.
I integrated the site with PayloadCMS, a headless CMS that allows for flexible customisable content management without going outside the design boundaries. This enables the customer to adjust the website to their business needs while maintaining a consistent design.
The website is hosted on Digital Ocean using Docker and uses GitHub Actions to enable easy and quick deployment.
3. Approach
I approach software development as follows:
shortend feedback loops
The value of code (and ideas) should be tested against reality as quickly as possible.
Examples of shortend feedback loops are: - minimal viable products (or features);
- early canary releases
- automated unit testing
- CI/CD pipelines
- code reviews
- monitoring and analytics
MVPs, canary releases, and CI/CD pipelines are all important parts of an iterative approach to programming. They ensure quick feedback from customers about new products/features, which in turn leads to rapid changes in the code.
minimizing cognitive load
Minimizing cognitive load is crucial in software development to avoid poor quality code, increase productivity and free up mental space for collaberation and problem solving.
Concrete examples of minimizing cognitive load would be:
- clean, structured and descriptive code
- automated unit testing
- CI/CD pipelines
- Domain Driven Design with a shared domain language
- shared notes about tasks and priorities (e.g. kanban)
- clear communication
automated testing
Unit testing is an important aspect of building high-quality and maintainable software. Any code which involves state manipulation should be unit tested to some extent in order to minimize potential code regression and bugs, as well as increase adaptability.
Making changes to existing code should be as seamless as possible. By using automated tests, we can ensure that changes to the codebase do not introduce new bugs or regressions, and that any issues are caught early in the development process, thus shortening the feedback loop.
There should be no fear in making changes to the code. A developer should be able to confidently make modifications, knowing that the unit tests catch any errors that may arise. This reduces the cognitive load of the development process as there are fewer things to worry about.
non-dogmatic
There is no one-size-fits-all solution to software development. The specific context, requirements and constraints of the business should always be kept in mind.
As such, pragmatism, and critical thinking should take priority above rigid adherence to rules, processes, or frameworks. Anti-pattern is an anti-pattern.
adaptive
Code should be flexible in order to anticipate change. This means less emphasis on writing perfect code that can immediately handle all possible future business requirements (i.e., generic code) and more focus on code that can be easily modified to meet those future needs.
Generic code cannot always anticipate unknown unknowns. Flexible code on the other hand is better suited to handle such uncertainties.
Such organic code is well-suited for an iterative approach to delivering value. Instead of aiming to ship a fully finished product in one go, a minimum viable product (MVP) is released, which is then iteratively improved.