We Must Become System-System Thinkers

picassoEveryone building software must become a system-system thinker. A system-system thinker is someone who understands that the system they are building is part of a larger whole of other systems. The software we build is part of a more significant system that extends beyond the computer screen and network packets. Despite what many say, software does have a physical manifestation in the forms of the computers it runs on and the people who make and use it. The internet and the world-wide-web are mappable and have a physical form. All Software runs on hardware and hardware exists in the real world maintained by people.

The most critical computer system in the world is undoubtedly the internet. It’s the only computer system that has grown to the scale of trillions of components. All the atoms of the internet have been replaced, and it has never been shut down. This is no small accomplishment and is a result of the great design of TCP/IP and the protocol stack.

The reason the internet was able to scale so successfully was that its design is excellent. It scales because it was designed like another system that has a vast scale called the ecosystem.

The term “Ecosystem” is an interesting concept in itself because it was inspired by the electrical view of the brain proposed by Sigmund Freud. One night, the ecologist who promoted the concept of an ecosystem called Arthur Tansely, had a dream where he shot his wife. This dream disturbed him so much he read the works of Freud. He read how the brain is an electrical system of flowing energy, and he thought that nature must work the same way. Instead of electricity, nature has flows of minerals and energy. In other words, our view of nature is inspired by the technological developments at the time. Our view of nature is also that of a stable system that can adjust to shocks. As we shall see, it appears this view is wrong.

We have a much bigger systemic problem that will likely impact the computer and software industry in the coming years. We can ignore it in the community, but I want to make it clear, if nothing is done, there won’t be a computer industry or software profession. High technology needs organized human life to develop and function, and it won’t be possible with systemic failure.

That biggest threat to technological systemic failure is global warming. Why is global warming the biggest threat to the computer and software industry? We must first put on our system-system thinking caps on. Now that our caps are on let’s look at the extent of the problem.

The warming is accelerating and the new report by the IPCC on 1.5 degrees explains that we have a short window of 11 years until 2030 to dramatically reduce emissions. I sense that this is a conservative estimate and likely most scientists privately believe we will blow past 1.5 degrees. Global warming is having the most significant impact on the ecosystem.

For those that want to understand if there is already a systemic failure underway in our ecosystem, they should read the reports about the mass extinction happening now. A recent article by the Guardian described the collapse of insects in the Puerto Rican rainforest stating that 98% of insects on the ground had vanished. This is a total collapse of the ecosystem since a collapse of insects means a collapse of any animals relying on them. The scientists have attributed this insect collapse to global warming because the number of extremely hot days has dramatically increased in the rain forest going from almost zero to 40% of the days. The 2018 edition of the Living Planet Report found that 60% of all animals have disappeared since 1970. In other words, in less than 50 years, we have lost most of the wild animals of the world. To understand the extent of how few animals are left, a study published in Proceedings of the National Academy of Sciences found that humans make up 36% of all mammals on the planet. Domesticated mammals make up around 60%. That means only 4% of all mammals are wild.

While the internet has proven to be a robust system, it isn’t disconnected from the larger world. If the total collapse of our ecosystem causes mass social upheaval, the internet will stop functioning. It relies on points of centralization (large organizations) and large scale investment to keep functioning.

We have a choice as technologists to either design systems that could be robust against social collapse or build systems to maintain organized human life. In the past, I worked on the problem by designing robust networking systems. I built Fire★, a P2P computing system, back in 2013 because I believed a technical solution was possible. However, by understanding that our computer systems are connected to much larger systems, I don’t believe in a purely technical solution anymore. Since one of those larger systems, the ecosystem, is decidedly collapsing (not tomorrow, but now), it’s not far fetched to imagine our social systems are likely to follow, since they also rely on the ecosystem. If our social systems collapse, the framework which allows technological progress and development will also collapse.

The future of the computer industry and software profession is in peril. We must acknowledge this as a community and take appropriate actions. We must be system-system thinkers!

Advertisements

The Divide by Zero Programmer

