Software development final exam answers: Part 3
daemonology.net
daemonology.net
As for other areas, you know this is just one of the four parts of the exam, right?
Software development is a big space with lots of room for specialization. Maybe it would be better, then, to model what is essential to "development" not as a distribution over knowledge but as a joint distribution over knowledge and specialization.
Since it's impossible to know everything about everything, it's really a question of "what is the probability that this will be useful?"
I think it's more a concern about a general attitude sometimes displayed on HN like "You don't know how X86 handles memory alignment, dude you even code?"
If you are focused on front-end work, knowing probability probably isn't going to change much.
That's certainly a valid hypothesis, but do we have any evidence to support it? I would be looking for causation, and not correlation (i.e. many great developers are familiar with calculus, because many great developers have CS degrees).
You seem to be saying that for certain values of k (e.g., k = “basic probability theory”), E[c(J,k)] is large enough that not having k qualifies a “deficit.” But the empirical evidence suggests that there’s a sizable set of respectable jobs X for which these deficits don’t matter. That is, for those exact same values of k, E[c(J,k) | J in X] is so small that the market effectively doesn’t care enough to withhold those jobs from people lacking k.
All of this is to say that when you say “software developers,” I think you’re imagining a set of people which is a lot narrower than the set the market actually maps to that job title. Today, “software development” admits a lot of jobs that don’t have a large dependence mathematics or computer science. The guys hammering out HTML and CSS all day long probably aren’t suffering for their probability-theory deficits. And yet most people do consider them software developers.
Question 3, for example, is obviously much more higher order math than the first spam question, but question 3 doesn't really have (IMHO) a damned thing to do with software development. The bigger question is whether calculus is a fundamental part of advanced software development, and the article does make an effort to indicate that it is, but I generally find that in a working environment there are a few math-oriented individuals, but most are more logic-oriented (which doesn't preclue math, admittedly), and unless you're on a project where higher-order math is required, you get along just fine. For those projects requiring physics calculations or whatever, you bring in the math geek. That doesn't mean it's not a testable question, but I contend it's not a requirement to be a damned good developer.
On the other hand, it didn't go into things that really are applicable to all programming, like formal logic, type theory and semantics.
For example, I think it is very easy to overstate the importance of calculus in programming. There are very many interesting applications that don't require any calculus at all. My primary interest is in programming languages, and we like to pretend that real numbers don't even exist most of the time :P.
On the other hand, formal logic and semantics is useful for reasoning about any type of programming. You don't even have to be entirely formal about it: just having a basic idea of how you could formally reason about a program helps you be clearly in entirely informal ways! For example, I've found that designing clear, easy to use libraries is far easier if you just consider the denotational semantics of your constructs completely informally: it makes it much simpler to think about the meaning of your code divorced from its implementation and makes the API and documentation much clearer.
Similarly, knowing a bit about axiomatic semantics helps you deal with things like loop invariants. Sure, you'll probably never have to prove any properties about your code in great detail. However, just being aware of these ideas helps you write the code in clearer ways and maybe even write better tests.
Type theory is also broadly underrated. Even in a language like Java, you have the same considerations--you still have to worry about covariance and contravariance, for example. Being aware of the simple and elegant models that are usually used for type systems can help you navigate Java's jumbled mess of inheritance and generics.
Anyhow: math is useful for all programming, just not necessarily the math in this quiz.