読者です 読者をやめる 読者になる 読者になる

初代Masteries

きっとモヒカンにもなれないお前たちに告げる!!!

宮城, 行ってました. #myu2012

昨日宮城大学で開催された, 「情報デザイン特別講義」なるものに参加してきました.

これは宮城大学の大学院生向けの授業として開講されているそうで, Sendai.pmの@さんが招聘したエンジニアが, 「プログラマーの仕事」というテーマのもと, 270分みっちり語ってくれるというものです.
宮城大学の授業という形ではありますが, 一般からの参加もOK! ということだったので, 就活の合間に参加してみました.

この授業のすごいところは, 何と言っても講演者の顔ぶれ!
Perl界隈の最先端を走る, 錚々たる面々が講演者として名を連ねています. 第1回は@さん, 第2回は@さん, そして自分が参加した第3回は@さん!
...なんというか, これ, 金取っても(取られても)十分お釣りが来ると思いますね. こんな講義を無料で一般公開する宮城大学は神だと思います.

詳細については, togetterでまとめられていますが, 自分がメモを取った分もまとめてみようと思います.
聞き間違えや, 解釈を間違えている部分等もあるかと思うので, 気がついた方はツッコミお願いいたします.


「組み込み」について

  • Q. 組み込み系の技術者が不足しているのではないか?
    • 「組み込み」の特徴は, 「ネイティブ環境で開発できるか否か」ではないか. 逆に言えば, 「エミュレーションの準備をする必要があるか否か」.
      • その為には, まず道具を作る必要がある.
    • 道具の大切さを知っているので, 組み込みのエンジニアは他の世界でもやっていける事が多い.
    • 現在, 1つのアーキテクチャでできている事は増えている.
      • 道具の数が減るが, 1つの道具でできる事が増える進化.
    • 組み込みの開発環境は淘汰され, その分新規参入の敷居が下がる. それにしたがって給料も下がるのではないか.

諸外国との発想力の差

  • Q. インドやアメリカ等, 諸外国との開発力, 発想力の差は?
    • 国で差別するのはナンセンスでは?
    • 国ごとに差が出てくるのは, 「すごい事をした」人に対する反応.
      • 日本では, Winnyの金子勇やホリエモンなど, 賞賛ではなく罰が与えられることが多い.
    • 「普通のエンジニア」の開発力, 発想力は, どの国でも同じ. アメリカでは, 地域間での差すらある.
    • アメリカが普通だと思ってはいけない.
      • 「なぜ日本ではiPhoneができなかったのか」という人がいるが, こういうモノは「できるほうがまれ」.
        • どうしてドイツでできなかった? どうしてフランスでできなかった? どうしてアメリカの東海岸でできなかった? ...
        • できない方が当たり前!
      • 正規分布の右端(少数の, 物凄い人達)領域の人が集まる場所は, 世界中探してもカリフォルニアくらいしかない.

「セキュリティ」について.

  • Q. OSSはセキュリティ的に危険では?
    • セキュリティが着目されるあまり, もう1つの脅威が軽視されている. -> セーフティ
      • セーフ(セーフティ)が破れるのは「事故」, セキュア(セキュリティ)が破れるのは「事件」.
    • セキュアを守る方法は2つ. 「鍵をきちっとかける」と「セキュアを破ろうとする人を減らす」.
      • 後者はつまり, 「他から嫌われない」だったり「他から恨まれない」ということ.
      • 「攻撃しよう!」と思われないようにする.
    • セキュアを強くすることでアンセーフになることも.
      • PWを長くする(セキュア) -> PWを忘れる(アンセーフ)
    • 事件が起きたら鍵が増える. 鍵を増やす前に, なぜ事件が起きたのかを考える必要がある.
      • ほとんどの人は, 明確な悪意の対象とはならない. つまり恨みを買わない, というのはそれだけでセキュアとなる.
        • そういう機会(恨みを買う機会)が少しでも増えるなら, 「不信が支配する世界」に変わるのでは. そのような危惧は, 10年前より増えている.

