Tribes of Programming (2017)
josephg.com
josephg.com
I'm a milling machine operator, except instead of a CNC machine making, idk, table legs, I'm writing a thing to filter some database result based on some user input from a web page.
I am not doing poetry or making hardware dance, I am not doing mathematics (directly anyway). This is a trade. I'm building the small pieces of the bigger things our culture either needs, or sometimes just wants. It's my job and I'm good enough at it that I've gone from almost literal apprentice to lead. I'll work hard, then retire to a farm and never touch another keyboard again.
(jk how else would I do my taxes, I'm not a luddite)
So that's whatever "tribe" I am, I guess.
> The way people in this camp describe themselves is fundamentally pragmatic. They write software because software is useful to other people [...] I think most professional software engineers are in this tribe
Fwiw, I don't think "tribe" is a good word for what the author describes. Maybe "attitude" or "principle" would be more fitting, albeit less catchy and intriguing.
Plumbers, welders and civil engineers are supposedly trained in their area and know well how to solve a pretty well defined set of problems. Much better defined than a similar set for software engineers. So for plumbers "execution" is paramount, not - mostly not - the creative side of designing. While software is bigger, more vague and with less clear-cut recipes area.
This is less and less true lately - last couple of decades in particular - as more and more software engineers are actual plumbers in this sense. Those don't make drainage systems - or, write program - in their spare time - they take photos, sing or enjoy woodworking. Even though their employers seek people who'd program in spare time.
Those who do - there are plenty of those who enjoy programming more than just to make it a profession - can be attributed to first or second group. I think the third group actually has plenty of them as well. They don't need to think of technology to be all, end all of one's existence - they just enjoy programming, and doing little, or pretty big (this is harder, so has a lesser chance) work pieces for people. But they don't necessarily not programming on weekends.
Some more than others. But few, it seems.
https://www.ordemengenheiros.pt/pt/a-ordem/colegios-e-especi...
https://www.ingenieurwesen-studieren.de/studienwahl/abschlue...
Usage of Google translate is left as exercise.
> We self-select into communities of our peers based on these ideals. We use coded language to express these ideals to our peers.
But, maybe most of us actually _don't_do this. We all know of the annoying fetishization of "passion" in programming that alienates the majority and it's getting weirder and weirder to keep ignoring it in the real world.
Tribalism be damned, deep down, most of us are doing this because it's a pretty fun way to keep our families fed and our minds occupied.
There are many people in all sorts of 'tribes', but only a few of the tribes wrote blogs.
You have a great point. The large mercenary class in the industry is just not as visible because the nature of it creates a non-vocal majority.
I am a hacker. I make hardware dance to my tune.
Why? First of all I enjoy doing things. Understanding the computer, the compiler, how to make use of it more, how to extract more performance from my code while being absolutely correct is making me extremely happy. I feel accomplished. I also apply this knowledge in some scientific applications so, they're not all lost.OTOH, I don't throw eggs to other so-called tribes or the mercenaries, because We're humans and we're different. We have different reasons. I live in this stuff since C64. Not everyone has to. Some likes poetry, others don't. Some listen to classical, others listen to death metal, rap, whatever. I don't expect everyone to like, understand or endorse what I do. The correct baseline is we're expressing ourselves here, including the mercenaries.
So, as long as you don't throw eggs at me, we're friends. I'd gladly help you with my knowledge and more importantly, I want to learn from you to broaden my horizon and augment my ideas with yours to try, see and do new things.
Tribalism is not inherently bad, the quiet war and fetishization of these tribes are the toxic parts of it. Similarly, being passionate about programming sans the zealotism is not harmful IMHO.
These camps provide a nice foundation and philosophy when used correctly. OTOH, I agree that this is a double edged sword and very sharp one indeed.
Why not discuss further?
I do think it should be discussed further but my original point was that we may be missing out on discussing the unseen majority as much as we do these passionate ones.
Then again, perhaps those groups are just not as worth discussing other than in side notes like these HN comments and that's just fine too.
It feels like the article almost but doesn't quite touch on it: there's people firmly in multiple camps, and gamedev tends to be camp 3, but also very often camp 2 and/or camp 1.
To get AAA or even AA games running requires a lot of dogma from camp 2. Graphics programming, procedural generation, and gameplay systems complex enough to produce emergent gameplay would be camp 1 from the sounds of it.
I feel my feet firmly stuck in all 3, at any rate.
Game development appears to only move forward when some console or OS vendor steps in that asserts "this is how we are going to do it now".
It happened when moving from Assembly into high level languages, adopting C++ despite all its bloat (vs C/Pascal/Modula-2) thanks Watcom, PS SDK and DirectX, Objective-C/Swift (thanks Apple), C# (thanks Unity, Managed DX, XNA/WP 7,...).
If one of the big names in consoles would release a WebGL/WebAssembly based games console, with a couple of first party titles that would show its potential, Mario or whatever, we would see a couple of studios running to get a place on their store.
We spend plenty of time and effort doing "programming as hardware hacking" to implement a backend that can process our customers' data orders of magnitude faster than our closest competitors: This allows our customers to obtain analysis results in minutes/hours instead of days/weeks. We didn't get there with the third-camp sentiment that "The program only has to be fast enough for the users" - if we did, we wouldn't be leaders of the (niche) industry that our customers operate within.
Then again, we spend plenty of time doing "programming as applied mathematics". Our software inherently consists of a lot of geometric algorithms. To give a recent example, a couple colleagues and I spent a couple days last month to fix a buggy geometric primitive: Given an almost-simple polygon, which is made by joining the endpoints of a polyline without self-intersections with a straight edge, compute its area. We had a seemingly-correct, but complicated and evidently buggy, implementation that needed to be used in a new user-facing feature (contour-line simplification). After several whiteboard sessions and do-overs, we found a simple formulation of the problem that admitted a simple and obviously correct implementation. The buggy area computation didn't cause any crashes or other obstructions to the user, but it created results that looked aesthetically unpleasing (because the lines were poorly simplified).
"Fast enough for the users" is apparently, in your case, "fast enough to give you competitive edge."
Your wonky polygon was apparently a bug with sufficient impact to not make the program act in the way the users expected it to. Aesthetics and UI is really important to a lot of users.
"After failing to sell solving real world problems to the Haskell community, as well as failing to sell Haskell to the real world, I started to wonder whether pushing for pure functional languages was actually the right strategy. Maybe I thought, I should sell my soul to the most popular programming paradigm, objects, and to the company that has the biggest market share, Microsoft...
My main reason to join Microsoft as the company to infuse mainstream programming languages with monads and other functional programming features was that I believed the quickest road to success would be to work on adding support for exotic language features to the new Common Language Runtime..."
[1] http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.72....
Futures/promises do form a monad. async/await is not a monad since async and await are not values, functions, or anything really. If they're implemented on top of futures/promises then async/await are like a hamstrung version of do notation that only works for one particular monad.
Also async/await is not really full continuations, it's a very restricted subset of continuations (which is good, full continuations are incomprehensible).
"async/await is just the do-notation of the Promise monad" https://gist.github.com/MaiaVictor/bc0c02b6d1fbc7e3dbae838fb...
In my experience Haskell significantly outperforms C++ on real-world business problems with realistic development effort (as opposed to carefully tuned microbenchmarks). I do think laziness was a mistake (to the point that one of the biggest industrial deployments uses a strict variant instead). I've spent most of my career doing work in Scala that's very much real-world, so as far as I'm concerned all the people talking about these things being academic or overly abstract are talking crap - I use this stuff every day, and whenever I've tried to take a shortcut (e.g. define a slightly law-breaking monad instance, abuse some mutable state somewhere) I've come to regret it later.
"It's not about computers in the same sense that physics is not really about particle accelerators."
I sort of agree, but I guess it depends on what we mean about computer science being about computers. We can do things now that were downright impossible when A&S recorded their Lisp lectures simply because we can think differently about what's reasonable with regards to time and space complexity. And, of course, Abelson himself jokes about everyone wanting a faster computer in a later lecture.
Perhaps we're simply confusing CS with software development, which I suppose could be likened to confusing mathematics with accounting.
To run with the physics/particle accelerators analogy, someone still has to build and run CERN, and plenty of talent is needed to make CERN possible, many of whom are probably physicists of a different “tribe”.
We may all learn similar fundamentals and take different views on the “right way” to look at our craft, but for better or worse we’re tied together by shared knowledge.
I think the confusion stems from the amazingly vocal community of people who claim how a degree in CS (whichever level) made them amazingly better at software development/engineering.
I can imagine how a CS degree can help you with pure functional programing, or with designing distributed systems.
I was somewhat interested until this gem, but then he lost me.
But I realize they're artificial categories; you can both appreciate elegant code while feeling satisfied with a useful creation. You can weep with joy over speed and efficiency while loving the delight someone has in using what you've made.
And really, this essay quickly becomes another 'there are real computer scientists, and there are the others', and I'm so done with that shit.
Maybe it's just meaningless to classify. Maybe it's just me, idk.
But it can also lead astray, for example when less important categorizations occupy a space that is better served by more comprehensive and valid (not to mention empirically supported) classifications. I would put the linked article in this category, to some extent.
As for the problem of vagueness: classification that only contains mutually exclusive categories carry the least cognitive load, but this is seldom realistic especially when classifying human behavior. That said, properly classifying humans is messy, and also risky as human differences tend to trigger emotionally value-lade comparisons. It is a popular pastime, but usually leads to rot of some kind or other.
Though no true trichotomies exist, this one approximates the landscape nicely (in my opinion).
I would say everyone I know in big tech fits into this camp.
Depending on the project at hand - and perhaps also depending on the day - I am any one of the three?
My one extra nuance would be the "less is more" attitude rooted in UNIX tradition.
I see a computer as a sort of huge warehouse-sized machine, with tiny little gears and pistons all moving in perfect timing, and I just want to throw an apple into it, to see what happens.
This almost reads like stages of individual maturity -- from "only aware of self", through "able to manipulate the outside world to reach goals", to "aware of and collaborating with others for common good".
I assume you then don't use the following features?
- GC
- Generics
- Higher-order functions
- Recursion
- Static scope (oh man)
- Type inference
- Lambdas, closures, ...
Take a look at [1] to see why FP might be useful. You'll be surprised how many interesting features they have, and will want some of those in your current OOP-focused language too
1. Interested in math and computer science? Start with Scheme. 2. Want to be an engineer? Start with C. 3. Want to develop a product (or just general interest)? Learn Python.
These categories line up precisely with the article's three tribes: Mathematician/poet, hacker, and maker.
The computer is not an object of worship... it is a tool users must deal with to get their jobs done... that tool should reliably and predictably work with as minimal fuss on their part as possible.
My language of choice is Lazarus/Free Pascal, but I'll do whatever is required to get the job done.