2009年5月22日金曜日

SWE642ふりかえり

SWE642では、一言で言うとJ2EEをざっと概観する、という内容でした。今までのキャリアの中で、Web開発にかかわることはなかったので、このクラスは私にとってWeb開発がどういったものなのか知るとても良い機会になりました。

クラスで成績1番だったかも!?
このコースの成績はA+でした!A+をいただいたのは初めてで、とてもうれしかったです。しかも、このコースの初回に先生がGrading Policyを説明され(この資料の6ページ目)「A+はクラスでtop gradeだった一人だけにしか与えない」と言っていました。なので、おそらく今回のクラスの中で私が最も成績が良かったのかもしれません。今回のクラスでも、会社勤めをしながら講義を受けるパートタイムの学生が多く、そのほとんどが仕事でWeb開発に関わっているようなので、そのような中で良い成績をいただけたのは、良かったと思います。

このコースで学んだ内容
このコースで扱ったのはJ2EE、より具体的には以下の技術について、宿題を通じて実践しながら学びました。
  • HTML
  • JavaScript
  • Java Servlets
  • JDBC
  • JSP
  • XML/XML Schema
  • J2EEデザインパターン
上記を見てお分かりのとおり、これらをたった4ヶ月でしっかり学ぶことは不可能です。このコースではこれらを広く浅く学びました。これらの技術を自分のものにするには、より多くの実践が必要なのは明らかです。ということで、このコースをきっかけに、自分でより深く勉強していければよいと思います。

JavaScriptはちょっと厄介?
JavaScriptは、先生が講義でおっしゃっていたように、C言語やJavaと異なり、厳密な型チェックがないので、プログラミング/デバッグが厄介そうな印象を受けました。今度のキャリアの中で、JavaScriptにあまり関わらないことを祈るばかりです。ただ、幸いJavaコードをJavaScriptに変換してくれるGWTといった技術が利用可能なので、これらをうまく利用すれば良いかと思いました。

なるほどJSP
このコースが始まってすぐぐらいに書いたこのエントリで、ServletsではHTMLを動的に生成するためにJavaコードの中にHTMLを埋め込む必要があるので気持ち悪いと書きました。その数週間後、JSPを学び、すぐ「納得」でした。JSPはServletsとは反対に、HTMLにJavaコードを埋め込むイメージ。そして、ベストプラクティスとして、可能な限りJSPには複雑なJavaコードは埋め込まずJava Beanからデータを取り出すだけにして、複雑なコードは普通のJavaクラスに実装すべき、というのにも「納得」です。

繰り返しになりますが、このコースはあくまでもJ2EEの概観でした。ですが、ざっと全体を見渡すことができ基本的な事項を押さえることができたようなので、このコースを履修してとても良かったと思います。一方で、これらの基本の上に、SpringStrutsといった様々なフレームワークが提供されているだろうと、容易に想像できます。また、プロフェッショナルなレベルに至るまでにはより多くの実践が必要だろうと思います。今後、機会があればより深く学んでいきたいと思います。

2009年5月19日火曜日

SWE622グループプロジェクトを終えた感想

前回のエントリで書いたように、SWE622のグループプロジェクトでは、分散アプリケーションをJavaで実装しました。ふと考えると、昨年の8月に渡米して以来、初めて1Kステップ以上のプログラミングをやったことになります。また、このプロジェクトで初めて他国の人と共同で実装をしました。

国際色豊かなグループ構成
私のグループは、会社勤めをしているパートタイム学生のアメリカ人、フルタイム学生のインド人、フルタイム学生の中国人、と私という国際色豊かな構成でした。このプロジェクトのおかげで、渡米以来初めてインド人の友達ができました。

果たしてみんなの実力は?
上記メンバのうち、アメリカ人の彼女は私よりも年上の現役デベロッパで経験が豊富、インド人の彼は若いながらも議論では鋭い指摘や積極的な提案をするスマートさを備えていたので、彼らがどんなコードを書くのか、とても興味津々でした。

今プロジェクトを終えてみて、正直な感想は、「私のプログラミング能力も十分通用するかも!?」(控えめ)

プログラミング能力=経験+好きさ度合い?
まず、今回のプロジェクトで改めて確信したのは、(いろいろな意味で)良いプログラムを書くためには経験がものをいうなあ、ということです。もちろん私はまだまだ経験不足ですが、それでも10年以上プログラミングをやってきて、今でもコードを書くたびに新しい発見があるので、経験の量だけ差がつくのではと思います。今回のプロジェクトにおいて、インド人の彼はまだ若かったのでこれから経験を積む段階だったようです。今回のプロジェクトを通じて彼は「すごい勉強になった」と言ってくれていたので良かったです。彼はとても頭が良く、前向きでしかも素直な好青年で、将来すばらしいエンジニアになるだろうと確信します。

