Johan Andersson
senior dotnet dev, web tech and infrastructure

"We act as though comfort and luxury were the chief requirements of life, when all that we need to make us happy is something to be enthusiastic about." - Einstein

About


Lime Technologies 2017-

2020-2021

  • Shifted focus to take on more work in the Lime CRM platform based on Python, Flask, Celery, Stencil Web Components, Typescript, GitHub Actions
  • Contributor of the Lime design system and UI component library, Lime Elements
  • Worked on the Lime CRM Work Order add-on, focusing on bringing Field Service Management features to Lime CRM
  • Took lead on building the Work Order Resource planner using web components based on FullCalendar.io
  • Took lead on building Office document editing features for Lime CRM using Microsoft Graph and Sharepoint file storage
  • Got the opportunity to work in the Lime trainee programme, as a trainer for various sessions in the areas of CI/CD, AWS and web components

2017-2020

  • Took lead on building the dual webhook based integration of Lime Field (formerly RemoteX) and Lime CRM
  • Terraforming Lime Field on AWS using EC2, ECS/Fargate
  • Rewriting of the Lime Field mobile client offline storage from AppCache to Service Worker using Google Workbox,
    and localforage to migrate from the deprecated WebSQL to IndexedDB
  • My team took over maintenance responsibilities of the Lime Engage product, which is a Ruby on Rails/React app
    running on Heroku with native mobile apps for both iOS and Android

RemoteX 2006-2017

2016

  • A new clock-in/out application was to be built for the construction industry as required by (a new) swedish law. The team saw this as a perfect opportunity to experiement with the new ASP.Net vNext (now ASP.Net/dotnet core).
    As a Mac/macOS user since 2011 I was looking forward to be able to code .net/c# without having to start Windows using Parallels Desktop. The final product used ASP.Net vNext Web API, Entity Framework, SQL Server and our default web frontend stack using Brunch.io, Bootstrap, Knockout.js, Sammy.js and KarmaJS for unit testing. Web tests were conducted using Selenium WebDriver were also written in c# and xUnit.
  • Additionally I took the ACR122U NFC reader for a test drive by implementing a web proxy using libnfc through NodeJS to build a "clock in/out kiosk".
  • OpenCover was added to our build pipeline to measure and display test coverage also for our .Net projects.
  • I introduced common application logging and metrics using NLog, NXLog, Logstash and Kibana.
  • Further on, I worked on several refactorings of the API product to enable cloud support and containerization.
  • Using Azure and Docker, I built a testing environment for a new reverse proxy based on Nginx that was replacing the old solution using IIS+ARR

2014-2015

  • Shopify Dashing was added and I created some scripts to bootstrap a set of Raspberry PI computers to work as operations monitors covering everything from build status of Jenkins CI jobs to near real time metrics sourced from Elasticsearch, Logstash and NewRelic.
  • As a part of the delivery pipeline we added web tests using Selenium WebDriver that helped us to improve the overall end-user quality of the product. Together with tools like JSHint we could now automatically know when our builds failed due to a change in our Javascripts or CSS, thanks to integrating the tools to the continuous delivery pipeline.
  • We started using Jekyll and Azure Blob Storage for our product manuals, thus got me involved in using the Windows Azure storage plugin for Jenkins.
  • I updated our server bootstrapping scripts so they could deploy to virtual machines on Azure which enabled us as a team to start using Windows Azure as a development and testing environment.
  • I implemented a internal packaging format used to formalize and automate the deployments of all system integrations in an environment where current tools like MSDeploy did not fit in and no usable alternative was present. This was used in large project with the goal to move away from all own hardware hosted by RemoteX and enabled all system integrations to be deployed by a build pipeline instead of using xcopy deployments.
  • By carefully planning the migration along with the deprecation of all own managed co-location services, I was able to cut the monthly cost of operations by a significant amount. Thus, this was one of the bigger steps of my continuous effort in optimizing the cost of operations for RemoteX.

2013

As a team we shifted focus towards more applications that used our frontend-stack using Bootstrap, Knockout.js, Sammy.js to build single-page applications. Brunch.io was added to the toolchain to leverage templating/scaffolding which enabled us as a team to maintain a shared code style and to do test-driven development in Javascript. A colleague introduced an open-source service health checking tool to the team from which I learned about Google AppEngine and Python. It was used to monitor many of the scheduled jobs used by the integrations hosted by RemoteX. I introduced a central logging infrastructure using Elasticsearch, Logstash, Kibana and Graphite as a support and troubleshooting tools with easy access to system and web logs. As a part of web operations and product development we conduct load and performance tests on regular basis using tools like NewRelic, SQL Profiler and ApacheBench.

2012-2013

I co-managed and implemented several system integration projects at two of the larger customers. Most work involved API specifications and endpoints on behalf of RemoteX to integrate with legacy systems/environments using flat files and Biztalk. The web tech of the year was building single-page applications using Bootstrap 2 and Knockout.js which was used to build a frontend for a new module targeting use-cases in the accounting domain. I took part in migrating the click-once deployed client, targeting Windows computers, towards a new code base that were rewritten from scratch using Windows Presentation Foundation (WPF) and Telerik RadControls for WPF. It purpose was to replace the old client application that had been a hybrid using both Windows Forms and WPF since 2008.

