This is just a reflection on Yin Wang's two blog posts:

If I were to teach a group of young students programming, I will never pick Java. I certainly can avoid talking about stuffs about OO, but there has to be one or two kids with curiosity asking you what those "public" and "static" mean. No, I will never let them exposed to the world of OO. It is just too complicated.

I think Wang's thought actually makes a lot of sense. A lot of people are just obsessed about object-oriented programming. The most ridiculous examples are those design patterns. Before I got into the world of functional programming, I found design patterns pretty clever. They establish nice ways to do abstraction which is I think really really important for keeping programs simple. Even though they are complicated, it's worthy to do it. Everything changed after I got the fascinating SICP book in the following summer and realized that functions are data. With this level of abstraction, why do we still need design patterns? Why do we still make so many classes just to do some trivial things?

This post is not about that functional programming is better than object-oriented programming. It is about my thoughts on how KISS should be applied to programming. Using design patterns everywhere unnecessarily is not KISS. I think it has gone too far. The most fundamental element of programming is still function, but I don't think going purely functional is a good idea either. Time and side effects still exist all the time, and model these two things is (again) complicated. I can never imaging a pure functional version of OpenGL.

Lately I have been using Julia and I am quite happy with using this language. Despite its wonderfulness of parallel programming, I generally like the methodology of writing several structs for gluing data together, making some structs the subtype of some other sturcts and several polymorphic functions. No classes or purely functional stuff. This is closer to KISS than design patterns or being purely functional is. We don't have those nonsense like "plus methods belong to integer objects" and "we need to carry the side effect all the way to the end". We only have the stuffs that are intuitive and simple.

I don't see programming a pure practice of engineering. Since I love programming so much, I see it a practice of art which happens to have a lot of engineering going on. How do we practice art? We use intuition as our main tool. Logic of course is essential to programming, but it should not be all it is about. Logic is just the ingredient, not the entree.

I certainly like the quotes Wang has on his website. I have similar thoughts too. If something is too complex or not intuitive for human to understand, then we are probably going into a wrong direction. We should aim to create things with a degree of simplicity as these things have: