This is fantastic and surprisingly close to how I tended to explain computer science to students and graduates: In Computer Science, there are 3 kinds of problems: 1. The problems that Math gives you: algorithms, data structures. These are the problems you think you're going to solve and sometimes you do, but often we just need a few really smart programmers to solve this and the rest of us can just use those solutio…
I'm continually surprised at how quickly non-technical problems come to dominate my time on a software project. E.g. my code doesn't work because two business stakeholders have slightly different, irreconcilable notions of what a "customer" is and it has to satisfy both.
Three Tribes of Programming (2017)
91–100 of 123 posts
Re: Three Tribes of Programming (2017)
#92This post is nice, but... Rich Hickey and Bret Victor here are squashed into overly simple (and/or wrong) categories whose descriptions go like "the best programs [...] formally prove correctness" and "beautiful code is more important than beautiful UI". Both have been very vocal against these points. Jon Blow is definitely not (just) in category 2. "But one of the reasons his last game (The Witness) took so long to…
Thanks. Author here. I mean, generally I agree - but, any generalization will always be a bit overly general and reductive. The point of this article wasn't to try and make a formal taxonomy; just express an intuition. If I were to revise this article now I think your point is what I'd change about it - I mean, all of us can embody all of these core motivations. (Although I'm not sure we can hold all of them at the s…
My personal answer to your question for me is "It depends. Lemme check what feature we're talking about here". My mentality isn't "nice, an occasion to exercise my principles", and judging from the talks two of the three aforementioned people gave, I'm positive they adopt a similar attitude: happen to take a stance, but don't actively seek it.
When I go over some codebases, I often find flavors of code that smell like someone tried too hard taking a stance. E.g. code that overly future-proofs, code that definitely needs less ad-hoc-ness, code that prematurity optimizes in an obviously naive way, code that tries too hard to use a functional/OO concept, etc. Note that these all belong to different categories in your post, but one thing they share is that they all feel like p̶e̶o̶p̶l̶e̶ ̶w̶i̶t̶h̶ ̶d̶i̶f̶f̶e̶r̶e̶n̶t̶ ̶p̶r̶i̶n̶c̶i̶p̶l̶e̶s̶ ̶s̶l̶a̶p̶p̶i̶n̶g̶ ̶m̶e̶ ̶i̶n̶ ̶t̶h̶e̶ ̶f̶a̶c̶e̶ ̶w̶h̶i̶l̶e̶ ̶l̶e̶c̶t̶u̶r̶i̶n̶g̶ ̶m̶e̶ ̶a̶b̶o̶u̶t̶ ̶h̶o̶w̶ ̶t̶o̶ ̶c̶o̶d̶e̶ folks shoehorned principles back into the project rather than the other way around.
So an alternative way of categorizing things is whether you go from the principle to the project, or vice-versa (aka whether you go from abstract to concrete or vice-versa). A result of that is that Jon Blow and Rich Hickey end up in the same category while Bret Victor and Alan Kay ends up in another (without speaking too much for themselves, and thanks to the nice confluence that is HN, I’d say that this categorization has been empirically verified if you check these people’s discussions with each other).
Also, as computing domains grow, you'll probably need to create many more categories if we cross-cut the way you did in your blog post; on the other hand, this alternative way of cross-cutting, I believe, would stay constant. But hey, that doesn't mean your way of cutting it is wrong. The alternative one might be simpler but more abstract.
Maybe this explains why many people in this thread debate on whether the cross-cutting is fair. If you ask the alternative question "which direction do you work from/to", you might get some better partitioning.
Re: Three Tribes of Programming (2017)
#93I think this is a good article, but ironically I think all three tribes would actually describe themselves the same way many times (whereas this article implies they'd describe themselves, or what matters to them, differently). To use an example from the article, I think Jonathan Blow would absolutely argue that he wrote his own game engine because it was best for his user . Whether you agree with him or not, he is w…
Re: Three Tribes of Programming (2017)
#94This is fantastic and surprisingly close to how I tended to explain computer science to students and graduates: In Computer Science, there are 3 kinds of problems: 1. The problems that Math gives you: algorithms, data structures. These are the problems you think you're going to solve and sometimes you do, but often we just need a few really smart programmers to solve this and the rest of us can just use those solutio…
Makers who don’t understand 1 or 2 often create slow or insecure code that often results in clear user impact. For example, I’ve seen diffing / recomputation code operating in O(n^3) or O(n^2) where O(n) or O(1) is possible and necessary for reasonable performance. I’ve also seen extremely poor use of network requests (multiple serial requests) that happen because the developer doesn’t understand network latency and…
Re: Three Tribes of Programming (2017)
#95Earlier quoted context omitted.
> People who love Haskell, lisp, etc. despise Ada. Why?
Ada code is not very beautiful nor mathematically elegant. I think _despise_ is probably too strong but all the things people like about Haskell and Lisp are not in Ada. I think the author probably thinks Ada's type system is more powerful than it actually is (or is just thinking of SPARK). Ada is basically just verbose C with a slightly nicer type system and better aliasing rules.
I'm seeing a new generation of kids coming out of school who are just pissing on those techniques: only functional is mathematical, and the rest is outdated, intractable garbage that causes software crises and meltdowns.
Re: Three Tribes of Programming (2017)
#96- Tribe 1: the art component wins.
- Tribe 2: the science component wins.
- Tribe 3: the business component wins.
Your life is easier when you belong to tribe 3. I also believe that you can't choose your tribe.
Re: Three Tribes of Programming (2017)
#97This a programmer that models systems (real or imagined) into working computer applications. I suggest that in many cases, the other tribes largely exist to support the creation of these systems.
This includes the systems that track and support your money, taxes, utilities, services, scheduling, reservations and insurances amongst others. The systems that enable you to purchase and consume things and have them delivered within the context of a whole supply chain.
It also includes the modeling of control systems, from the software that runs an elevator, to an airport baggage handling system, to an automated warehouse.
Typically in these, the challenge is in abstracting the problem domain under consideration - the determination of what to produce, rather than how to do so.
Examples: Kristen Nygaard, Peter Coad
Favorite Languages: Java, C++, C#, Smalltalk
Hangouts: Currently suspended due to the focus on problems in the computer and data sciences, and computing infrastructure.
Re: Three Tribes of Programming (2017)
#98Earlier quoted context omitted.
Makers who don’t understand 1 or 2 often create slow or insecure code that often results in clear user impact. For example, I’ve seen diffing / recomputation code operating in O(n^3) or O(n^2) where O(n) or O(1) is possible and necessary for reasonable performance. I’ve also seen extremely poor use of network requests (multiple serial requests) that happen because the developer doesn’t understand network latency and…
You can't make it better until you make it work.
Re: Three Tribes of Programming (2017)
#99This is fantastic and surprisingly close to how I tended to explain computer science to students and graduates: In Computer Science, there are 3 kinds of problems: 1. The problems that Math gives you: algorithms, data structures. These are the problems you think you're going to solve and sometimes you do, but often we just need a few really smart programmers to solve this and the rest of us can just use those solutio…
Makers who don’t understand 1 or 2 often create slow or insecure code that often results in clear user impact. For example, I’ve seen diffing / recomputation code operating in O(n^3) or O(n^2) where O(n) or O(1) is possible and necessary for reasonable performance. I’ve also seen extremely poor use of network requests (multiple serial requests) that happen because the developer doesn’t understand network latency and…