アメリカ人の彼女は私より職務経験が長く、毎日のようにEclipseを使っている、と言っていたのでプログラミング経験も豊富なのではないかと思います。ですが、本人は実装大好き、というわけではなかったようです。

今回のお二人の様子を見ていて感じたのは、上述のように経験が重要ということと、どれだけ実装が好きか?というのがプログラミングには重要だと感じました。後者については、熱意にもつながるので、ちょっと疑問や興味を感じたときにどれだけがんばって調査するか、というアクションにも影響すると思います。その結果、新しい技術やリファクタリングテクニック、各種パターン等の習得度合いが変わってくると思うのです。

ちょっと自信がつきました
2008年秋セメスターでは、実装する機会がほとんどなく、議論する機会ばかりでした。英語のせいもあると思うのですが、周りの人たちがみんな頭良く見えて、自分は頭が悪いなあ、と感じたりしていました。ですが、この春セメスターでは実装する機会がぐっと増えました。このSWE622のグループプロジェクト、次回のエントリでご紹介しようと思っているSWE642の宿題、また私が取り組んでいる研究でも実装しています。これらを通じて、実装してみないとわからない重要な点が結構あって指摘したり、実装上の興味深い問題を解き議論の場で紹介したりしました。このようにして結果を出すことができ、この異国の地でもなんとかやっていけそうかな、とちょっと自信がつきました。

2009年5月18日月曜日

SWE622ふりかえり

この春セメスターを多忙にしていた主原因の一つがこのコース、SWE622です。振り返ってみると、主に以下の3つの理由により、このコースはとてもきつかったです。
  1. このコースのトピック「分散コンピューティング」がただでさえ難しい
  2. 量の多いReading Assignmentが毎週出た
  3. グループプロジェクトの課題も大変だった
期末試験も難しい上に量が多く、ほとんどの学生はテスト時間いっぱいまで教室にいたので、私を含めみんな全問回答はできてなかったのではないかと思います。ただ、先週成績が発表され、幸い「A」をいただくことができ、ほっとしています。やはり先生も全問回答することは期待していなかったようです。

このコースで学んだ内容
このコースのタイトルは「Distributed Software Engineering」ということで、分散コンピューティングについて学びました。個人的に、コンピュータサイエンスという分野の中で、分散コンピューティングはもっとも難しい内容の一つではないかと思います。
このコースでは、タネンバウム教授著の教科書「Distributed Systems: Principles and Paradigms 2nd Edition」におおむね沿って進められました。その中で、やはり「同期」は難しい問題だと思います。「同期」と一言で言っても、排他制御だけでなく、複数ノード間での時計の管理や、複製されたデータの一貫性管理など、分散コンピューティングならではの悩ましい問題も含みます。グループプロジェクトでも、これらのうち排他制御と時計(時間)管理について取り組みました。

とても多いReading Assignment
このコースの一番嫌だったのは、毎週出たReading Assignment。量が多かったので、毎週金曜日はほとんどこの宿題のためだけに費やしていたような気がします。大体記述式の問題に答える必要があったので、ほとんど英語の勉強をしているような感覚でした。
大変だけど楽しかったグループプロジェクト
上記のようにReading Assignmentは嫌でしたが、一方でグループプロジェクトは楽しむことができました。というのも、動くものを作るプログラミングだったからです。私の所属したグループには私以外に、アメリカ人一人、インド人一人、中国人一人の、合計4人でとても国際色豊かなグループでした。

