Hatena::ブログ(Diary)

わさっき RSSフィード

2013年06月12日

[] どんな人になってほしいか

学科の学生が,授業や研究室活動を通して,どんな人になってほしいのか…

一言でいうと,「ICTを活用して問題解決ができる人」です.

付け足しがあって,ICT(information and communication technology,情報通信技術)のCには「対人コミュニケーション」を含めてください.

(リリース:2013-06-10 朝)

2012年08月07日

[] メモしてもらう

はてブの数を見る限り,盛り上がっています.

ひと晩たって,関連エントリーを見てみますと,

実際は、これプラス合意が必要だろう。打ち合わせのメモというのは議事録的な性格を帯びていることが多いし。

何のためにメモを取るのかというか、僕のメモテク

で,ぼんやりと私の思っていたことが,代弁されていました.


私が関わる範囲で,メモをとってもらうのは,主に次の状況です.

  • 学生が私の部屋に来て*1,重要事項を記録する.
  • 研究ミーティングで4年生が,議事録作成のためにメモをする.

とくに前者において,WIKI以前にPCが使えません.手で書いてもらっています.そのうち,ケータイまたはスマホ(名称も,変わっているのでしょうが)で打ち込む学生が出てくるのかもしれませんが,まだいないですね.

気にしておきたいのは,これら2つの状況で,「合意」の取り方が,違ってくる点です.

来訪して書いてもらうときは,その場で確認します*2.復唱してもらうこともありますし,首を伸ばして,書いたのを見せてもらうこともあります.

研究ミーティングのほうは,議事録を送ってもらって,「OK」または「ちょっと修正してほしい」の返事をします.

学生が来るまで,またミーティングの最中,こちらは何もしなくていい,学生任せでいい…わけはありませんね.いつ来るか分かっていれば,それまでに何を伝えるか,準備をします.裏紙か大きめの付箋に,書いておくこともあります.突然来た場合には,話しながら,メモをとってくれる学生との共同作業として,重要事項を共有していきます.5W2H (5W1H)も,あまり重視しません.

研究ミーティングのほうは,少々手の込んだ話だと,2回同じことを言ったり,「とりあえず議事録にしてください.おかしかったら,そこで直しましょう」と指示したりします.それと別に,こちらから発案をして,学生に聞いてもらうタイプのミーティングをすることがあります.年に数回ですが,そのときは私が記録をとり,議事録にして,学生に読んでもらいます.


上の2つはいずれも,「教員(私)がメモの内容を確認する」ことを前提としていましたが,そういう人がいない状況では,どうでしょうか?

そういったときも…メモはきちんと電子化しながら整理し,話してくれた人に確認メールを送るのがいいでしょう.メールの本文は,相手の名前・敬称と,「先ほどはありがとうございました」または「先ほどはお手数をおかけしました」から始めます.

こういった情報発信が,誤解を減らし,コミュニケーションを良好に保つことにつながります.

(最終更新日時:Tue Aug 7 05:54:19 2012ごろ)

*1:こちらから来るよう頼むことも,アポなしの来訪も,あります.

*2:研究室の学生が,こちらの部屋に来る際には,「顔を合わせて検討したほうがいい問題解決」ということもあり,基本的にメモはとりません.そして,日時を含む事項はメールで,という慣習ができています.研究室に所属しない学生が,私の部屋に来るときは,そのような原則や慣習がないので,その分,その場で手間をかけることになります.

2012年07月05日

[][] xkillでアプレット終了

火曜日は,某ゼミを欠席し,教員参観に行ってきました.

場所は演習室,言語はJavaです.例題によって,アプレットだったり,mainを含むJavaアプリケーションだったりでした.学生は慣れた手つきで,Eclipseでプログラムを打ち込み,動作確認をしたり,コードを書き換えたりしていました.

巡回して…アプレットを終了させるのに,xkillコマンドを使っているのが,目につきました.何人もいます.全員がそうというわけでは,ありませんでした.

具体的には,こうです.あらかじめ起動させていたターミナルを表示させ,「xkill」を実行します.マウスカーソルがドクロになったところで,アプレットをクリックします.そして,Eclipseをアクティブウィンドウにします.

ある学生は,「kill」を実行し,エラー表示を見て固まっていました.後ろから,「えっくすきる,かな?」と声をかけると,あっそうだと,手が動き始めました.

