A Few Tips on Statistics

Statistics are a valuable tool, yet frequently misused and distorted. I have often wished that statistics was a mandatory high school class, since their usage is so critical to understanding the world around us. I thought I would try to share a few tips for better understanding statistics.

First, while statistics are often misused, they truly represent our most valuable tool for objectively assessing and quantifying issues and the nature of the world beyond our reach. The alternative is to rely on anecdotal evidence, stories that we have or others have experienced. While stories can be a great way of helping us to understand how situations work and connecting with others, they tend to lack of quantifiable objectivity. First, stories can very easily be non-representative of the most common realities. We, or those we listen too, can easily have experienced unique situations that do not actually correspond with normalcy. If fact, the stories we tend to enjoy most are those that are most unusual. So the stories that are shared, whether it be orally or through social or news media are often the ones that are furthest from an accurate representation of typical reality. For example, the deaths we were hear the most about on the news are the ones that are most unusual, and least likely to happen, precisely because those are the ones that are most interesting, the causes that in reality take the most lives, are banal.

Even though statistics are our most objective tool of describing the world in quantifiable ways, they are plenty of ways we can be deceived by them. Let’s look at a couple basic steps for filtering statistics.

The first type of statistic we often see is those that simply describe some issue. The statistics are dealing with “what”, but not “how” or “why”. These are the easiest statistic to understand since they simply describing a measurable quantity. The first thing to consider in evaluating these statistics is understanding context. Many statistics can be completely overwhelming, and difficult to comprehend. And when statistics are difficult to comprehend it is actually a good intuition that we need more context.

For example, the US national debt is currently about 17 trillion dollars. The huge size of national debt is often talked about, but in reality this number alone lacks context. Trillions of anything are simply incomprehensible for just about any human. So how can we bring context? We could consider this at a personal level, the national debt per person is about $55,000. This is little easier to understand (less than many mortgages, but much higher than a responsible level of consumer debt). We could also consider a statistic from a history perspective (the debt as a percentage of GDP is higher than most times in US history, but it is lower than certain times like during WWII). We could also compare the US to other countries (the US is higher than most, but lower than several, for example, Japan’s is nearly twice as high). This isn’t to make any particular claims about the US national debt, but it demonstrates how we can try to find some context for statistics. The US debt is high, but without this context, numbers like the national debt are conceptually meaningless, and it is important that we find things to compare against to provide meaning.

The next thing to beware of in approaching these statistics that often something is being implied. While using statistics to understand the “what”s of the world, we often want to take the next step to understand “why” things are the way they are, and “how” we can affect them. We want to understand cause and effect.

Probably the most common saying among those who deal with research and statistics is “correlation does not imply causation”. This may sound confusing, but it is a fairly simple warning. While statistics may show that two things are related, we need to be very cautious about assuming that one thing caused another thing.

Let’s consider an example. One could say that you are far more likely to die when you are in the hospital than when you are at the grocery store. Of course this is true, but does this therefore imply that hospitals are more dangerous than grocery stores? Of course not. Hospitals aren’t the cause of the deaths. It is the illnesses that lead both to deaths and to the hospitals that is the cause. We can’t assume that just because hospitals and deaths are related that one is the cause of the other.

But determining cause and effect, so that we can learn what factors lead to what results is still extremely important, and statistics can be used to assess cause and effect. So how can we accurately determine when a statistics indicates a true cause? A statistical relationship can demonstrate cause and effect if we can prove that no other factor is the real cause. Sometimes we can logically establish this. Other times we can setup experiments. In medicine (and increasingly in other fields, like microeconomics), trials are set up where different people are given or not given some intervention (like a drug), and then you can measure the effects by comparing the two groups. Usually the recipients are randomly chosen. The advantage of this approach, is that by randomly choosing the cause, we can be certain that no other causes are in play. For this reason, randomized control trials are used extensively to accurately assess drugs, and can be very valuable for making accurate assessment of other types of interventions.

Outside of controlled experiments, it can be very difficult to pin down sources, because it is very difficult to be sure that no other factors are influencing results. For example, determining the effect of different educational institutes is remarkably hard because so many factors like affluence affect both the education outcome and the type of institution that the parent would choose, and determining whether the institute was the deciding factor or any of the other vast number of ways that wealth can be used to benefit the education, is again, very difficult.

