Robert's blog

Automating education

You might have heard that education is a good career, because it is hard to automate. That's not really true. While harder to automate than average, there are lots of opportunities to cut jobs across the education system. Recent developments in artificial intelligence mean that everything can be automated. It's just a matter of prioritizing what to automate first. The technology is already here. It's just that education, like every other government-funded service, is slow to adopt automation.

Patriarchy is a feminist conspiracy theory

Patriarchy in its original meaning is a sensible concept that has some place in history, but patriarchy as presented by feminists has nothing to do with actual history of mankind. In feminist context, patriarchy is a theory of world-wide conspiracy of men against women that spans millenia and cultures across the world.

The 5 levels of predatory organizations

Predatory organization seeks power over people instead of serving them. All predatory organizations are a threat, but not every predatory organization is equally dangerous. Size of the organization and intensity of predatory behavior matter of course, but I am more concerned with qualitative differences that determine ultimate threat the organization poses.

Predatory organizations

I have a peculiar way to classify organizations into those that serve people and those that seek power over people. I call the latter predatory organizations. Here I want to clarify the concept and explain how it is informative.

Template engine is a broken concept

Web apps of course have to somehow produce HTML from the underlying data. In this sense, template engines are immortal. There are however many ways to express this transformation of data into HTML and not all of them work so well.

Advice to Russian developers

If you are a Russian developer or other IT worker, this article is for you. You are probably weighing your options in the aftermath of Russian invasion in Ukraine. Of all the options you have, the worst one is to just sit there and do nothing. Let me show you my angle and persuade you to take action to help yourself and others.

Trillion dollar theft of public domain works

The so called "social media" empires have been built mostly by appropriating what should have been public domain works.

Computers are like children

Ever noticed how some people at the grocery store prefer self-service checkout even when staffed checkout is available? I am one of them. And I do the same in other contexts. I prefer machines over humans if I am given the choice.

Why DIY is almost always better

I am usually talking about programming, but today I am going to write about something as mundane as home repair & maintenance. I am writing this, because everyone on the Internet seems to shun DIY (do-it-yourself) while in my experience DIY is clearly superior.

The immortal tech-savvy authoritarian state

Democratic revolutions might well be a history by now. Technology lets authoritarian states detect and suppress dissent before it gains any traction. Automated secret service monitors every word and every real-world action of every citizen. Prototype devices detect lies during interrogation and even monitor thoughts.

Privacy-oriented software and services

Privacy exists on a spectrum. The list below will not ensure your privacy if a government or mafia is after you, but the recommendations below are cheap to implement and considerably reduce the amount of information leaked by default. As long as you don't become a high-value target, you will be reasonably safe.

Scripting as a programming paradigm

Scripting is not a language feature. It's a programming style that may have some language support. Scripting is the opposite of software engineering. Script is designed for a single task, often a single run. It is used by its own developer and frequently relies on his manual intervention.

Why is the world crazy?

This is not your typical curiosity list. This stuff is deeply disturbing. I put it up here as a stark reminder. I don't want to offend you, but I probably will. You have been warned. I don't want to scare you. I am just documenting reality. If you would rather learn what's new in the royal family, go read one of the billion or so infotainment blogs instead.

Productivity tips for software developers

Remember the saying about the chain being only as strong as its weakest link? When it comes to software projects, you can make the right choices most of the time, but the one thing you do wrong will still cost you an order of magnitude loss of efficiency. And people usually err more than once...

My development stack

Too much code to write and too little time to spare? I was facing the same problem in my work and hobby projects. Here I list tools and some practices I use to minimize development costs and maximize value of my work.

What's in a good software library?

High-level advice on API design from author of several opensource libraries and a seasoned developer.


Attempts to stop adblockers are futile. People who attempt to do that don't realize they are facing determined enemy.

Who needs partition tolerance anyway?

So much effort is poured into partition tolerance in databases, it is worth stopping and thinking about alternatives.

How to kill high-frequency trading

High-frequency trading is not necessary. It's not even useful. There are ways to stop this waste of resources. Here's an example solution.

How to setup high availability configuration

High availability means that the service never goes down. But what should the application guard against? What threats is the application facing? Is high availability even possible?

ColoredImage in JungleControls

Easily generate colored variations from grayscale mask using ColoredImage XAML control from JungleControls WPF library.

Anchor WPF Popup exactly where you need it with PrecisePopup

PrecisePopup is a smart popup for WPF that can open in multiple relative positions depending on how much space there is around it on the screen.

Server-side RIA framework

RIA doesn't need to be client-side. Server-side, if properly implemented, actually offers huge advantages to developers and end users alike.