それにしても,アプレットの終了は,素直にウィンドウを閉じてもいいはずですし,Eclipseからも終了の指示を出せるはずです.実際,実行中には「停止」を思わせる赤ボタンがEclipse上に表示されます.それと比べると,xkillを実行するために毎回「ターミナルを出す」のが,なんとも不自然であり,非効率に見えます.

担当の先生に尋ねたところ,この科目の初めのうちは,シェル上でコマンドを実行してコンパイルし,アプレットを起動していたので,その際に,終了のコマンドにxkillを指導していたとのこと.そして開発環境をEclipseに移行しても,従来の方法でもいいとなっていたようです.

一つのこと(この場合だと,アプレットウィンドウの終了)に対して,複数のやり方があるときに,どれを選ぶか…

という問題設定をしてみたところで,学生にとっては,どうでもいいことです.こんなことが,成績に直結しないのですから.

しかし,コードを書き足し,コンパイルして動作確認といった「サイクル」において,その各ステップを見直し,必要に応じて改善できるようになることも,技術者には求められています.改善を通じて,作業の効率化が図れます.1サイクルが30秒のところを25秒に短縮できたら,単純計算で,それまで1時間かけていたコーディング時間が50分になるわけです.10分は休養にあてるもよし,新たなアイデアを考えるもよしです.

効率をいう前に,一つの目的に対して複数の手段がとり得るのを知っていることは,それだけで技能です.他の人の振る舞いを見たときに,自分のやり方と比べて,そこから学べることにも使えます.ときには,まあその人はそんなもんかと,判断(値踏み)することも,あるかもしれません.

その一方で,その技能を,大学生活のどこで身につけさせればいいのかというと,難しい話です.早いうちから,複数の手段を認識させるよりも,まずは一つの方法を習熟させ,他の方法は「自分を支えるもの」ができてからのほうがいい,という考え方もあるからです.

問題解決への認識が,授業ごとに,また教員の間でも異なっていることが,学生に不信感を募らせ…そんなことはないか,それでも,各授業に対する「敬意」もしくは「学習意欲」を,低くしているようにも感じるのです.

関連

2012年06月29日

[] 東京大学には入ったけれど・・・ああ無常 人生の失敗を始める頭の“良すぎる”学生たち

文章全体にはそこそこ同意しながらも,「不吉な臭い」のある内容で,そのことは,文章をすべて終えたあとの,中西 正紀さんのコメントで明快なまでに指摘されていました.

学生に対して,いや世の中はこうなっているのだよと諭し,それが物議を醸したといえば,トリアージ論争を連想します.発端となったエントリへはあえてリンクしませんが,当時,大学のうちに学んでほしいのは,トリアージか?を書きました.2010年に,1冊の本やWebの情報から,「院内トリアージ加算」というのを知り,余談で話すトリアージへとつながります.

「東大(生)」に関する本も,いくつか思い浮かびます.

これまでの学習形態を当たり前のものとしていて,教員の目で今後苦労するだろうなという学生に対して,どんな視点でアドバイスすればいいか…「wikipedia:弁証法(的)論理学」「wikipedia:止揚」になるのかなと思います.

学生向けに言うのなら…「君たちのこれまでの勉強方法では,使い物にならないよ.大学に合わせた学び方をしなさい」ではなく,「みなさんのこれまでの学習方法と別に,こんな考え方・方法があります.ですがそれは,これまでの学習を否定するものではありません.両者をうまく取り入れて,問題解決に役立てていってください」といったところ.

関連しそうなエントリは,次の2つです.

(最終更新日時:Fri Jun 29 07:00:42 2012ごろ)

2012年06月19日

[][] 大学の数学とプログラミングで,行列を学ぼう

「うーん」と終始,心の中でうなりながら,読み進めていきました.kadamasaruさんによる一連のツイートに共感しました.まとめ主さんによるhttps://twitter.com/Kelangdbn/status/212950295125295106は,表現はやや乱暴ながら,指導内容を組み立てる際に忘れてはならないことだと思っています.

高校数学の中で,論理や確率統計により多くの時間をとって学習するのなら,行列の概念は大学に入ってからとするほうが,学習者のメリットになるとも考えます.


ところで私が担当している,1年後期にC言語を学んでもらう授業では,サンプルプログラムとして何度か,行列の積を取り入れています.