When we can’t control the factors, the primary remaining technique is regression analysis. However, this is where this casual discussion of statistics quickly turns much more advanced. Suffice to say that to truly demonstrate cause and effect with real world uncontrolled statistics typically requires complicated analysis.

To summarize the warning here, if someone is trying to convince you that one factor is the cause of another issue through statistics, unless the cause is logically provable, comes from a controlled experiment, or involves regression analysis, it is probably suspicious.

Statistics are an invaluable tool for understanding our world, making informed decisions how we prioritize our time and money. But in order understand them, remember to seek to understand them by putting statistics in context, and be cautious of drawing cause and effect relationships. Hopefully these tips help make sense of statistics.

Advertisement

The Engineer’s Charities

There has been a growing movement away from disinterested charity to engaging in rational and effective altruism. I wanted to write this post, because I believe that we, as engineers, should be on the forefront of this movement. This post is not an attempt to persuade engineers that they should give, although generally most engineers are reasonably well-compensated, and have the opportunity to do tremendous good through the generosity. But here I wanted to consider how and where we can give in a way that aligns with the values and principles of engineering.

A good engineer is a peculiar type of person. A good engineer is one who can solve problems and designs solutions by applying a logical, rational thinking, and using careful and clear analysis. Engineers are often not origination of research, but must analyze research to intelligently determine how the research of others applies to solving real problems. Engineers must not operate solely in the abstract and theoretical, as they constantly must solve problems of the real world, and yet they still must integrate abstract theory to create designs that will work beyond just surface level needs, that having enduring and broad application now and later.

Certainly one clear distinction between a poor engineer and a good one, is that the former is content to accept whatever tool, material, or design that is put before him first, perhaps because it is the most popular, or suggested by another, whereas a good engineer is a meticulous critic, knowing how to carefully choose between the bad, good, better, and best option. A good engineer can clearly point to the reasons why a particular component or design is better, and precisely why and how much it will yield better results or performance.

There is no reason we shouldn’t apply this same level analysis and critique to our generosity and giving. Unfortunately, this is not how the world of charity generally works. Money is typically raised by making emotional appeals, and leveraging networks of connections to attract donations. Most donations occur, not as the result of careful analysis, seeking to find the best and most efficient opportunity to deliver a desired good for others, but usually as an incidental response to some plea. Consider if we applied this approach to one of our projects, rather than analyzing our options and rationally choosing the optimum components or design for our project; we just went with whatever advertisement or buzzword we heard most recently. This would represent the epitome of lazy engineering.

As I mentioned before, there has been increasing efforts towards engaging in charity, not just as a capricious way of getting rid of money and creating some temporary emotional satisfaction, but approaching altruism with a clear goal of helping the most people in the greatest way possible with the funds we have available to us. This movement towards effective altruism, points toward the same relentless analysis of different possible mechanisms and the results they achieve, just as we engineers demand in the projects, where we spend most of our energy. This approach demands real research of interventions and the evidence of their efficacy over emotional appeals and marketing.

With this, I want to introduce a couple charities and meta-charities that epitomize effective, rational altruism:

A Charity Based on Research

Innovations for Poverty Action (IPA) is a charity founded by some of the best researchers in development economics. This charity has a foundation of research work, focused first on scientifically evaluating different possible interventions to objectively determine the most promising interventions. IPA has been at the forefront of the movement to make extensive use of randomizing control trials (RCT). This form of research has been incredibly promising since it facilitates clear tests of causation. In non-randomized trials, controlling for various factors and establishing causation is incredibly difficult and prone to biases, whereas RCTs give an irrefutable cause (randomized selection) for the basis of tests.

From the results of this research, IPA has developed programs to scale up efforts in proven and promising programs that have been shown to be effective and efficient. IPA has branched off a separate organization, Evidenced Action for the funding and development of these efforts.

Givewell – Givewell is a charity evaluation organization that has begun to receive significant attention for their extremely detailed analysis of a select few charities, and how many lives are saved or impacted for each dollar spent. While their level of analysis is probably not unprecedented (it probably happens within Gate foundation, USAID, and perhaps some other foundations or agencies), but their transparency almost certainly is. They have done very careful and detailed research of top, effective charities. You can visit Givewell’s site for more information, but their current top-rated charity is the Against Malaria Foundation (AMF). From their research, it is estimated that approximately one live is saved for every $2000 donated, a remarkable return on investment, with a high level of research behind it.

