I believe that this tendency to generalization is why I am able to jump between levels of abstraction quite easily. The concept of emergence, and the specific cases of recursion and polymorphism, are obvious to me. Everything in the universe is made up of component parts, interacting in ways that give rise to the meta-phenomenon we observe, like “matter” and “consciousness”, and I can keep that in mind without worrying particularly about what those components are. It is odd to me when people consider things to be discrete, isolated wholes; it can be useful to talk about them that way, but I usually don’t actually believe it.
Someone somewhere, of course, was mocking Gender Studies majors for taking an easy course because they couldn't hack liberal arts. I made the point that the Gender Studies classes I took were significantly more difficult than my computer science classes. Someone then asked me why I thought that was, and I came up with an answer:
Evolution isn't about "good" or "bad". It is simply a word for a specific emergent process. It describes all the things that happened that led to the current state of affairs. Sometimes they happened for reasons, under specific and identifiable pressures, but other times just by accident. It gets way over-simplified, especially by people looking for answers, since evolution is bad at providing answers, or reasons, because it's a description of an emergent system and not a driving force.
The original building block of evolution were these two observations:1. Does a trait make it likely you will die early or otherwise won't reproduce when someone else will, given current evolutionary pressures? Then a trait is likely to be expressed in very few members of a species.
2. Does it directly lead you to have more kids, given the current environmental pressures? Then a trait is likely to spread, being is expressed in a larger percentage of the following generation of a population that contain that trait. "Being able to digest milk when food is scarce" is a good and recent example. Note that even this doesn't imply a value judgement unless you think humans' value is based on reproduction (which some evolutionists do because they're wrong.) People who can't digest milk aren't defective. Indeed, environmental pressures can change and which traits are adaptive will change with them: now that we have better nutrition being able to process lactose may no longer be an evolutionary advantage.
3. Is a trait situationally useful, sometimes helpful and sometimes not? It's likely to show up in some of the population, but not most. (There is an interesting cluster of traits that occur with 8-15% prevalence in humans, including male pattern baldness and ADHD.) This is similar to a mixed equilibrium in game theory.
5. It is a trait that was once useful or is useful for some people even if not for you, and is not actively harmful? It may stick around! Dimorphism is complicated to evolve and thus usually only occurs under pressure. This is why women have a prostate and men have nipples. Once something has evolved, it takes pressure to make it go away entirely, which is why we go through a phase in utero when we develop proto-gills.
6. Is it fun/attractive/entertaining/not actively annoying? Then it may not contribute to inherent fitness, but it is likely to be selected for anyway, because evolution isn't a passive thing done to us. It is a dialectic process: the process shaped us, and we get to shape the process. Cultural tastes or norms can lead to evolutionary pressure just a surely as any other environmental factor (which is how the Hapsburg's lasted as long as they did: cultural power was more influential than any pressures against genetic disorders.) This is similar to mechanism design in game theory: if we don't like the outcome of the game, change the game.
8. Finally, does a trait have no reliable impact on reproductive success? Then it might happen anyway! This is called "genetic drift". Sometimes answer to "why?" is "eh, why not?"
My Usenix talk this year uses various books I've drawn on for inspiration as backgrounds for my slides. The goal of this was to share some of the broader world beyond what we usually look to as computer scientists. Some of these books are accessible, while others are extremely dense. I recommend picking things up and putting them down if they don't speak to you. It's all about what is useful, helpful and challenging to you where ever you are right now.
I'm doing a workshop on putting together computers in two hours, and rather than do hand outs I figured I'd toss the links up on my blog. When buying components for a computer, I usually read:
Ars Technica
If you are buying the components for a machine, they do systems guilds that are a useful report on the state-of-the-art each December-ish. The one for 2012 is available here:
http://arstechnica.com/gadgets/2012/12/ars-technica-system-guide-december-2012/
Video Card Benchmarks
They have performance statistics and a useful ranking of video cards by performance per price that I find particularly useful. It is helpful to remember that many of these are relatively arbitrary, so if you have some specific game or application in mind it is useful to find reviews specifically for that application.
http://www.videocardbenchmark.net/gpu_value.html
Corsair
This is the easy way to find the RAM that goes with your motherboard.
Tom’s Hardware
Has comparative reviews of various components, like hard drives, though I find their comparisons less easy-to-read than the video card benchmarks site.
The difference between Architecture and Code blurs quickly when refactoring becomes sufficiently common, so the distinction made between various pattern languages never seemed especially helpful to me. Between Architecture and Service the line is firmer: this code is mine, that code is yours, here is the interface. At the same time, I've found that the design patterns that work when I'm writing methods and classes still apply when I'm working with services. The goal is still to increase cohesion and decrease coupling, even if often I have no control over half of the code.
Thus, the idea of a Fractal Design Patterns. Instead of the usual pattern description, which describes the pattern at a specific level of abstraction, a Fractal Pattern would illustrate it at multiple levels and try to get at the underlying principle.
For example, I'll take the algorithm-swapping-base-on-state that is described by the Strategy pattern.
A summary from YodasEvilTwin on Slashdot:
"The internet is dominated by sexist men, which discourages women from getting involved in related fields."
I add a bunch more caveats, references and empirical data, but that is a good summary of how I interpret the evidence.
Introduction
There is currently a responsibility-dodging contest between industry and academia over who is to blame for the declining enrollment of women in Computer Science and declining employment of women in software development. I hear people in industry bemoan the "empty pipeline", while academics maintain that women aren't entering their programs because of perceptions of the industry. I have compiled some data that may help resolve the question by highlighting a third factor common to both: access to an Internet-based culture of computing.
Scott McCloud, in Understanding Comics, uses a simple image to explain how people employ assumptions when reading comics:
I may have drawn an axe being raised in this example, but I'm not the one who let it drop or decided how hard the blow or who screamed or why. That, dear reader, was your special crime, each of you committing it in your own style.
I argue that the same is true when reading code. The difference, however, is that with executables we can check those assumptions against our invented reality.
“a software system designed to support interoperable machine-to-machine interaction over a network.”[1]
This definition describes the infrastructure, focusing on how we deploy services and what purpose they serve right now to MBAs. It is as though they are defining a program as "a sequence of machine instructions that perform mathematical or logical operations on behalf of a computer operator”. I want a definition that tells me how to address the technical questions that emerge and provides guidance on how we will be writing and employing services going forward. My current personal definition is:
A Service is an Object bound at run-time by a networking protocol.
Note that I mean “object” here under Alan Kay’s definition [2] and not in the particular sense that the word is used any specific language like Java or C++. Despite varying dynamics, all service frameworks encapsulate some combination of data and behavior (not necessarily *well*, of course, but when they fail it is usually clear from the pain that follows.) They hide implementation details while fulfilling either implicit or explicit contracts in response to messages sent by other services.[3]
The interesting change from current Object-Oriented programming paradigms is that they also encapsulate the location they are executing and the provider of the object. Because we bind to the specific implementation at runtime using a networking protocol of some kind, the object can be running on any machine, virtual or physical, anywhere reachable by that protocol. I don’t think this fundamentally changes the paradigm any more than dynamically linked libraries did, but it is really, really cool.
Now that Google has broken integrated Google Reader with Google+, I was looking for a replacement that would let me use my daily reading of feeds the way I always had: as a way to share long-form content with other folks who specifically wanted to read the long-form content I shared this way (opt-in broadcast). Google+ defeats the purpose: I like my RSS feed and my friends' shared items specifically because of the high signal-to-noise ratio and the lack of dilution with other content.
My search led me to Tiny Tiny RSS. It offers a similar feature to Google's shared items, except instead of a specific social area it “publishes” items to your own RSS feed. It does not replace the comment or discussion capabilities of Google Reader, but it has the advantage of being something I can host myself and open source; if I ever have some free time I can address any flaws that continue to bother me.