初回授業は2行2列です.変数は全部で12個用意します.

配列を学習したところで,n行m列とm行p列の積(積はn行p列になります),ただしn, m, pは定数,について,3重ループを用いたプログラムを示します.変数は,2次元配列2個に減ります.と言いたいのですが,別に3つのループ用変数を使用します.*1

さらに進み,構造体を解説する中で,行数・列数の変更が可能な,行列構造体の定義を2種類示します.いずれも行数・列数・成分からなるのですが,一つは成分を固定サイズの2次元配列とします.もう一つは成分についてはポインタだけを持っておき,外部で確保した2次元配列を指し示すものとします.*2

ファイル入出力(fopenなど),記憶域管理関数(mallocなど)と連携させ,ファイルから読み出して行列を構成し,積などの演算を施して,結果を別のファイルに格納する方法を確認すれば,1年後期のC言語の内容としては,ゴールにたどり着いたと言っていいでしょう.

上記togetterの中で何度か,積の非可換性のことが書かれていますが,プログラマにとってはそれはさほど重要でないように感じます.一次変換を行ったり,固有値を求めたりするのも,基盤となる行列のデータ構造を記述した上で,線形代数ほかの教科書・解説書をもとにコーディングし,動作確認していけばいいのです.バグなく効率の良いプログラムを作りたければ,Excaliburなどの行列計算用ライブラリを選定・導入することになります.「Cで書くべきか?」というところから,疑問を持つべきかもしれません.

それでもなお,プログラミングを学習する人が,数学の行列を理解する理由,というよりは「これだけは理解してほしい」という点を挙げるなら,行と列の非対称性だと思っています.

数学的には,ある与えられた行列から,特定の行や列を抜き出したり,特定の行や列に関する演算をする際に,行と列とで,コスト面での違いは見られません.しかしプログラムを書くと,違ってきます.素直なコーディングでは,行のコピーはmemcpyでできても,列のコピーはそうはいかず,forループを用いた鈍くさい方法をとらざるを得ません.

ちなみに数学の話であっても,行と列には異なる役割が課されてきたように感じています.行列Aを用いてy=Axといった形のものを見るときに,そう思います.xとyは列ベクトルで表されます.高校までで学習した形(行ベクトル)にしないのは…結局のところ慣習なのでしょう.


かつて授業で示した,行列を使うことの実用的な例を一つ,挙げておきましょう.フィボナッチ数を計算するときに,a1=a2=1から始めて,a3は,a4は,a5は…とするよりも,行列の積形式を用いた漸化式を作って,べき乗で求める(A^2は,A^4は,A^8は…)ことで,演算回数を減らすことができます.ただし,元を取るためには,十分大きな数に対するフィボナッチ数が必要となり,Cの範囲ではすぐにオーバーフローを引き起こします.*3

もちろんフィボナッチ数は本質ではなく,10年以上前ですが,ぷよぷよの連結性判定で行列を用いたアルゴリズムを記したことがあります.そのときの行列の各成分は0/1で,成分ごとの乗算と加算は,論理積と論理和に置き換えられます.

(最終更新日時:Tue Jun 19 20:09:14 2012ごろ.タイトルを「情報分野の学生が行列を学ぶ理由」から変更しました)

*1:Σを用いた式に基づき素直に3重ループで表すものよりも,ループの順序変更をすることで,メモリの連続した領域をアクセスするようになり,実行速度が劇的に向上するという事例が,『Cプログラム高速化研究班 コードを高速化する20の実験と達人の技』pp.97-101に示されています.

*2:2次元配列を構造体の中に入れるほうが,コードは簡単ですが,使用しない場所が多くなり,メモリの使用に無駄が生じます.ポインタにすると,その非効率を解消できる反面,指し示すのに処理が増え,バグも生じやすくなります.こういったことを通じて,一つの課題に複数の実現手段があること,そしてその得失を認識することへと持っていきます.

*3:『情報科学入門―Rubyを使って学ぶ』に「5.3 行列を用いたFibonacci数のアルゴリズム」の解説があります(pp.90-93).Rubyなので,オーバーフローを考慮する必要はありません.鈍くさいフィボナッチ数計算プログラムのみ,http://lecture.ecc.u-tokyo.ac.jp/johzu/joho-kagaku/text/からダウンロードでき,行列を使ったプログラムは練習問題となっています.