For some, even engineers, this might sound excessively cool and calculating. Isn’t giving supposed to be more than just another engineering project, something emotional and/or spiritually satisfying? I don’t believe rational giving is mutually exclusive with these other forms of satisfaction. We often apply the greatest level of rationality and thought to the things we care most about. And spiritually, at least for me, as a Christ-follower, called to care for others, putting the actual result of my giving in terms of impact on other’s lives as the highest goal, is to me the ultimate fulfillment of this spiritual pursuit. Likewise, emotionally, realizing that I have tangibly and realistically saved dozens of real, human lives, probably children who were loved as much as I love my children, is tremendously emotionally compelling. My challenge to engineers: approach giving just like you do engineering, with your best, most rational, careful analysis and concern. The impact you can make is immense.

Closure Based Instance Binding

In JavaScript, we frequently write functions where we wish to access |this| from another (typically outer) function. The |this| keyword does not inherit from outer functions like other variables, each function has its own |this| binding. For example, suppose we have a widget that needs trigger some code in response to a button being pressed. We might try:

buildRendering: function(){
  this.domNode.appendChild(document.createElement("button")).onclick = function(){
    if(this.ready){
      this.showMessage();
    }
  };
},
showMessage: function(message){
...

However, this code won’t work as intended, because |this| in the inner function refers to something different (the target DOM node in this case) than it did in the outer method. Often times developers use a bind() or hitch() function to force a function to have |this| be the same as an outer function, fixing this code as such (note this is only available in ES5, most JS libraries provide a function to do something similar):

buildRendering: function(){
  this.domNode.appendChild(document.createElement("button")).onclick = (function(){
    if(this.ready){
      this.showMessage();
    }
  }).bind(this);
},

Another technique used by developers, is closure based instance binding, where we assign |this| to a variable that can then be accessed by the inner function:

buildRendering: function(){
  var widget = this;
  this.domNode.appendChild(document.createElement("button")).onclick = function(){
    if(widget.ready){
      widget.showMessage();
    }
  };
},

Both techniques have their place, but I almost always use the latter. I wanted to give a few reasons:

  • Philosophical – JavaScript is foremost a closure-based language, with method dispatching as additional sugared mechanism built on the foundation property access and call operators. This is in contrast to other languages that place object oriented method dispatching as foundational with closures as something built on top of it. Every function in JavaScript has a closure on some scope (even if it is the global scope), and using closures to maintain references to different instances through different function levels is the essence of idiomatic JavaScript.
  • Clarity and readability – “this” is a very generic term, and in layered functions, its ambiguity can be make it difficult to determine what instance is really being referred to. Setting |this| to a variable lends itself to giving the instance a clearly articulated variable name that describes exactly what instance is being referred to, and can easily be understood by later developers without having to trace through bindings to see where |this| comes from. In the example above, in the inner function, it is clear that the are referring to the widget instance, as opposed to the node or any other instance that might get assigned to |this|.
  • Flexibility – Using closure based instance binding, we can easily reference a parent function’s instance without losing the ability to reference the inner function’s |this|. In the example above, we can access the widget instance, but we can also still use |this| to reference the target node of the event.
  • Code Size – After minification setting up access to the parent |this| instance requires (approximately, it can vary on minification techniques, this assumes variables are reduced to 2 bytes):
    function.bind() – setup: 9, each reference: 4
    closure-based – setup: 8, each reference: 2
    Some functions like forEach, already have an argument to define |this| for the callback function, in which case they have a shorter binding setup.
  • Reduced Dependencies – Function binding entails using ES5’s bind(), which reduces compatibility to only ES5 environments, or requires reliance on third-party library, decreasing your code’s portability and flexibility in being used in different contexts. Closure-based bindings rely on nothing but JavaScript mechanisms that have been supported by all VMs forever.
  • Performance – There are two phases of the performance to test, that varies on our mechanism of binding. First is the setup of the function. This can be dominant if the function is not called very often. Second is the actual function invocation. Obviously this is more important if the function is called frequently. From these tests you can see the clear, and often immense, performance advantage of closure based binding:
    Setup: http://jsperf.com/bind-vs-closure-setup
    Invocation: http://jsperf.com/bind-vs-closure-invocation
  • Of course there are there are certainly situations where it is appropriate to bind. If you are going to provide a method directly as an event listener, binding is often appropriate. However, it is worth noting that I have seen plenty of instances of creating a method specifically for an event listener, and when an anonymous inline function (with closure-based instance binding) could easily have been used.

UNFPA

It has been estimated that at a cost of about $1.7 billion a year, modern contraceptive use prevents 105 million induced abortions and another 3.6 million infant and mother deaths (in 2004) per year, with the United Nations Population Fund (UNFPA) being a main provider of contraceptives in developing countries where access would otherwise be limited. If you believe that life begins at conception, than the UNFPA has almost certainly prevented more deaths than any other organization on earth, and with more efficiency (between $7 and $177 per death prevented) than any other organization as well. The tragic irony is that funding cuts to the program in this decade have largely been driven by pro-life organizations, the very ones that hold this view of life (due to misconceptions that the UNFPA advocates abortion, which continues). This isn’t intended to be a slant against the well-meaning intentions of these organizations, but a lesson that to honestly pursue a cause, we must humbly learn from empirical feedback what are effective solutions rather than simply pushing forward with our ideological assumptions.

You can give to UNFPA here.

Capitalism is a Tool

Free market capitalism is awesome. But capitalism is a tool. Arguing about whether it is universally better than some other tool (socialism, communism, restricted capitalism, etc.) is as foolish as arguing about whether a hammer is a universally better than a screwdriver. The more relevant question is when it is appropriate (or in what form). Capitalism works fantastically well with a few conditions that create incentives that drive all parties to make decisions that benefit everyone:
1. Consumers have the ability to make a rational choice about what to consume.
2. Consumers have the freedom to choose between different products or services, creating competition that drives producers towards better value.
3. Demand drives producers to increase supply, benefiting consumers.
4. Consumers inability to afford a product/service does not represent an ethical violation.

When these conditions are present, capitalism generally contributes to a flourishing and just economies. For example with cars, consumers can easily research and test drive car to make a rational choice, they can choose between different makers and models, the demand pushes auto makers towards building more cars and increasing availability, and in general their is no basic inviolable human right to having a vehicle. This is a win-win situation, incentives benefit both producers and consumers in an relatively fair and accurate way that generally generates high and robust growth and production. Capitalism was integral in the industrial revolution were many growing sectors matched these conditions and showcased the benefits of capitalism in spectacular fashion.

However, if any of these conditions are missing, the effects can be negative. When a condition is missing, an otherwise free market may actually create perverse incentives rather than beneficial incentives. For example, when a monopoly occurs, consumers no longer have freedom, thus anti-competition laws are enforced. While many economic sectors fulfill these conditions, it is naive to assume that all do.

Education is sector where there is general consensus that it is ethically unacceptable to deny some children education due to economic circumstances (especially since such circumstances are usually beyond the control of the children). While a free market still exists with private education, allowing consumers to choose potentially superior services, this sector is supplemented with a public social structure because the ethical condition of capitalism is not fully realized. It is not appropriate to apply it as the only tool, thereby denying some children access to education.

Health care is a sector where consumers intrinsically fall short of rational and free choice. Some services are rendered in distress or emergency where there is little opportunity for research or alternatives. Other choices are made by specialists where the buyer isn’t involved (there isn’t a budget/value force towards low-price) or doesn’t understand the options enough to participate. Decisions also involved short-term vs long-term benefits where humans are notoriously poor at make rational decisions (we tend to choose short-term gains with little concern for long-term). Also insurance plays a buffering role further removing the consumer from direct value-based decisions. With these conditions for capitalism missing, perverse incentives are present, motivating increasing health care costs rather than reduction in costs. Predominantly privatized health care has struggled to produce good value (compared to government provided universal health care), not because capitalism doesn’t work, but because the conditions for capitalism simply do not exist (and it’s unlikely that they can be forced to exist) in health care. This is blatantly evident with the US health care system, one of the few developed countries still languishing with a privatized model. The US spends vastly more than any other country on health care, costs are rapidly increasing (since incentives are driving prices up instead of down), to the point where statisticians use it as an example of statistical outlier. In fact the US government spends more on our privatized health care (where the majority of expenditures are private), than do countries with universal health care (where the goverment covers the majority of costs), all while we have shorter life spans and higher mortality rates than most other developed countries. Finally, the health care also fails to meet the ethical condition. Denying basic health services due economic circumstances is a moral failure, even if the system was working efficiently.

Computers and the Internet are also creating situations where the demand-driven supply condition is started to evaporate in certain sectors. An example of this is the music industry. Duplication of music (and other products like software) has effectively reached zero-effort. This means that supply can be almost infinite as soon as music is recorded, as it can be distributed with no virtually effort from the producer. Consequently, perverse incentives are present, leading the music industry to create arbitrary constraints (DRM). With the absence of this condition for capitalism, the music industry is incentivized to create demand by reducing/constraining supply (a negative utility to society), rather than working to increase supply (benefitting society). The solution probably is not socialize the music industry, but we should acknowledge the suboptimal efficiency, and recognize that alternate post-capitalistic models may need to be exercised (and perhaps are already being used, many artists have opted for more of a gift economic approach ).

Of course there will be legitimate disagreements on the degree and type of different economic models needed in different sectors, but we should at a least start with the right question. We must start with a proper perspective of economic models as tools, not sacred institutions, that can be applied in differing degrees in different situations, rather than falling for simplistic overarching false dichotomies. Rather than leaning on our assumptions, the question of what tool to use should be driven by pragmatic look at works for the situation.

Gratefulness and Gas

A gallon of gas contains 130 million Joules of energy, equivalent to the energy of lifting a man from sea level to the top of Mt Everest about 15 times, or 31,000 Calories, and equivalent to about two weeks worth of food. Being able to purchase something with this much energy for less than $30 is incredible and something that we should be extremely grateful for, and we may not always enjoy.

The price of gas is based on simple global supply and demand. Gas comes from oil, which is a fungible resource readily interchangeable on the global market. Supply is dominated by OPEC. The US portion of the supply is very small, it currently produces around 8% of global oil, and holds only 1.5-2% of global reserves (there are some debates on extents of provable reserves, so it is possible we have up to a percentage point higher). On the otherhand, the US provides a significant part of the demand (25% of global demand), thus the US’s primary influence on prices is in demand. Economic recession decreases activity thus decreasing demand and prices, economic growth increases prices. If you don’t like prices, just like any other commodity, the recourse is it to not buy. If you are a buyer you are a participant in demand.

There are a few other contributions to gas prices that either small, regional, short-term. One is the gas tax. George H.W. Bush raised the federal gas tax to 18.4 cents per gallon in 1993, and it has remained at the level ever since. This tax represented about 14% of the price of gas under (the first) Bush. With current gas prices, this federal tax now only constitutes about 5% of the price of gas. The gas tax under the Obama administration is also at the lowest amount in constant dollars in over two decades. This is also one of the smartest taxes that we have since it not only improves roads, but incentivizes lower consumption better than any MPG mandates can (I would love to see it increased). Oil futures and trading affects price, but this too has minimal long-term impacts, and can help cope with supply fluctuations. Like other global products, inflation and exchange rates affect the current price, but the last few years have seen lower than average inflation and a general strengthening of the dollar against other currencies. Finally, there are different state and local taxes, and different regional requirements on the quality gas, and different transportation costs due to proximity to refineries and sources of production, and these are the primary drivers of the differences in gas prices in different locales, but this isn’t related to the overall country gas price trends. For each of these factors the federal government has little control or avoided any price increasing policy changes.

To grumble about prices and make it political is generally either ignorant (the principle way the US reduces prices is through economic recession), or manipulative. Drilling or pipelining more has a negligible affect on global supply. And the US is depleting it’s proven reserves at least 4-5 faster than most countries in the world, drilling faster now as way to avoid foreign dependence on oil just shifts even greatere dependence to our next generation. As one concerned for children’s future, I don’t want to dump them further them into the dead end of oil addiction.

Specifically the supposed benefits of the Keystone pipeline towards lowering prices are particularly vacuous, pipeline don’t produce oil, they just move it around, and as many have pointed out, it will move oil to the gulf for easier export, making it likely to actually slightly increase gas prices in the midwest. The real question in regards to Keystone is simply the ethics of increasing efficiency of tar sand based oil transportation versus the ecological impact.

In reality, increased gas prices are basically due to increased economic activity and recovery (the dominant supply factors are mostly out of our control), increased spring/summer driving, and supply concerns with possible conflict in Iran. The primary effect America has had is in economic recovery (and possibly we’ve played a part in some short-term supply concerns by threatening military action against Iran). You can’t eat your recovery and have your cheap oil too.

When it comes to amazing amount of convenient energy in we can buy in a gallon gas, gratefulness is a better attitude than complaining and reduced usage is a better response than political manipulation.

Kony 2012

A few thoughts from watching Kony 2012: This is an awesome and inspirational video and awesome cause worth fighting for. It is fantastic to see attention brought to tragic foreign issues that affect humanity beyond what just impacts our own self-interests. I know there have been criticisms of Invisible Children, but from what I have seen they have done a great job of responding to critiques and disclosing financial and operational information. They are definitely in it to end this injustice.

However, hopefully we don’t end with Kony. Kony and the LRA are just the tip of the iceberg of global injustices. What Invisible Children has courageously demonstrated is a willingness to learn and expose injustices that have been hidden, and speak out about them. We are not truly following in their footsteps if all we do is share or watch a viral video. And it is shallow pursuit of justice if we only react when there is a clear villian we can point our finger at. One of the criticisms of the film is that it oversimplifies the issue, but in reality this should be a criticism of us, and the fact that we often won’t respond to any issue that is more complicated than what a five year old can digest, even for injustices they have claimed far more lives than Kony. Simplification is just what IC had to do to connect with us (and obviously it worked).

Anyway, let’s follow Invisible Children’s lead. Let’s stop Kony. Our voices do indeed matter, and make a real difference. And let’s not stop there, let’s follow their lead in truly learning about other injustices and making our voices heard. And we can indeed reshape human history, both in Uganda and in the rest of the world.

“Where you live should not determine whether you live… At the end of my life I want to say that the world we left behind is one [my child] can be proud of… A place where children no matter where they live, have a childhood free from fear.” – Jason Russell (cofounder of IC)

A Broken Heart for Valentine’s Day

I wrote a little overview of our Valentine’s day gala we put on for Love146, to fight human trafficking, and submitted it to our local paper (hence the faux journalistic style, and Utah specific comments). They never published it, so here it is:

This last Tuesday, a unique Valentine’s party took place. While couples across America were packing restaurants to celebrate their relationships, about 30 couples gathered in a small church in east Sandy, with a little different focus. They also came together because of love, and also enjoyed a catered dinner and live music, but the gathering was not the typical Valentine’s evening of romance. It was focused on the heart breaking realities of human trafficking. This was an awareness and fund-raising effort for an organization called Love146, to defend, protect, and restore children caught in the tragedy of the sex slavery industry.

The reality of modern day slavery is indeed heart-breaking, even shocking. We learned that approximately 27 million people are enslaved today, generating $32 billion annually (second most lucrative crime activity). The majority of female victims are in the sex industry. An estimated two children are sold every minute. We heard a story of the torturous life of a girl caught in sex slavery, left disfigured from beatings.

This Valentine’s day, attendees also learned how Love146 was started in response to this tragedy. The founders went overseas on an investigative trip to a brothel, to see trafficking first hand. Young girls were contained behind a window, despondently waiting for their next customer, each girl reduced to a number on a menu. However, one girl stood out to them. One girl stared intently back, she still had fight left in her. That girl was #146, and from that encounter the organization was born.

While these stories left many in tears, there was also reason for hope. This fund-raising effort had a substantial impact. In fact the final presentation of the night showed the restoration homes that has been built to protect and nurture children that have been rescued out of slavery.

But surely this doesn’t happen here in America, right? Sadly, about 100,000 US children are forcefully engaged in prostitution or pornography, the average age a female enters prostitution is 12-14. And even here in Utah, there are have been hundreds of cases of trafficking, and some of the highest pornography usage in the US, fueling demand.

Dinner attendees aren’t the only modern abolitionists, you too can be a part of this movement, and make a important impact even with a small amount of time and money. Again, international exchange rates mean donations to groups like Love146 go a long way to tangible prevention and rescue efforts. You can join the local effort in Utah by supporting the local organization Operation61 (they host an annual race in Liberty Park called STOP TRAFFIC). Even without money, you can make a difference. Learn more. Make others aware. Call your US senators Mike Lee and Orrin Hatch, and your representatives to urge them to keep US supply chains slavery-free, use diplomatic efforts to protect victims, and fund the Office to Monitor and Combat Trafficking. This office is a tiny expense (we spend roughly 333 times as much to fight drugs as we do to fight trafficking), and non-partisan issues, so even moderate pressure can have an tremendous impact.

I was proud to be a part of this evening, and I wanted to commend the generous sponsors that made the evening possible, including SitePen, GSBS Architects, PurCo, SDI, USANA, the Point Christian Church, Chick-fil-A and caterers, Good Day Catering. I am also grateful for being part of a faith community, Sandy Ridge Community Church, that supports putting faith into action, pursing the Biblical call to fight injustices.

Sometimes a broken heart on Valentine’s day is a good thing!

Next Mobile Features

I wanted to suggest a few features that I believe could be significant in the mobile (web) space:
* Adding “force” and/or “radius” support to touch events. I believe this was already in the W3C specification at one point. Being able to detect the intensity or force of a touch event opens up entirely new possibilities of touch interaction. Developers could explore many new paradigms for user interaction with this extra information. Let’s not abandon this.
* An web/JavaScript interface for triggering and controlling haptic feedback. Android (and maybe others?) have made some effort to provide haptic feedback in the form of vibrations in response to button/key presses (and have native APIs for this). However, there is a lot of improvements and innovations that could be made if (web) applications could trigger the feedback themselves, providing their own possibilities for feedback based on application specific conditions. I would also love to be able to dictate something more natural and brief than an vibration that lasts for a couple hundred milliseconds. A single oscillation might be more appropriate for button or keyboard press, and longer vibrations might be more appropriate for other actions.
* Touch hover events. Yes, hovering my finger over the touch screen should trigger hover events. I know you are thinking that a touch screen that can’t detect your finger until you touch it. But come on, capacitance can be detected in objects without actual contact by simply moving to a sufficiently high frequency. Inductance at distance is a pretty basic electrical principle. Surely a touch screen could be engineered to detect finger hovering.
* Apps should be able to register as a MIME type handler with the browser so the browser can negotiate MIME types and trigger an application directly in response to links that an application can handle. For example, my Twitter application should register application/vnd.tweet. The browser should then add application/vnd.tweet to the Accept header, and if a server returns an application/vnd.tweet response (as twitter.com should do if application/vnd.tweet is in the Accept header), it should be handled by my Twitter application.
* Detachable/replaceable camera lens (not actually about web technology, just mobile devices). I want to be able to detach my phone’s camera lens and attach a real camera lens. I don’t need an SLR level lens, just one of the low-end lenses like on a typical $100-$200 camera. The 8PM CCD one my phone is more than capable of capturing a good image if it had a decent lens on it, something bigger than you can fit on a phone. I just want to be able to carry an replacement lens if I am know I am going to take picture, and be able to snap it on as needed. It is fine if I have to manually focus it.

Imperative, Functional, and Declarative Programming

November 8th, 2008
Much of the efforts in modern programming language evolution are focused on moving beyond the low level programming paradigm of imperative programming and into the realm of functional and declarative programming. Imperative programming is simplest way to interact with hardware and generally forms the foundation of higher level constructs. However imperative programming is highly error-prone approach to programming and can obstruct optimizations and implementation opportunities that better abstractions provide.

Functional programming focuses on computations and aims to minimize mutating states. Functional programming avoids side-effects and changing data as the basis for operations. Many computations that might rely on changing variables and state information in imperative programming, can be described in terms of mathematical computations in functional programming. Functional programming may rely on imperative steps in the implementations, but these imperative actions are ideally abstracted. For example, lets take a simple loop that finds all the objects in an array with a price property under 10. In imperative programming, this would be:

function bestPrices(inputArray){
var outputArray = [];
for(var i = 0; i < inputArray.length; i++){
if(inputArray[i].price<10){
outputArray.push(inputArray[i]);
}
}
return outputArray;
}
Can you spot the state mutations that we had to induce in this imperative approach? For each loop we had to modify i (increment it) and for each match we had to modify outputArray (push appends a value to it).

Now if we use a more functional approach:

function bestPrices(inputArray){
return Array.filter(inputArray, function(value){
return value.price < 10;
}
}
This code is completely free of side-effects. We simply described the operation in the form of expressions. The underlying implementation hides all the imperative actions necessary to make this work.

Declarative programming is defined as programming in terms of "what" instead of "how". Functional programming can be categorized as a form of declarative programming since we describe "what" computation should take place with expressions, instead of describing how the computation should be performed in a series of steps as in imperative programming. However, the declarative programming concept goes beyond just functional programming.

One of the central aspects of most applications is persisting data. A core service that most applications provide to users is to be able to store information relating to the use of the application. A social networking application is useless if it can’t actually remember anything about you and your friends. The functional paradigm is limited here, it’s methodology stands in complete opposition to the central goal of the application. Quite simply, applications must deal with mutating states and data. Here we can still apply declarative programming concepts, describing what the data is, instead of how it was created or how we modify it. Perhaps the most critical and invaluable benefit of declarative programming is that the representation of "what" the object implicitly dictates"how" the object is modified . With a declarative approach there is no need for describing how we interact with and modify data, because the structure of the data reveals the how without any further instruction.

JSON provides a great example of declarative programming. JavaScript supports numerous imperative techniques, but JSON is a declarative subset, which precisely defines what an object’s state should be without directions on how to get it there. For example, we could use imperative techniques:

var movie = new Object();
movie.title="Transsiberan";
movie["rat" + "ing"] = 1+2;
movie.setHowLong = function(len){
this.length = len.trim();
}
movie.setHowLong("2 hours ");
This representation describes how to build the state of the object, and can be of unbounded complexity, but it is not actually a representation of the final state. Alternately with JSON:

{"title":Transsineran",
"rating":3,
"length:"2 hours"}
The application of the concept of representation implicitly defining the method of modification can be seen here in the simple JavaScript object. The object’s state is observable as a set of properties and we can immediately infer from the presence of these properties how we modify the objects. We can simply set one of the existing properties to modify the state, and the effect of setting a property is obvious. Conversely, when an imperative approach where opaque object methods are used to modify an object’s state, the effects are not inferrable, one has to refer to out-of-band documentation to understand the interaction necessary to cause a state change.

The other central concept of a declarative approach to data is reversibility . If we modify the state of this movie object, there is a clear unambiguous easily computable representation for the new state of the object with a declarative definition. However, this is not true with the imperative definition. With the unbounded complexity possibilities of the imperative representation, it is impossible to always know exactly when step in the directions needs to modified to correspond the state change.

Another example of declarative programming is HTML. HTML represents the state of the layout of the page. The steps for how to get into a particular layout are not described, the layout is a state that is represented by the HTML. HTML provides clear reversibility as well. Layout changes can be clearly and directly mapped to changes in the HTML representation.

Applications themselves are a form of state as well, both at the low level (code is occupies memory in the form of binary data) and at the high level in languages that reify code. JavaScript is an example of an language where code is data. Here as well, we can benefit from code being organized in declarative approach rather than an imperative approach. An application runtime state that is the result of confusing imperative steps is much more difficult to debug than application that has a clear declarative organization.

Furthermore, declarative programming can often allow programmers to work within a "live" interactive environment, where code can be changed on the fly without requiring a restart. Imperative programming often means that the only way to predictably see the effect of a change in imperative code is to restart. We certainly want to be able to move towards faster development techniques that aren’t stuck in windows-style "restart" cycles.

Once again, declarative programming can be built on imperative programming. If strict discipline of rules is applied to imperative steps, the consistency can yield an declarative form in the context of rules. For example, if we said that all class declarations must take the form assigning a constructor function to a variable and then assigning an JSON object to the constructor’s prototype, then within the context of these rules, we can have a reversible representation that still be used even if we change the state of the class (changing method implementations for example).

It is important that these principles be used to direct our continuing evolution of JavaScript. Techniques like pseudo-classes based on the side-effects within constructor function execution are a regression in the evolution away from imperative to declarative. Prototype-based inheritance does a great job of maintaining declarative programming, as the application itself can be continually updated in interactive code. Debugging can be "live", classes can be evolved without requiring environmental restarts.