I’m Eric Tummers, Software Architect at Statistics Netherlands, and this is how I work

My jobs description says Software Architect. I’m guiding my team through the technical hurdles and do some programming/testing/analysing myself. We follow the scrum guide and are working towards continuous integration and deployment. We do this in small steps. Every sprint we complete means the retrospective is done in the pub.

I expect the best and I give the best. Here’s the beer. Here’s the entertainment. Now have fun. That’s an order!
Rasczak

Location: Sittard, NL
Current Gig: Software Architect, CBS
Word that best describes how you work: remote
Current mobile device: iPhone SE 2nd gen
Current computer: MacBook Air M1

What apps/software/tools can’t you live without? Why?

Evernote: I’m a fan for years now.
Spotlight on Mac and Ueli on Windows: for quick start apps and other things.
Microsoft To Do: work tasks, chores, groceries, planning, every task is there.

What’s your workspace setup like?

My home workspace is a Macbook Air M1 connected to a Benq 24 inch monitor (BL2420PT). For input I use the logitech keyboard and mouse (MX800). There is a wireless charger for my iPhone SE or Airpods and a desk lamp (like the Pixar luxo Jr.) This is my main workspace.

When I go to the office I’m free to work from a coffee table with my MacBook Air M1 or hook it up to an external monitor. We’re a hybrid working organisation so the laptop moves with me in my rainbow backpack.

We communicate with each other via zoom and slack. So those apps are my virtual workspace. Does that count?

What’s your best time-saving shortcut/life hack?

Timebox. Start on a task and spent the time you’ve got to get the best result. Get someone to look at it, get feedback. Then decide if the result is final or to spent some more time.

Besides your phone and computer, what gadget can’t you live without and why?

I replaced my Garmin FR235 with the Garmin FR745. It has smart watch features, an optical heart rate monitor and music. I now go on a run without my phone.
My Apple Airpods 2. Easy to use, small and good sound. Replaced my old first gen with the second gen with wireless charging case – still the best wireless earbuds for me.

What everyday thing are you better at than everyone else? What’s your secret?

Learning new things. My current project lets me implement new things (joy) Also I try to learn the things I know to my team or anyone who listens.
I have a basic understanding of how things work and try to map new things on there. For the details I have a Pluralsight subscription and black belt google skills.

What do you listen to while you work?

My alarm clock plays classical music to wake me up in the morning. The car stereo plays about everything (grunge, rock, kids stories) driving to work. When I need some focus I play drum and bass on my headphones. My ringtone is still Run riot by Camo & Krooked, although it is muted since I got a Garmin.

What are you currently reading?

Nerds. A fun view of the things a nerd does, likes and hates. Good read to get me out of the working mindset.

How do you recharge? What do you do when you want to forget about work?

Spending quality time with my wife and daughters. Phone on silent, no screens, no work. 
Also sports like running, fitness, climbing and snowboarding to keep me fit and healthy.

Fill in the blank: I’d love to see _________ answer these same questions.

Eric Rosen a chess streamer I follow on YouTube. This is someone who does what he loves and loves what he does.

What’s the best advice you’ve ever received?

someecards.com - Make a shit first draft you cannot edit a blank page
I believe this is a variant on a Hemingway quote.

Is there anything else you’d like to add that might be interesting to readers?

Learn Powershell. There is so much possible with Powershell. If you can learn one thing this year pick Powershell.

Original idea from Lifehacker.com.

Posted in Uncategorized | Tagged , , , , , , , | Leave a comment

TEQnation 2023

Visiting TEQnation has brought me back in contact with people outside my organisation. Sometimes you need to look elsewhere to get forward in technology. I’ll try to write down what I learned today and hope to see you on the next technology event.

