Might be available
(Updated 2021-12-02)Systemutvecklare
Stockholm, Sweden
Native Svenska, English, Beginner German
- Linux DevOps Engineer
- Senior Test Automation Engineer
- Polyglot Fullstack Developer with over 20+ years of experience
Skills (70)
JSON
Node
BankID
JavaScript
HTML
Linux
SCRIPTING
PHP
DOCUMENTATION
ENCRYPTION
ACCOUNTING
Selenium
C#
CSS
Docker Compose
SYSTEM DEVELOPMENT
API
Docker
Btrfs
DevOps
Python
Nginx
Bash
Jenkins
AUTOMATED TESTING
ZFS
REACTJS
TeamCity
Perl
MongoDB
Flask
.NET
MariaDB
Bootstrap
JUnit
REDUX
SILVERLIGHT
Git
WINFORMS
CLIENT/SERVER
FINANCE
Visual Basic
DELPHI
JQuery
webpack
VUE.JS
MySQL
RASPBERRY PI
Apache
Subversion
Ranorex Studio
Java
Django
SQL
PostgreSQL
Gunicorn
ORM
Lua
LISP
C/C++
GOOGLE APP ENGINE
MATLAB
Amazon Web Services
OPENCV
C++
Elastic Search
Azure
TypeScript
TKINTER
VHDL
Summary
Fredrik is a multifaceted, creative and goal-oriented engineer with a broad experience in software,
web and system development and system administration in Linux-, Mac- and Windows environments.
He is driven by challenges and feel great responsibility to deliver stable high quality solutions on time.
Fredrik easily absorb new technologies and work methods, and eagerly shares this knowledge with his
fellow co-workers. He takes great pride in writing code that is easy-to-understand and highly maintainable. While he feels very confident working by himself, he prefers assignments where he is part of a team, working together solving the challenges given.
Professional Experience
2020-01 - Present
Senior Developer in a team of eight, with responsibility to maintain Spotify's royalty calculation and configuration platform. The platform's purpose is to calculate the royalty Spotify needs to pay publishers and licensors for using their music.
Throughout the project my responsibilities have included:
- Implement simple to very complex royalty contracts in the platform in Python 3 and SQL, based on requirements often given as complex Excel sheets
- Maintain the royalty system's Django 1.x backend
- Upgrade Django from 1.x to 2.2
- Maintain and/or create documentation for contract rules
- Maintain and/or upgrade the dev, uat and production Ubuntu Linux environments using Puppet, hosted in Google Cloud Platform
- Upgraded the PostgreSQL database from 11 to 12
- Investigated various strategies, and implemented some, to get the very large database (>20 TB) smaller
- Created various Bash scripts for system maintenance and/or contract updates
2019-01 - Present
I'm creating an Instagram crawler and search engine using Python, NodeJS, MongoDB, Redis, Docker Compose, ZFS and XFS. The general idea is to crawl all profiles of commercial interest (usually > 1000 followers), organize them based on various metrics, and allow customers to search through the data set to find new business partners (influencers). It's been a very interesting project as I've had to find ways to crawl vast data sets without getting blocked by Instagram, organize the data in smart ways to not waste more storage space than necessary considering the huge amount of posts and profiles I store, on a regular non-cloud server. The crawler is written in Python, the API in NodeJS, MongoDB as database, and Redis is used as a message broker.
2019-06 - Present
I maintain and develop Lekeplasskontrollen.no's playground inspection software. It consists of an Ubuntu Server, EmberJS, Django/Python and MySQL stack. My responsibilities consist of keeping the servers and frameworks up to date, automate things like backups, fix bugs and implement new features.
2019-10 - 2020-05
I'm leading the team that develop the Casablnca Influencer CRM system which is built using a Google Cloud and Firebase stack. The frontend uses ReactJS, the backend is built on Spring Boot and the database used is PostgreSQL. My responsibilities include making decisions about the architecture, security and support the Java backend developer.
2018-01 - 2019-02
Shortly after the assignment started, Zmarta bought Elskling, Sweden and Norway's biggest electricity price comparison company. After buying Elskling, Zmarta wanted to create their own version of it, fit it into their Vue frontend, and put me in charge of making that happen in three to four weeks. Elskling's technology consisted of a LAMP stack with very messy PHP MVC code running on top of it. The code lacked any kind of API. Because I had to deliver a Zmarta branded solution in a very short time, I decided to clone Elskling's code, heavily change the HTML and CSS structure, and then inject it as a resizable iframe within Zmarta's Vue stack. This way, the electricity product became indistinguishable from their brand, and could be released on time. Later, when an API was available, we of course rewrote it in Vue.js and removed the iframe-hack.
After the launch of the Swedish electricity comparison service, I was assigned to create a similar service for Norway. This time I was primarily responsible to create a GraphQL microservice using NodeJS, and integrate it against Elskling's new API, but I also took part of the Vue.js and SCSS frontend development.
In the middle of the Norwegian electricity project, Zmarta bought Insplanet, and assigned me to create Zmarta branded car, home and mc insurance products, integrated against Insplanet's API. Apart from creating the backend and frontend for the products, this project also consisted of helping Zmarta create multiple microservices to fit into their new architecture, and move away from legacy PHP as much as possible. Like microservices to keep track of customer information, to send sms or e-mails, lookup a customer's residential address given his or her social security number etc. Also, I've been responsible in coaching and teaching junior developer's at Zmarta's new developer hub in Jönköping, to bring them up to speed with the code standards, technology and architecture they'll be working with and responsible of maintaining, after my assignment ends in the end of April.
The technology I used at Zmarta for frontend consisted of Eslint, Webpack, Grunt, SCSS, SVG, Vue.js and JavaScript/ES6. For backend development I used Gitlab CI and Docker for continuous integration, NodeJS and Apache Apollo for the actual backend, SequalizeJS as database ORM (for SQLite, MySQL and Maria DB in AWS), test automation using Supertest and Chai.
2019-02 - 2019-09
I've been responsible for enabling the Online team to move away from their in-house infrastructure (Jenkins for CI, Nginx for webserver, Bitbucket for VCS, various microservices), to instead move into the Azure cloud. The Online team acted as a proof-of-concept for this in the Hi3G organization, and other teams are expected to follow the move to the cloud later. My responsibilities included to support the Hi3G architect in making sure jobs can still be built on the legacy Jenkins CI server, while moving over towards CircleCI and Github, and move the team's solutions over there, enabling the building of the team's frontend stack (React, Webpack, Razzle), hosting the project using Docker and Kubernetes in Azure, setting up storage buckets and automate the upload of static files and setting up Azure Insights for all microservices and the frontend. I also, when time allowed, helped the frontend developers with React frontend tasks.
2017-01 - 2018-01
The assignment consisted of
- improving a Selenium and Protractor test suite written in C#, to be run on very specific versions of Firefox, deployed using TeamCity, to test the Sirius Group's reinsurance pricing tool called GPI.
- to improve upon an Excel accounting test suite written in C# using Ranorex Studio
The work was primarily been focused on rewriting and improving the Selenium test suite, to make sure it was long term maintainable, and to sort out all flakiness that existed when I took over the project.
To a smaller extent, I was also responsible for helping another team maintain their Excel accounting test suite. The suite was written in a mix of C#, Excel with Visual Basic macros and used Ranorex to navigate Excel. I've rewritten parts of the suite, primarily to get rid of the Ranorex dependency, because it wasn't reliable. At the end of the assignment, the suite could run headless, if the customer wanted to, which previously was impossible.
To improve the debugging of failed tests, I also created a video recording addon, for use with both the Selenium and Excel suites, based on FFmpeg. I managed to tweak the compression to give a near lossless replay of events at 0,25-0,5 mb/minute without consuming excessive CPU resources.
2016-01 - 2017-01
- develop a new, low maintenance and easily deployable test automation framework based on
technologies my customer have chosen, to replace their current system, and to set up this to run in a
mixed environment consisting of Jenkins, TeamCity and Octopus.
- coach their web teams (front-end developers) and testers into getting started with test automation using
the new framework
With Selenium, Webdriver I/O (JavaScript and TypeScript), Gulp, NodeJS and JSDoc, I created an
easy-to-use test automation stack that was deployable within minutes, on any desktop or server, and ran
tests against all major browsers on both desktop and mobile. The solution required that NodeJS and the
browsers one wanted to test against were installed. The framework took care of everything else and automatically installed and configured any other dependencies. Additionally, documentation was easily
generated from the many JSDoc comments in the source code.
Parallel to the development of this framework, I led the education and coaching of the web teams,
starting writing tests using parts of this new framework. By the end of the assignment, every team was
self-sustainable in maintaining and writing tests.
2016-01 - 2016-01
Invented a small robot using a Raspberry Pi and a Micro SG90 servo, to enable remote triggering of the motion sensor responsible for opening Brf Stadsträdgården's garage door. Basically, making it possible
for a mobile device, such as a phone, to remotely trigger the opening of the garage door. Previously, the only way to open the door was by pressing an electronic tag against the lock, forcing the driver out of his
vehicle.
The Raspberry Pi runs a small NodeJS SocketIO client. This robot client is always connected to Brf
Stadsträdgårdens publicly accessible NodeJS SocketIO server. A web page, hosted on the same web
server, exposes a UI acting as a mobile client, which the residents use to open the garage door. When a
resident successfully authorize herself with her mobile phone, the web server tells the robot to activate its
servo, triggering an opening of the garage door.
2015-01 - 2016-01
I was responsible for two areas:
- development of software and tests for continuous automated testing of set-top-boxes (STB)
- development of an automated network probe, allowing technicians to automatically verify or
troubleshoot network, television or VoIP installations.
I invented a low-cost robot based on consumer hardware such as a Raspberry Pi and a USB video grabber.
Together with software I wrote in Python using the powerful image recognition framework OpenCV, it allowed easy and cost-efficient automated testing of set-top-boxes. The robot's features was comparable to those found in relatively expensive robots like Witbe or Stormtest, but to a price tag and form factor comparable to a Raspberry Pi Starter Kit. As a bonus, the robot could be used as a Slingbox.
The robot was designed to be deployed anywhere. Like at a certain company site or in a customer's home, all remote controlled from a central Jenkins automation server, through a HTTP API.
I also continued supporting some older automation systems I had previously written with tools and libraries such as Flask, OpenCV, TypeDecorator, Selenium, Gunicorn, PyUnit, Robot Framework and Jenkins.
I also developed a network probe, to help our network engineers and technicians, to evaluate the quality of new city wide network installations. Some of it's features included testing the download and upload speed of a network in various ways, test and analyze IPTV packets and channels and make and receive SIP/VoIP phone calls. The first generation of the probe was written in Python and run as a command line application. The second generation was an easy-to-use web application, with the user interface written in React/JSX and the backend written in Python using the Flask library, and deployed using Gunicorn.
2011-01 - 2014-01
My first time at Com Hem consisted of maintaining a Motorola 1920/1903/1963 set-top-box (STB) portal based on Espial Evo. After some months of fixing bugs in their JavaScript UI code and extending their backend system written in Java and Spring, I realized that we kept reintroducing bugs we recently fixed.
To combat this, I rewrote our entire build system from lots of Bash scripts to an unified Python solution. I then convinced the management to allow me to create a robot that could run tests against our STBs and analyze their logs for suspicious (buggy) behaviour. This robot was written in Python. I set it up to run tests continuously using the build system Jenkins, but later changed replaced it with TeamCity.
Before creating this robot, Com Hem had found 1000 bugs during the first 5 years. One year later, the robot had helped us identify 1000 more. It allowed us to perform various stress tests previously impossible or extremely tedious for a human to do.
When Com Hem later moved away from Espial Evo and Motorola in favor of TiVo STBs, I had to rethink my automated testing because TiVo didn't supply us with real time log output. I turned my eye to the
Sikuli framework to create a robot that could perform visual testing with the help of a video grabber and an IR-blaster. It worked quite well for some time and fulfilled our needs, until I had more time to rewrite the robot once again to use the OpenCV framework instead. The robot I later created using that framework is described more thoroughly under the heading "QA Engineer and Developer, Com Hem".
Apart from automating the testing of set-top-boxes, I've created various web automation tests using Selenium, and also created some test automation for the Com Hem TiVo Android app using Android UiAutomation.
2013-01 - 2014-01
Mäklarstatistik had invested lots of time and money in a system, built in Python using Google App Engine, that even under limited load was slow and very expensive to run. They had lost confidence in the developer originally responsible for creating this system, and wanted someone else to take a look and hopefully find means of making it faster and easier to maintain. My review found - and later confirmed by another firm specializing in Google App Engine - that the system had been too poorly designed that it had to be completely redesigned and rewritten.
2010-01 - 2011-01
Was part of the Dreampark core group doing development and maintenance of the Dreamgallery STB Portal. Most of the work consisted of improving the stability and clean up badly written code. Lots of JavaScript coding, some SVG, some Java and Spring development.
2011-01 - 2011-11
The assignment was to develop a new GUI framework with a "web 2.0 feeling" for the customer, a company developing broadcasting technology. The framework served as the base for the development of new unified administration of all A2Bs hardware platforms. The technical difficulty was extensive because the customer supplied no requirements or functional specifications of their current solution.
In order to create such documents, I began exploring A2Bs existing systems and standards.
The UI was created using Java and Google Web Toolkit, and a big test framework based on JUnit was created to quickly identify errors and ensure quality. The company's original backend consisted of C functions that generated XML. These were replaced with easily edited Lua files to facilitate XML and JSON generation, and eliminate the need of having to recompile the code for every minor change.
2009-01 - 2010-01
I developed a HTML and JavaScript application mimicking many of the features found in Powerpoint, to allow anyone to create a multimedia presentation using only their web browser. It required no plugins, and was completely based on established standards available at the time, such as JavaScript, HTML, SVG and CSS.
After having created the web application, I was offered a thesis position at Opera. In my thesis work, I
explored the performance difference between JavaScript and compiled C/C++ code. As part of this, I
created possibly the world's first GIF image decoder completely written in JavaScript.
The thesis can be downloaded here:
https://doriantull.us/fredrik/thesis.pdf
2009-01 - 2009-01
I created zombies using C# and TCP/IP, to infect and take control of computers, for use in an
electronic warfare simulation.
2009-01 - 2009-01
Created a Google Maps-like server-client system with Python, running on Maemo 5 on a Nokia N900, for a university course. The source code served as a basis for students to create more complex systems around thought up disaster-like scenarios where one party would act the military, another the emergency health care system etc. Technologies involved was the Maemo Python libraries, the asynchronous Twisted networking library and TCP/IP.
2000-01 - 2005-01
Created my own Linux distribution inspired by the Linux From Scratch project. I then used the knowledge I had acquired from that to set up a file sharing network. It was made up by six heavily encrypted storage servers located at various parts of Sweden. They communicated with the outside world using encrypted FTP, and between them using an OpenVPN network. This allowed me to easily and securely do administration, perform updates etc. Lots of Python and Bash scripting was used to make this possible.
Academic Background
2005-01 - 2010-01
2002-01 - 2005-01