Most working programmers have heard of the 10x programmer, a mythical creature that accomplishes 10 times more than their peers. Some believe it’s a myth and some believe it’s true. I personally don’t know, but I do know of a creature that is ultra rare but very real called the Divide by Zero programmer.

In most programming languages, divide-by-zero is defined as infinity. This usually comes from the idea that if you have a function 1/x where x approaches zero, you approach infinity. Since 1/0.1 = 10, and 1/0.01 = 100, and 1/0.000001 = 1000000, and so on.

If we define “one” in our case to mean “Able to start a project from scratch” and “zero” to mean “Unable to start a project from scratch”, then a programmer who is able to start a project is unknowably more valuable than someone who can’t.

Now you may ask “Valuable how?”. Many great programmers are wonderful at modifying existing software. I would argue it’s much more valuable work than what the Divide by Zero programmer does in aggregate. After all, you make a cup once, but wash it a thousand times. And it’s no secret that most software is in maintenance mode. Software goes into maintenance mode as soon as version one is released. So it’s perfectly valuable to have people who can improve and maintain that software.

However, the Divide by Zero programmer can be an engine that drives invention in software. They are rare because the blank page is terrifying. It takes a bit of what I call “The Fighting Spirit” to tackle the blank page.

The story doesn’t end there. Those alert enough might have realized that the function 1/x can approach zero from the other side! That is, 1/-0.1 = -10, and 1/-0.01 = -100, and 1/-0.000001 = -1000000, and so on. In other words, the Divide by Zero programmer is also unknowable destructive too!

Bar Charts With Julia

I was writing a new article for Merit and I wanted to make some charts and graphs. I used to use gnu octave for my data analysis needs but recently saw a tweet from Grady Booch about trying Julia which has a matlab esque sytnax. However, it being like matlab is definately at a superficial level because Julia is type safe and seems to use LLVM to precompile your code to get some pretty nice performance.

Julia has many nice graphing libraries but I couldn’t find any good tutorials on how to generate a bar chart with Julia. I decided on using Gadfly for charts because it seemed to have some nice documentation and nice looking charts. I ended up making a bar chart that looks like this.

100MRT

I think the end result is really nice and it was easy to optimize it to look nice on a mobile device. The code for the chart above is

using Gadfly
using DataFrames
using Colors
using CSV

Gadfly.push_theme(:dark)

function merit_colors(n)
    cs = distinguishable_colors(
        n,
        [colorant"#eca25c", colorant"#00a3cd"], # seed colors
        lchoices=Float64\[58, 45, 72.5, 90\],     # lightness choices
        transform=c -> deuteranopic(c, 0.1),    # color transform
        cchoices=Float64[20,40],                # chroma choices
        hchoices=[75,51,35,120,180,210,270,310] # hue choices)
    convert(Vector{Color}, cs)
end

d100 = DataFrame(
    Winners = [57, 193],
    Maxes = [250, 250],
    Ls = ["57", "193"],
    Algorithm=["PoG1","PoG2"])

p100 = plot(
    d100,
    x=:Algorithm,
    y=:Winners,
    ymax=:Maxes,
    color=:Algorithm,
    style(bar_spacing=1cm),
    label="Ls",
    Geom.bar(position=:dodge),
    Geom.label(position=:above),
    Scale.color_discrete(merit_colors),
    Guide.xlabel(nothing),
    Scale.y_continuous(format=:plain),
    Guide.title("Won More Than 100 MRT"),
    Guide.xticks(ticks=nothing))

draw(PNG("100MRT.png",4inch, 3inch, dpi=300), p100)

I’m just going to post the code without too much commentary. The interesting bits the merit_colors function which selects the Merit blue color as the first color. I used another array called Ls to control the labels of the bars in the chart because using the Winners array didn’t work because of type conversion errors. The other tricky thing to learn was how to modify the spacing between the bars, which ended up as a property of the theme as the bar_spacing parameter.

Other than figuring out the colors, labels, and bar_spacing, it was pretty straightforward. I hope this helps others trying to generate Bar Chars using Julia.