司法修習23期（同期に漆原良夫）を経て弁護士登録。 1971年から弁護士活動を開始。弁護士時代は労組事件や日本教職員組合関連の案件を扱った。麹町中学校内申書事件の弁護人も務めている。また、ピース缶爆弾事件では弁護人として無罪を勝ち取った。所属していた弁護士事務所の部下に福島瑞穂らがいる。また、小川薫の弁護士を務めた。
徳島県立城南高等学校卒業。1964年に東京大学文科一類に合格し、上京する。大学の同期（入学者）には前・自由民主党総裁の谷垣禎一などがいた。東大時代は全共闘の新左翼系学生運動家であり、日本共産党を脱党した安東仁兵衛らが指導した構造改革派のフロントというセクトのシンパだった。東大安田講堂事件の際は講堂の中にはおらず、救援対策や弁当の差し入れなどを行い、学生活動家仲間からは「弁当運び」と呼ばれていた。5年次在学中の1968年に司法試験に合格し、中退して司法研修所に入所した。
1990年の土井ブーム時に日本社会党から当選し、社民党、旧民主党を経て民主党に所属、衆議院議員を6期務めた。旧民主党政策調査会長、民主党政策調査会長（第7代）、内閣府特命担当大臣（行政刷新担当）、国家戦略担当大臣（第2代）、内閣府特命担当大臣（「新しい公共」担当）、内閣官房長官（第78代）、法務大臣（第86代）、拉致問題担当大臣、民主党代表代行などを歴任。
アルバム『ノー・モア・ティアーズ』（1991年）の発表に伴い行われたワールド・ツアーからの録音を使用。「黒い安息日（ブラック・サバス）」は、1992年11月15日のカリフォルニア州コスタメサでの公演の音源で、ブラック・サバスのオリジナル・メンバー4人の演奏による。オズボーンは、この日を最後にライヴ活動から引退することを宣言していたが、後に引退宣言を撤回。
マカヴォイは、銀行家であったモーリス・クリアリー (Maurice Cleary) と1929年6月26日に結婚し、ふたりの間にはひとり息子パトリック (Patrick) が生まれたが、1940年には離婚に至った。マカヴォイは、1984年に84歳で亡くなったが、これは前年に起こした心筋梗塞の副作用によるもので、亡骸はカリフォルニア州カルバーシティのホーリー・クロス墓地 (Holy Cross Cemetery) に葬られた。マカヴォイは、映画界への貢献に対して、ハリウッド・ウォーク・オブ・フェームのヴァイン・ストリート (Vine Street) 1731番地に星を与えられている。
これは、Javaで実装された、ソースコードの一部である。論文では、learnRate = 0.1、negLearnRate = 0.075、mutProb = 0.02、mutShift = 0.05 が使われている。小さな問題の場合、N = 100、ITER_COUNT = 1000 で十分である。public void optimize() {    final int totalBits = getTotalBits(domains);    final double[] probVec = new double[totalBits];    Arrays.fill(probVec, 0.5);    bestCost = POSITIVE_INFINITY;     for (int i = 0; i < ITER_COUNT; i++) {        // N個の遺伝子を作成する        final boolean[][] genes = new boolean[N][totalBits];        for (boolean[] gene : genes) {            for (int k = 0; k < gene.length; k++) {                if (rand.nextDouble() < probVec[k])                    gene[k] = true;            }        }        // コストを計算する        final double[] costs = new double[N];        for (int j = 0; j < N; j++) {            costs[j] = costFunc.cost(toRealVec(genes[j], domains));        }        // 最小・最大コストの遺伝子を探す        boolean[] minGene = null, maxGene = null;        double minCost = POSITIVE_INFINITY, maxCost = NEGATIVE_INFINITY;        for (int j = 0; j < N; j++) {            double cost = costs[j];            if (minCost > cost) {                minCost = cost;                minGene = genes[j];            }            if (maxCost < cost) {                maxCost = cost;                maxGene = genes[j];            }        }        // 最良コストの遺伝子と比較する        if (bestCost > minCost) {            bestCost = minCost;            bestGene = minGene;        }        // 最小・最大コストの遺伝子で確率ベクトルを更新する        for (int j = 0; j < totalBits; j++) {            if (minGene[j] == maxGene[j]) {                probVec[j] = probVec[j] * (1d - learnRate) +                        (minGene[j] ? 1d : 0d) * learnRate;            } else {                final double learnRate2 = learnRate + negLearnRate;                probVec[j] = probVec[j] * (1d - learnRate2) +                        (minGene[j] ? 1d : 0d) * learnRate2;            }        }        // 突然変異        for (int j = 0; j < totalBits; j++) {            if (rand.nextDouble() < mutProb) {                probVec[j] = probVec[j] * (1d - mutShift) +                        (rand.nextBoolean() ? 1d : 0d) * mutShift;            }        }    }}