DataPipe: Pushing read-only dependency properties to view model

Expose read-only WPF properties, especially ActualWidth and ActualHeight, to view model via DataPipe attached property.

Collection properties for Assisticant.Facades

New version of Assisticant.Facades lets you parameterize your WPF controls with collection dependency properties with the same ease as with scalars.

No more DependencyProperty with AutoDependencyProperty.Fody

Fody plugin that eliminates those verbose dependency property declarations in WPF controls and replaces them with single attribute.

Easy WPF control authoring with Assisticant.Facades

Gone are the days of painstakingly defining controls with dependency properties and event handlers. You can now use Assisticant in custom controls.

Expose WPF control to view model III

Gain access to WPF controls from view models where needed. While admittedly an ugly practice, it is sometimes easier that fixing the offending controls.

LazyControl in JungleControls

LazyControl lets you load WPF content on demand. It is an alternative to virtualizing panels for complex layouts.

DelayedContentControl in JungleControls

DelayedContentControl loads its Content lazily when required for rendering. It's more efficient and less noisy than standard ContentControl.

Expose WPF controls to view models II

Access controls from within view model by adding a bit of code into window constructor. It's ugly, but it's sometimes necessary.

SelectableTextBlock in JungleControls

WPF TextBlock doesn't support selection, which is needed in some applications. SelectableTextBlock control offers a workaround.

StatCounter in JungleControls

Nice, visually compact numeric stats control for WPF with support for labels and units. It can be used to build dashboards.

PropertySheet in JungleControls

PropertySheet WPF control implements traditional Windows property sheet with labels on the left and content on the right.

JungleControls: Free WPF controls for your app

Assorted WPF controls including property sheet, selectable text block, stat counter, intelligent popup, color filter, and technical controls.

Dynamic vs. static languages

Why everyone gets it wrong when arguing for dynamic or static languages. It's all about the tools, but it's not that straightforward.

Expose WPF controls to view model via attached property

Access WPF controls from view models by adding concise attached property to XAML. It's a bit hacky, but it does the job where necessary.

Userbase never grows quickly

Avoid optimizing for heavy loads. Actual service usage grows so glacially slowly, you will have plenty of time for optimizations later.

Business vs. engineering excellence

It's more accurate to speak about business through engineering excellence since the two go hand in hand. False 'tradeoffs' are a mistake.

Printable Montessori color cards

Downloadable Montessori color cards in PDF and SVG format. Print them and cut them to get budget alternative to the wooden Montessori original.

Pinpointing application security issues

So much productivity in software development comes from tools that allow pinpointing issues in the code. There's no need to hold whole codebase to high standards when the tools can quickly locate the few places in need of developer's attention. Why couldn't it be that simple with security?

What's wrong with The Lean Startup?

Startups as an optimization problem is a nice abstraction, but there are better ways to optimize than continuous fine-tuning through thousands of micro-optimizations.

Why are software libraries so bloody expensive?

Commercial libraries aren't necessarily (or even usually) better than their opensource equivalents. The difference is in support and in customer nature.

The surprising architecture of future applications

If you think the future is in JavaScript, you are mistaken. 'Downloading the universe' to the client is an old problem from the 90s that has a very simple solution.

Creating perfect toddler games on Android

As a dad, I am a bit frustrated with the offering of toddler games on Android. The ideas behind the games are usually nice, but the games cannot survive 5 minutes of testing by children. You can use this checklist to audit usability of your Android game.

Why buying better hardware doesn't help anymore

If you are in the market for new hardware or software, it's efficiency you are looking for, not features or glamour.

How (not) to win CodeChef Long Challenge

Valuable advice from veteran competitor who almost won the 1st place. Every game has rules and there's always a way to win a game with rules.

Smartphones: 90s déjà vu‎?

There's a reason why the world dumped desktop apps in favor of the web in the 90s. It looks like smartphone app developers are repeating an old mistake.

How to write custom NLog time source

A short guide through building custom NLog time sources. We will build a time source with configurable time zone as an example.

How to configure NLog time source

A quick tutorial for the new NLog time sources, including XML and C# configuration. Overview of all four built-in time sources.

NLog timestamps with millisecond accuracy

What was wrong with the old NLog timestamps? Why was the new time source API needed? Because timestamps are important and not everyone was happy with them.

Open plan office scares away creativity, kills productivity

Damage to productivity by open plan office is a well established fact. My point is that open plan office has profound impact on creativity as well. And it's not caused by the noise.

Building awesome opensource projects

This is the story behind SourceAFIS in case you were wondering why would anyone build opensource fingerprint matcher. I happened to do many things right back then, so perhaps there is something to learn from the story.