プロジェクトの課題はざっくり要点をまとめると(実際の課題内容はここ
  • 「Trader」と「Exchange」という2種類のプログラムで構成された分散アプリケーションをJavaで実装
  • 複数のTraderと複数のExchangeが複数のコンピュータに配置されn対mの関係で相互作用する
  • 複数のTraderは複数のExchangeに対し、前もって「登録」を行う
  • Traderは登録したExchangeに対しメッセージを送信することにより、「買い注文」または「売り注文」を行うことができる
  • 注文を受けたExchangeは、登録された全Trader群に対しその注文をエコー送信する
  • Exchange間でメッセージ送受信は必要ない
  • Exchangeは、登録された全Trader群について、注文が行われた「順番」を正しく管理しなければならない
  • TraderおよびExchangeが配置されている複数のコンピュータの時計が完全に同期していると仮定してはならない
  • コンピュータがダウンしても、残りのコンピュータで分散アプリケーションは稼動し続けなければならない
  • メッセージ送受信には、Java RMI、Socket、Web Service等の通信手段を用いる。上記要件に基づきメッセージの種類に応じて望ましい通信手段を選択することが望ましい
どうやってイベント発生順序を管理する?
上記のうち、課題を難しくしているのはやはり「注文が行われた「順番」を正しく管理しなければならない」というところです。コンピュータ間で時計が同期していると仮定できないので、コンピュータAがメッセージを送信したタイミングと、異なるコンピュータBがメッセージを送信したタイミングのどちらが先だったのか、何らかの方法で知る必要があります。一つの方法は、Berkley Algorithm等のクロック同期アルゴリズムを使ってコンピュータ間の時計を合わせることが考えられます。
もう一つの方法は、コンピュータ間の時差を計算しておいて、メッセージが送信されたタイムスタンプに対しその時差を織り込む、という方法があります。私達のグループは後者の方法を採用しました。結果的にどのグループも同じ方法を採用していました。コンピュータ間の時差の計算方法は、NTPでも採用されているものです。以下の図において、T1およびT4はComputer A上の時計の時刻、T2およびT3はComputer B上の時計の時刻です。このとき、Computer AからBにメッセージを送信した際のNetwork Latencyと、BからAにメッセージを送信した際のNetwork Latencyが同じだと仮定すると、そのLatencyは(T4-T1 + T2 -T3)/2で計算できます。この値を使うことで時差を計算することができます。
ただし、大規模ネットワークにおけるルーター等の存在を考えると、上記仮定は必ずしも成り立たない上に、各コンピュータのクロックデバイスはそれぞれ特性があるために時差は徐々に変わっていきます。したがって、この時差の計算は何らかの周期でやり直す必要があります。

設計
他のグループと比較し、私達のグループのもっともユニークだった点は、Java RMIとSocketの2種類の通信手段を両方サポートし、比較評価を行ったことです。他のグループはいずれもRMIまたはSocketのいずれか一方のみを使って実装していました。以下が私達のグループの設計(イメージ図)です。
上記のように、ミドルウェアがアプリケーションに対し2種類の通信手段の詳細を隠蔽します。ミドルウェアとアプリケーションとの間にはキューがあるため、アプリケーションにとってメッセージ送受信は全て非同期に行われることになります。

このプロジェクトで私はミドルウェアを全て実装しました。上記のようにミドルウェアは多くのスレッドが相互作用する難しい実装でしたが、とても楽しかったです。このミドルウェアがちゃんと動作しないと、アプリケーション開発に支障が出るので、かなり早い時期に実装を完了するよう努力しました。おかげで、とても安定したミドルウェアを実装することができ満足しています。

2009年5月15日金曜日

2008年度(?)卒業式

昨日、The Volgenau School of Information Technology and Engineering卒業式があったようです。私は出席しなかったのですが、私の友人が見に行ったようで写真だけもらったので掲載します。以下の写真がメインステージです。Dept. of Computer Scienceの学部長ということで、写真の左の方に私のアドバイザのGomaa先生の姿があります。また、写真の右の方でこちらを向いている方が、Associate Deanで同じ研究プロジェクトのDr. Menasceです。下の写真が、出席している卒業生たち。ちょっと写真がぶれています。GMUのスクールカラーである緑と黄色で埋め尽くされています。この色合いはちょっと微妙。。。手前がUndergraduate、中央付近がMaster、奥がPhDだそうです。若干、格好が違うのがわかりますね。
私は来年の今頃、卒業予定ですが、わざわざ高いお金を出してこの格好をして卒業式に出席しようか、ちょっと悩み中です。。。

2009年5月14日木曜日

春セメスター期末テスト

この春セメスターに履修した3つのコースのうち、SWE622、SWE642の期末テストがありました。SWE699はリサーチクラスということで期末テストはありませんでした。

SWE622期末テスト
SWE622は、分散コンピューティングのクラスです。教科書やノート等持込可の試験ということで、基本的に問題を解く形式のテストでした。結論から言うと、時間内に全問を解くことができませんでした。とても時間内に解ける問題数でなく、先生もテスト開始時に問題を選んで解いて良いと言っていました。期末テストでは、
  • 排他制御
  • ノード間通信(同期/非同期)
  • クロック同期
  • データ複製
  • セキュリティ
に関する問題が出題され、全て記述式でした。正直、英語の問題文を正確に理解するのも一苦労でした。やはり排他制御の問題が一番難しいと感じました。具体的なソースコードが提示されず問題文から状況を整理してクリティカルセクションを見出す必要があったので、回答した後もその回答に自信が持てませんでした。

このクラスは、私が履修しているMS Software Engineeringコースの必修クラスで、ご覧のとおりかなり難しいトピックを扱っています。この春セメスターでこのクラスの期末テストがもっとも心配でした。時間帯も夜の7時半から10時だったので、年齢のせいか最後の方は脳みそが休止していたような気がします。

SWE642期末テスト
SWE642はJ2EEに関するクラスです。Java Servlet、JSP、XML等が主なトピックです。期末テストでは、一週間前に先生が「採点しやすいテスト形式にしたい」とおっしゃったとおり、単語穴埋め式問題や、True or False形式、間違い探し形式等の問題が出題されました。比較的やさしいテストだったのではと思います。一方で、教科書持込不可で、記憶する必要のあるテストであったとも言えます。
より具体的には、
  • Servletの基本的な知識
  • Servletとスレッドの関係
  • JSPの基本的な知識
  • JSPがJavaコードに変換されコンパイルされるまでのプロセス
  • J2EEデザインパターン
  • W3C XMLスキーマとインスタンス(XML)
に関する問題が出題されました。といっても、上記のようにこのクラスで扱ったトピックは幅広く、それぞれのトピックについて学んだ内容は残念ながら浅いもので、期末テストの問題もそれに準じたレベルのものでした。実際、先生も最後の講義で、このクラスを足がかりにより深い知識を自分で学ぶ必要がある、とおっしゃっていました。

2009年5月12日火曜日

リラックス

昨日、2つあった期末テストの最後の一つが終わり、今日は完全にリラックスモードで過ごしました。夕食は家族全員で友達と一緒に、GMUキャンパス内にあるビュッフェスタイルレストラン「Southside」に行ってきました。このレストランは去年の10月ぐらいにオープンしたばかりの新しいもので、中に入るとキャンパスとは別世界のようです。ビュッフェスタイルということで全部食べ放題。サラダ、フルーツ、ハンバーガー、パスタ、ピザ、サンドイッチといったアメリカで定番のものから、日替わりの多国籍料理があったり、アイスクリーム、ケーキ、ビスケット、各種飲み物もあります。

ミールプランという前払い制でまとめて料金を払うと、寮に住む学生は一食5ドルで、オフキャンパスに住む大学院生は一食6ドルになります。通常料金は一食9ドルだったと思います。

味はそこそこで上記のバラエティなので、一食6ドルは結構お得だと思います。今日は久しぶりの外食を家族で楽しみました。子供達は無料でした。

明日は私のアドバイザ、Gomaa先生と朝からミーティング。この夏休みにおける研究の進め方/予定を議論します。明日から通常モードに戻り、研究に専念したいと思います。

2009年5月11日月曜日

2009 Spring Semester終了!

今日、SWE642の期末テストが終わりました。私は、これをもって2009年度春セメスターが終了しました!

今日まで、ブログの更新が途絶えてしまって本当にごめんなさい。このセメスターは本当に忙しかったです。履修した3つのコースはいずれも宿題やグループプロジェクト等の課題が多い上に、リサーチアシスタントとしての研究もとても忙しかったです。そして何よりも、家族が今年の1月から渡米し新生活を立ち上げる時期だったので、入学手続き等、いろいろとやらなければいけないことがたくさんありました。

春が来た
でも春セメスターが終わったので、少なくとも上記のうちコースに関わる講義、宿題やグループプロジェクトはもうありません。これでとても負担が軽くなります。しかも、寒い冬が終わり、やっと春が来ました。もう5月なのでこれからどんどん暑くなるのかもしれません。でも寒い冬より全然まし。気持ちがうきうきしてきます。家族もだいぶ新生活に慣れ、落ち着いてきました。

今後の予定
当初希望していた、どこかの会社でのサマーインターンシップはあきらめ、この夏休みはGMUのリサーチアシスタントとして今取り組んでいる研究を続けさせていただくことになりました。お給料も少し上げていただくことになり、家賃だけでなく食費もカバーできそうです。もちろん夏休みなので履修すべきコースはないので、研究に集中できるので楽しみです。