2012

In the beginning of 2012, I was responsible of setting up RemoteX managed hosting services at a new provider. This time we moved the product SaaS environment from virtual machines running IIS and SQL Server to virtual machines and a high availability SQL cluster. Once again I was scripting the generation of BIND zone files, a part of the solution that managed us to move several hundreds of tenants in a fully automated process from one managed hosting partner to another. As a part of this process I used Powershell and WinRM to automate the bootstrapping of all our servers. The bootstrapping process took care of all pre-requisites required by the product such as installing IIS, .Net Framework and configuration of the reverse proxy (Application Request Routing). This grunt work made us capable of doing enterprise on-premise deployments with the same level of automation as we were capable of at our own managed hosting provider. At the end of the year this was capability was tested with a successful deployment at one of the larger customers which managed its own IT department and hosting facilities.

2009-2011

The product grew and in 2009 I was responsible for adding automated builds and tests for one of our larger integrations to Visma SPCS Administration. The new iPhone became present also in our customers hands and our focus began to shift towards Android and iOS in 2010. The development environment using TFS was getting old and the team was more than happy when it in 2011 was replaced by hosted services like GitHub, Pivotal Tracker and a continuous-delivery pipeline using Jenkins CI. On the hosting side of this story, we moved the product from our own hardware in a co-location to managed hosting. At this point we had quite many tenants using the product, now also offered as a enterprise on-premise installation. This led us to automate many tedious steps of the setup of the system. The previously manual steps described in a 50+ pages document were replaced by an automated pipeline where new environments were up and running in 5 minutes. The team expanded its use of Jenkins CI and used it together with Powershell scripting and WinRM.

2008

I was getting back in the server room in 2008 to make sure the hosting environment for the product held together and was responsible of moving a co-location site used by the company. Alot of work was planning, designing and scripting VMWare Infrastructure, but also involved installation of datacenter equipment, site VPN-links etc. at the co-location partner.

2007-2008

2007 came around and my initial assignment at RemoteX changed to re-build the product from scratch as a SaaS offering. The team delivered a whole new product with .Net, now on v3.5, with APIs using REST that shared code with clients on Windows Mobile 6 and Windows 7. The product used ClickOnce deployment for its "occasionally connected client" and all applications was developed using concepts and methodologies such as Dependency Injection containers and Test Driven Development. (things that were quite rare in .Net-land at the time)

2005-2006

It was late 2005 and I was given an opportunity to build the next generation web apis for a small ISV working on workforce management solutions using PocketPC and eVB. Said and done, I quit the consultant firm and was contracted by RemoteX Technologies to start working on RESTful APIs using Microsoft Avalon (now WCF) in 2006. Having worked with CVS and Visual SourceSafe before, the focus was now automating builds using Microsoft TFS.

Qbranch 2000-2005

2004-2005

I was entitled Microsoft Certified Solutions Developer in 2004 and was working with one of the larger swedish banks. Together with a fellow collegue from Qbranch I developed a web frontend system for a distributed deployment system for the Windows XP operating system using PowerQuest tools to build and apply images, driver packages and perform BIOS upgrades remotely in an environment with 20 000+ clients.

2001-2003

The year was 2001 and I was thought that "Change is the only constant" and my LAMP-stack was more and more often VB6 and ASP. Web tech of the year became Microsoft.Net in a large project that I was participating in and extended my expertise from web tech to COM+, Windows Services and messaging solutions leveraging MSMQ.

1999-2000

I was just about to enter my twenties in spring of 2000 when I joined Qbranch (nowadays called Axians) where I was privileged to continue my endeavor in web tech, mostly using FreeBSD/Apache/MySQL/PHP, as a consultant. (Srsly, I was basically living in my GNU Screen, which I still use even in 2016)

EuroSeek 1997-2000

1997-1998

The web agency was split up in two parts and FreeSide became EuroSeek. During 1997 the web tech choice-of-the-year became Windows NT, SQL server and PHP3. This was later on replaced with Sun Solaris, PHP and Oracle when dot-com and VC money was a fact. In 1998 I was experimenting with web hosting automation and created tools for generation of bind zone files, apache configurations and e-mail accounts as a side-business in addition to working on the web portals at EuroSeek.

School years

1994-1996

I continued hacking web pages, for fun, and profit during several internships at FreeSide, and learned all shortcuts worth to know in Adobe Photoshop and ramped up my programming skills using a brand new technology called ColdFusion from Allaire (now Adobe). The year was 1996 and suddenly I was 'full-stack dev', creating database driven web sites with MS Access and cranking out CSS and HTML.

1987-1993

At the age of 7, in the late eighties, my interest of technology and electronics came along when my father bought a state-of-the-art 286 PC. This was the start of my fascination of creating and modifying computer software. I few years later in 1992, 12 years old, I hosted my own RemoteAccess BBS and one year later I started hacking HTML with Netscape Navigator 2 during an intenship at FreeSide Web Development agency in Stockholm, Sweden.