現在のプログラマに必要な能力とは?

  • 1から100までの数字を箱に入れるとき, 箱はいくつ必要? = 100個
    • 箱の数を減らすには? Perlでは, "1..100"と書けば箱は6つで済む.
    • プログラミングとは? 上記のような抽象化, 簡略化.
  • プログラミング言語がたくさん出てくる理由は, 「あるものを簡潔に書きたい」の"簡潔"に対する考え方の違い.
    • プログラムを簡潔に書こうとすればするほど, プログラミング言語は複雑になる.
      • この対偶は, 「簡単なプログラミング言語は, プログラミングが難しい.」 -> Brainfuck
      • Ruby: プログラミング言語としては難しいが, コードは簡潔.
      • Brainfuck: プログラミング言語としては簡単(命令は8個のみ!)だが, コードは複雑.
  • コルモゴロフ複雑性
  • 'hello, world!'はプログラムか? データか?
    • PHPでは入力はそのまま出力される.
    • 何がデータで, 何がプログラムか? これは言語が決める.
      • 世の中の大半の言語は, プログラムにデータを埋め込む.
      • では, データをプログラムで表現することは可能か?
      • 今時のコンピュータは, ソースコードというデータを読み込んでプログラムを実行する. ... データ -> プログラム. turing machine.
      • プログラム -> データ. これはchurch calculus.
        • "何かをやる"というプログラムでデータを表現する.
        • これを見つけたのはチューリングの指導教官. つまり, こちらの方が先に見つかっている.
    • データはプログラムであり, プログラムはデータである.
      • 近年は, データとして書かれた文字の羅列をプログラムと解釈する事が多い.
      • チューリング型が主流なのは, コストの問題?
  • メタプログラミングでchurch式を知っているとご利益がある.
  • 今時のエンジニアの基礎知識の1つ = メタプログラミング
    • データを処理してデータを返すモノ「以上」が要求される.
    • プログラムを出力するプログラムを作って, 初めて一目置かれる. この究極がプログラミング言語.
  • 知識として知っているだけではなく, 癖にする.
    • あるプログラムを書いたとき, これを出力するプログラ
    • ただ, いきなりメタを始めないで, まずはベタに書いてみる. ベタに書いて長すぎると思ったら, メタを考えるべき.
  • プログラムっぽいモノと, プログラムっぽくないモノを分けるものは何か?
    • 条件分岐が入ってくるとプログラムっぽく見える. この直感は案外正しい.
  • 正規表現はプログラム言語になるのか? チューリング完全か?
    • 正規表現では, "(b*(a+b)+c)"から"(a+b)"を取り出そうとすると"(b*(a+b))"が引っ掛かり, カッコの数合わせができない. よってチューリング完全ではない.
    • SQLもチューリング完全ではない.
  • ライフゲームは生物と呼べるか?
    • 自己増殖するが, 生物とは呼べない.
      • 例えば結晶も同じ. 自己増殖は, 生物である必要条件であるが十分条件ではない.
  • ライフゲームは初期位置ですべてが決まる. では, この世界はライフゲームか?
    • 我々に自由意思というのは本当にあるのか? もしこの世界がライフゲームなら, 自由意志など存在しない(すべて最初から決まっている)事になる.
      • これは証明されていない. 何故なら, 宇宙の初期配置は誰も知らない.
    • 法則と法律の違いは何か?
      • 法律にある"ダメなこと"はすべて可能. 一方, 法則は破り用がない.
    • 法律があり, 賞罰がある = 自由意志があることを公理化(前提)している.
  • 生命とは何か?
    • 生命体を分割して考える. 人間, 臓器, 細胞, 核・ミトコンドリア, 分子...
      • だいたい「核・ミトコンドリア」と, 「分子」の間に, 「生命」と「物質」の分かれ目がありそう.
      • 生命を分割するとまた生命が出てくる. では, 生命が集まったものも生命と呼べるのでは?
      • 人間が集まったもの(社会)も生命と呼べるのではないか.
    • 再帰性: 切っても切っても生命, 重ねても重ねても生命
  • ウイルスと細胞の違いは? 代謝が違う.
    • ウイルスは生命に依存している. よって生命ではない.
    • 「変化に対して一定を保つ恒常性」も生命である条件.
  • 自己増殖, 再帰性, 変化に対する恒常性. これを満たすなら生命として認められる?
    • ライフゲームを組み合わせてライフゲームを作れる. これは生命では?

※この辺から, 夜行バスの疲れが出てきてメモがグダグダになっている...

  • 「これを得たら最強だ!」 -> 複雑なものから, そのエッセンスになる単純なものを見つける能力
    • プログラマ = 単純な部品を組み合わせ, ソフトウェアを作る
  • 物事は可能な限りシンプルでなければならない. しかし, シンプル過ぎてはいけない. by アインシュタイン
    • フィボナッチ数を計算するプログラム. 定義通り, 再起を使って"f(n) = f(n-1) + f(n-2)"と書くと, 数が大きくなるにしたがって重くなる. どうすればよいか?
    • メモ化. 関数呼び出しの結果を後で再利用する.
    • use Memoize; ... メモ化するモジュール.
      • 重くなる原因は, 再起の結果, f(n)を2*f(n)-1回呼んでいるから!
      • メモ化して, 関数呼び出しの数を減らしてやれば, 高速になる.
  • high order perl ... 高階関数, メタプログラミングの本. pdfで無料配布されている. 著: Mark Jason Dominus
  • これからのプログラマに必要なこと = 「逆に考えるんだ」.