The Lounge is rated PG. If you're about to post something you wouldn't want your
kid sister to read then don't post it. No flame wars, no abusive conduct, no programming
questions and please don't post ads.
It has already over 30,000 files checked in (and only two pages).
Sounds like a typical ASP.NET project.
Kornfeld Eliyahu Peter wrote:
The CEO thinks it is our future.
Talk to him. By far the single most biggest problem I see in tech is poor communication. Everyone is so damn afraid to talk. I'm sure he's a smart guy or else he wouldn't be in his position. If he doesn't know what's happening under the hood, then explain it to him.
Two jobs ago, I met a man who is the CEO of a company I used to work for. He did a lot of things right and earned some moola running another business but this was his first stint into tech. More than most of us can say for ourselves. He hired a bunch of tech guys, but didn't really know what was going on. Brilliant guy, but he had a hard time figuring crap out because guess what... none of the tech people would talk to him.
Communication man. Speak up now rather than later.
Oh and your CEO is right about the future of the web. He's just looking at it from a different perspective. Talk to him.
And it should go without saying by talk I mean listen. Active and real communication is about listening as well, not just opening one's mouth to hear sounds come out that are based on an idea of a conversation someone thought up in their head before they even talk to a person.
Would you say it's accurate that all programming is essentially the process of writing functions that implement map, filter, and reduce? OK, one might argue that "fold", list comprehensions, and iterator generators should be added to that list, but in general, even the idea of persisting data to a DB or presenting data on a UI, is still one or more of those processes of M/F/R.
No, M/F/R with reasonable limitations is not Turing complete, so it cannot cover everything, so there must be procedures that do other things than mapping, filtering or reducing. Besides, if you factor out the functions that you map over things, or the predicates, or the reduction function, those often have no M/F/R internally - they're more likely to be just some small arithmetic circuit over scalars (of course you could write arbitrary functions there..).
More practically, I'd say there are a couple of common patterns that are not secretly M or F or R (or some combination of them) in disguise:
Arbitrary iteration (instead of over a collection). "Do this thing X times" is not a map, filter or reduce. Sure you could prepare a list of size X and then map over it, but that's a hack to force it to be done with the M/F/R paradigm, not a trick revealing that all loops are maps. Also if the iterations depend on each other, that's not a map, maybe a fold. "Do this until [cond]" is even less of a M/F/R. I'm sure someone would like to argue at this point that such repetitions are merely parts of M/F/R if you look at a broader picture, but that is far from always true. Consider for example numerical algorithms that iterate until they converge, or simulations of systems that have to be evolved for X time steps.
Things that involve a "scatter". That's a lot of things. For example, inverting a permutation - again you can do some dirty hack, but the regular way is iterating result[input[i]] = i for all valid i, which is not like an M/F/R or parts thereof. The "inner" code chooses where to write, so it's not just mapping some function over the array.
Almost anything that involves a more complicated data structure such as a heap, tree, disjoint sets, graphs (sometimes. some adjacency matrix algorithms do have an M/F/R structure). It will almost always rely on a specific ordering of side effects, you can't usually just apply operations to the data structure in a different order and get the same (or equivalent) results. Even if the global structure is "sort of like a map", I would argue that the requirement to evaluate strictly in-order makes it not-a-map - proper maps should not have an ordering constraint between evaluations of the function it is applying.
That, I think, covers most non-trivial algorithms, except naive matrix multiplication and its generalizations (such as Floyd–Warshall).