Of course Artificial Intelligence (AI) was on the agenda. Github copilot was the first to be mentioned. You’ll first need to understand the programming language before you can put copilot suggestions into productie so don’t let juniors use it – on the other hand you can train your juniors by using copilot. ChatGPT is a big step. In the future AI will be able to create complete software solutions for us. These solutions will be monoliths because they are easier to handle. No need to worry for your job, because DEVOPS is 10% tools, 10% product and 80% people.

In collaborative software design the people part was handled. Humans have emotions and are biased among others. You need to manage the humans. The idea started by helping an Architect and ended with writing a book (https://www.manning.com/books/collaborative-software-design)

Next was security. Our solutions are based on packages (Nuget, npm) for the big part. Most packages depend on other packages. We all remember log4j last December. It is important to keep an eye on your dependencies. After a feature is complete you still need to maintain it by updating the dependencies. For this you’ll need a security solution that is developer focused, executive supported, with clear guardrails, time for coaching and mentoring. And reward / recognise the teams that are applying it.

Openshift has a solution that provides desktop like developer experience where the tools are inside a container. Loads of demo’s. Based on an open standard https://devfile.io

Michael Cote had a talk about developer platforms. He worked at pivotal and moved to VMWare when it acquired pivotal. His slides show the way to create a developer platform (https://cote.io/platform/) Since it is meant for developers, make sure to treat the developer as a customer and have developers work on the platform.

The day started with the talk from Post NL. The only rule for software development was Infrastructure as code and hosting on a public cloud provider. There I heard about https://backstage.io to create a catalog of services. These services would proces the data with GraphQL. Slides are in markdown here https://github.com/patrickdronk/data-mesh-slides

Another concept heard during multiple talks was Shift Left. Test early and test often. We all do this, right 😮

For developers by developers

TEQnation is the software development conference designed for teamleads, architects and project management. But most of all it’s organized for developers by developers. The Developer Conference of Tomorrow: TEQnation 2023 brings the best of the best speakers, various exhibitors, live demonstrations and numerous networking opportunities.

https://teqnation.com/general-information/

Posted in Conference | Tagged , , , , , , | Leave a comment

Laptop ergonomics on the go

I’m working on a laptop for some time now. When I work in my home office I can hook up an external monitor and full size keyboard/mouse. When I work on the go like in the library or coffeeshop I use the nextstand and the Logitech K380/pebble.

The nextstand raises the laptop high enough so it is level with my eyes. It folds into a small stick that can easily fit into my bag. From all the stands I’ve used this one checks all the boxes. It looks fragile but seems to hold up without problems for about 3 months now.

Both the keyboard (K380) and mouse (pebble) are connected via bluetooth. They are battery powered and use little power. When the batteries are depleted I’ll put in rechargeables. The typing experience is awesome: feels just like the MacBook keyboard with enough travel and feedback. I would appreciate some extra buttons on the mouse though.

Small extra weight for good laptop ergonomics on the go.

Posted in Uncategorized | Tagged , , | Leave a comment

Syncfusion upgrade v14.1 to v20.3

We’re working on our technical debt and moved the Syncfusion upgrade into our sprint. Time to get this done since it was long overdue. Turned out this was easy with a little aftermath.

Since we only used the ejGrid in this part of the system we we’re done in just 4 steps:

1


Upgrade nugets

We updated all nugets to the latest versions. This was v20.3.0.56 for Syncfusion.Asp.Mvc5 and v3.6.1 for jQuery

2


Insert license in global.asax

As described on their page we needed to add our license string to the global.asax.cs file. If not added you’ll get a red banner.

3


Add js files to bundle

The old version javascript file were forgiving when omitting some. Now we needed to add jsrender.min.js and ej.tooltip.min.js.

4


Breaking changes

We noticed two breaking changes. One manifested build time: EditingType.Dropdown became DropdownEdit. The other was found during testing: toolbar icon customisation changed – we removed the icon and are using text now

The toolbar icons were a bit of a struggle. Right after the upgrade the icons were displayed twice and the text was not visible. To get things going we replaced the icon + text by text-only and moved on to demo this to our product owner.

Posted in Uncategorized | Leave a comment

What is R Shiny doing?

We’ve created an R Shiny app for viewing data. On the server we log the time needed to query the database. The users report longer waiting times than the query time we log. What is R Shiny doing?

Looking under the hood of R Shiny we discovered it uses websockets for communication. (https://unleash-shiny.rinterface.com/shiny-intro.html#debug-websocket-with-shiny) There is a way to see the messages send back-and-forth in the developer tools network tab. Red is download and green is upload.

We can see that a query that takes 0.1 seconds takes 1.2 seconds (previous green message until last red message) before the user sees the result. This is caused by the amount of data that is returned. The difference of 1 second is not something a user wil notice.

Imagine a query that takes 3 seconds and produces a lot of data. Then the user will wait for a lot longer and the query time is way off from what the user experiences. Also the rendering of the actual table will be slower since it has more data to process. We need to know the time it takes to show the data to the user.

The data is displayed with DT (https://rstudio.github.io/DT/) which has all sorts of events. The callback is most promising and fires some javascript after the data is presented to the user. So we wrote some code to send this event back to the server and log the time it needed for the data to be send and the callback was fired. The code looked something like this:

library(DT)
js <- c(
  "var start = DATE_FROM_SERVER_HERE;",
  "Shiny.onInputChange('render_done', start);"
)
ui <- fluidPage(
  DTOutput("table")
)
server <- function(input, output, session){
  observeEvent(input$render_done, { HANDLE_LOGGING_OF_TIME_NEEDED })
  output[["table"]] <- renderDT({
    datatable(
      iris,
      callback = JS(js)
    )
  })
}
shinyApp(ui, server)

We now have a better understanding of the user experience when it comes to response times. The query was fast enough, but the rendering took too long. Now we can start fixing this.

Posted in Development | Tagged , | Leave a comment

AutoMapper upgrade to v12

We use AutoMapper in almost all of our solutions. The recent new version forced us to finally refactor the way we used to resolve external dependencies. As you can read here (https://docs.automapper.org/en/latest/12.0-Upgrade-Guide.html) the ServiceCtor was removed.

Nugets

First we upgraded the AutoMapper nuget and added the dependency injection nuget as described here (https://docs.automapper.org/en/latest/Dependency-injection.html) Now we kan call this code in our startup and AutoMapper will be added with all dependencies available.

services.AddAutoMapper(typeof(AppProfile), typeof(AdaptersProfile));

Configuration to Profile

We used to create files to configure an MapperConfiguration and created the Mapper from there. The code looked something like this:

// this is ** NOT ** what we want
public class AutoMapperConfiguration : MapperConfiguration {
   public static Action<IMapperConfigurationExpression> Config {
      get {
         return config => config.CreateMap< .... >
            .ConvertUsing(source, destination, context => context.Options.ServiceCtor.Invoke(typeof(ILogger)).LogWarning("something"));
      }
   }
}

The new way of using dependency injection (already introduced in v5) is to use the provided interfaces and inject the dependency into the implementing class. These interfaces are described here (https://docs.automapper.org/en/latest/index.html#extensibility) The code below shows a simple mapping with some logging.

// this is mush cleaner
public class ProfileWithLogging : Profile {
   public ProfileWithLogging() {
      CreateMap<A, B>().ConvertUsing<LoggingTypeConverter>();
   }
}

public class LoggingTypeConverter : ITypeConverter<A, B> {
   private readonly ILogger _logger;
   public LoggingTypeConverter(Ilogger logger) { _logger = logger; }
   public B Convert(A source, B destination, ResolutionContext context) {
      _logger.LogInformation("Mapping A to B");
   }
}

Not sure what this does to speed or memory usage. The code looks a lot cleaner and we updated to the latest version – happy coder 🙂

disclaimer – source code may not compile and is for illustration purposes – use on your own risk

Posted in Development | Tagged , | Leave a comment