Organizational Skills Beat Algorithmic Wizardry (2013)
prog21.dadgum.com
prog21.dadgum.com
Few things have more of a 3x effect on your code, than poorly chosen data modeling, or incorrect domain relationships. Your domain modeling determines in a large part, the amount of incidental complexity in your codebase.
When done incorrectly, it's what causes the painful - "Yeah we can't account for that feature without a lot of work. It's not how the system is designed." Which means either a re-write of large portions of the core domain, and all the fall out / impact of every dependency on it; or, the need to wrap code in hacky patch that works for this feature, but falls apart for the coming related feature because it wasn't designed the right way.
Many times when you ask a student to think in those terms they don't even understand the concept of putting all your data in a data structure that is meant to access it instead of being muddied together with little bits of execution that may or may not accomplish something.
I hate it, of course, cause I had to work a lot. The idea was that for every model you designed, the teacher introduced a new feature that required to rethink everything again.
I thought it was hell at the time, but it’s a lot more low key than a real disfunctional workplace.
It was, at least in my Eng school. And the course was called... "Software Engineering" (I & II).
Discussed at the time: https://news.ycombinator.com/item?id=5910037
There are problems with little randomness and number of moving parts: these problems are either easy to reason about, or easy to solve by analytical means (think of systems that can be reduced to few equations).
Then, there are problems with either/both: large number of elements and high degree of randomness. These problems can be dealt with statistics.
Then there is a ball of mud between - medium number of elements/randomness. The number of interactions is too high to be able to reason about them effectively, yet too little to derive solution by statistical means.
Most of the software, especially poorly written one falls in this realm- the more interactions between elements, the harder to reason about. Mastering algorithmic wizardry just moves you slightly right on this plot- being able to decrease the number of interactions makes the system easier to reason about [1]
0: https://www.amazon.com/Introduction-General-Systems-Thinking...
1: http://article.sapub.org/image/10.5923.j.ajss.20150401.02_00...
In the discussion thread, I believe one of HN's elder statesmen (ChuckMcM?) quoted a Nobel prize-winning physicist who said "clear writing in English" was more important to his career than math.
This resonates with me for sure. But the article was written back in 2013. Do employers really still ask questions about “oddball variants of heaps and trees” and “puzzles with difficult constraints”?
Also can we get the publish date in the title?
It's still true that employers overemphasize algorithmic ability. I had one systems pop quiz but nothing about usability, business, SWE processes, etc. which are as core to software engineering as algorithms.
"One of the miseries of life is that everyone names everything a litte bit wrong, and so it makes everything a little harder to understand in the world than it would be if it were named differently. A computer does not primarily compute in the sense of doing arithmetic. Strange. Although they call them computers, that's not what they primarily do. They primarily are filing systems. People in the computer business say they're not really computers, they are "data handlers". All right. That's nice. Data handlers would have been a better name because it gives a better idea of the idea of a filing system. "
While I agree a lot of software engineering is about managing large code bases, it isn't just that, I feel all aspects matter and come into play. And even code organization exist at different levels: in the small, in the medium and in the large. It's good to try and get an idea at all levels.
If so, you are profoundly mistaken, and probably a lot more optimistic about human nature than is rationally justifiable.
Most of the tricky/smart algorithms can be learned in a few months by smart kids.
But real-world, useful software architecture, requires experience and a wide array of knowledge.
This is the opposite extreme from the truth. It's like someone living in a 17th-century small town who imagines that a traveler could meet everyone in Europe in a few months. You can't even learn most of the algorithms in TAOCP in a few months, much less the entire published literature, still less all the tricky/smart algorithms that are used in existing software.
TAOCP and books like that are meant to be a compendium or reference. It would be like someone claiming "I can learn enough JS to be productive at work in a year", and then someone refuting that by showing them some obscure feature of the language no one uses and knows of.
The top-level comment didn't say that most tricky/smart algorithms a beginning programmer comes across can be learned in a few months, or that most of the tricky/smart algorithms they need to be productive at work can be learned in a few months. (For most jobs and for many programming projects, as Hague points out, you don't need any "tricky/smart algorithms".) They claimed that most of the tricky/smart algorithms can be learned in a few months. And that's profoundly false; it's like when I thought I was an expert at computer programming because I had memorized the constructs of the BASICs of several different popular home computers.
If you want to organize your programming career so that you never face any interesting algorithmic problems, you can, easily. That doesn't even mean you won't face any interesting problems, because many other aspects of programming are interesting too, like Hague's favorite, videogame user experience design. But if instead you want to organize your programming career so that you do get to work on interesting algorithmic problems, there are no shortage of such open problems known, and there is an immense body of knowledge about solutions to those problems, as well as communities of practice where you can learn to solve them. Some of them are even quite lucrative.
The top-level comment is saying that this enormous wealth of algorithmic research simply does not exist; you are saying that it is worthless. Both of you are deeply mistaken.
Unless you are running your own business, you always need to be able to take someone else's high-level understanding of a problem/feature/task and figure out how to implement it. That is true of more than just software development. And if you are running your own business, you need to be able to prioritize problems/features/tasks and figure out how to implement it.
I love solving algorithmic problems, but the vast majority of important (measured by willingness for people to pay you to solve them) problems in the world are not algorithmic. It's actually more important to be able to figure out how to make a service scale efficiently, or add an item to a menu to control overlay opacity, than it is to find the only non-duplicate item in a list in O(n) time and O(1) space.
Also, this recent article from HN is a good pairing with OP's: https://www.netmeister.org/blog/cs-falsehoods.html
It's getting to the point where I'm not that interested in pursuing a role in a company if part of the process involves pointless algorithmic tricks.
A certain subclass of human thrives in these environs but they don't produce good quality information systems
These organizations thrive on a certain kind of candidate who is willing to do what they're told and not look too far past the perks to question the direction of management or brand leadership
These questions are not much more than a smokescreen to give the appearance of propriety while masking all sorts of chicanery below the surface and optimizing for the sort of engineers who won't think twice to churn out features on a whim
If it's not algorithms it's some sort of arcane language specification or some other meaninglessly specific bit of trivia