Great post. I think that skill floor/skill ceiling is a great framework for thinking about programming language accessibility. But I think there is more as well...
An important factor is not just the skill floor needed to get started, but the skill floor needed to understand (and maintain!) other people's code. That is, what skill level do you need to participate in a programming community?
For example, lisps have a very low skill floor, but my guess is that you need a high skill to participate in the current CL programming community. It's interesting to see the difference between CL people and Clojure here :)
OTOH, Go was explicitly designed to have a low "skill ceiling" which limits what you can do, presumably with the goal that all code would be maintainable by anybody.
Python is great example of a language with a very low skill floor and also a high skill ceiling. What's nice though, is that Python community eschews clever code, and so the vast majority of Python code is straightforward and easy to understand.
C# and Java also have a reasonable low skill floor (but not nearly as low as a scripting language -- you have to understand complicated stuff like builds, jars/dlls etc). You can also do complicated stuff in them, but again, the vast majority of C#/Java code is straightforward.
So that's why I like #fsharp. A low-ish skill floor (for a statically typed FP language, anyway!), and more importantly, the F# community values straightforward code. Let's keep it that way. If you want more complex features, use another language!
Seriously, I love that there is a whole ecosystem of programming languages, each with its own style & philosophy. Rather than forcing a language into something it wasn't built for (OO Cobol, anyone?), just take each one as it is, and switch to a different language if you need to.
Finally, what's considered "straightforward" obviously changes over time. Generics were exotic at first, but are now widely accepted. Ditto for LINQ style pipelines, and lambdas, and more recently "async". And we can see the "pipe" operator becoming mainstream as we watch!
So, maybe in 10 years, type classes (or dependent types, or effect systems) will be considered common knowledge, and in that case I would have no problem with them in F#. The trick is to be able to innovate without getting too close to the bleeding edge!
And please read this excellent follow up by @algo_luca
Where are all the modern software design books?
There was a huge burst of creativity around software design & analysis from the late 1980s up to the early 2000s (All the OOD ones, GoF, Fowler, Martin, Evans, HtDP etc) and then there's not been much since (except for DDD stuff)
Recently there has been some new activity: "A Philosophy of Software Design", "Secure By Design" and just now "Software Design for Flexibility".
("Designing Data-Intensive Applications" and "Code as a Crime Scene/Software Design X–Rays" are great but not really design books imo)
Yes, there's been been lots of architecture ones, first SOA and now microservices, but I don't count those as software design either. If you search on Amazon, there's nothing too interesting other than the ones I already mentioned. Many are really old! amazon.com/gp/bestsellers…
Thread! I've watched 100s of hours of photography videos on YouTube. I've learned from the experts! From them, I've learned that being a good photographer is all about having the latest gear, having more megapixels, and knowing those cool Lightroom tricks.
So, thank you, YouTube experts! I now have the confidence to help other beginning photographers get better. In the rest of this thread I'll critique some photos that have been sent to me for review.
We'll start with one sent to me by "Henri". My critique: there's too much motion blur. Next time, up your ISO and use a faster shutter speed. And there's way too much sensor noise! Get yourself a professional camera, mate!
If you care about usability, human factors, normal accidents, etc, then this is a must read. If this has been reported correctly, the design of the ship's navigation system is shocking. features.propublica.org/navy-uss-mccai…
To summarize: The US Navy's John McCain collided with an oil tanker and 10 people died. The crew using the navigation system got blamed but the navigation system itself didn't. Sadly, though, many of the mistakes have been made before and will probably be made again 😟
Mistake #1 -- Lack of training: [the helmsman] felt confident using the system to control the speed and heading of the ship. But... “There was actually a lot of functions on there that I had no clue what on earth they did,” he said of the system.
I'm developing a new alternative to microservices that addresses many of the problems that people run into. I call it "SPMSA". Bear with me -- I'll explain the acronym in a later tweet. 1/
First, design your microservices in the usual way. No more than 500 lines each, say, and with well-defined interfaces. But here's the first trick: you put them all in the same repo. This means that you have a single commit that encompasses all services at once. 2/
That means when you commit or refactor, you can build and test the services as a whole system and be sure that they *always* all work together! Awesome! 3/
. Before I was a programmer I use to do a bit of odd-job carpentry, so I'm going to chime in with my take based on my experiences in that field.
When you're outside an area of expertise looking in, it can often seem monolithic and uniform, but when you're an insider you quickly realize that there are many different subcommunities, each with different specialties and different approaches. They sometimes hate each other :)
We know this is true for programming, so why shouldn't we expect this is true for everything else too? In fact, a good clue that someone doesn't have any experience in a certain area is that they radically over-simplify things. Experienced people never think things are simple.😀