新人教育向けの秀逸な課題プログラムって? 201
タレコミ by Anonymous Coward
あるAnonymous Coward 曰く、
新人教育にて講師をやる事になりました。
で、課題を考えているのですが良い課題ってはないでしょうか?
講義は課題プログラムを与えてプログラミング、後でプログラムのアルゴリズムの説明を各人に行わせる。という形なので、
各自が異なるアルゴリズムになってくれるのが理想です。(閏年を求める等のパターンがある物はパス。)
このアルゴリズムにプログラミングテクニックの小技(f = -f)とかがでてくると面白いかなぁ。とか考えています。
この手の課題で悩んでいる方、アドバイスをお願いします。
時事ネタ (スコア:4, おもしろおかしい)
コレがいいと思います。
http://japan.cnet.com/marketing/story/0,3800080523,20393400,00.htm?ref=rss [cnet.com]
(辞めそうな社員を見分けるアルゴリズム)
Re:時事ネタ (スコア:2)
優秀な人材を育てるはずなのに、作った本人がヒットして、
辞めたならその人は優秀な人材で、
辞めなかったらそうでないという
矛盾が生じるわけですね。
ある程度以上の規模があり実用性があるシステム(会社で制作するシステムのミニ版) (スコア:4, 参考になる)
内容は何でもいいのでとにかくある程度以上の規模があり実用性のあるシステム。
独学で学んでいない人は、単独のアプリケーションとして動作するものを作り上げたことがないことが多いと思う。
関数レベルの制作とかアルゴリズムの制作みたいなことは学校で結構やらされるので繰り返さなくてもいいと思う。
とにかく1個のアプリケーションを1から作り上げる経験をしないと。
で、何を作るかだが、その会社の作っているシステムのミニ版でいいと思う。
Web会社ならWebサイトの構築。掲示板の構築でいいと思う。UIや機能はダサくてもいいので完動し使えるものを作らせる。
同様にしてSIなら在庫管理とかの簡単なシステム作ってみる。ゲーム会社ならミニゲームを作ってみる。
ポイントは会社の制作するシステムのミニ版を作ることで会社のシステムに対する興味がわくこと。
おそらく、制作の過程でいろんなことに困るはずで、「先輩達はどうやって解決しているんだろう」と思わせればしめたもの。
Re:ある程度以上の規模があり実用性があるシステム(会社で制作するシステムのミニ版) (スコア:3, 興味深い)
これにぶら下がってみよう。
新人をグループに分割して、「共同作業」をさせてみる。
で、ファイルなりDBなりに物理的に繋いで、ゴニョゴニョとロジックを通して、処理結果を返すような、
オーソドックス形式のプログラムを何でも良いから作らせたらいい。
何も指針を与えなければ、データ層もアプリケーション層もごっちゃになったようなものを仕上げてくるグループもあるはず。
それでも何かしら考えた痕跡をプレゼンさせるようにすれば、いい経験になるでしょう。
アルゴリズムとは、ちと違うかな
Re:ある程度以上の規模があり実用性があるシステム(会社で制作するシステムのミニ版) (スコア:2)
自分の新人研修がまさにこれでしたね。
C言語で簡単な電話帳プログラムを作らされました。
コマンドインタフェースだったので関数テーブル使った
Re:ある程度以上の規模があり実用性があるシステム(会社で制作するシステムのミニ版) (スコア:2, 興味深い)
ある程度出来たら、お互いにテストを書く。
納品と称して、開発環境から本番環境に見立てた別のシステムにインストールして動かす。
ドキュメントを書いて、他の人に引き継いで見る。
ってとこまでやった方がいい。
会社の研修で必要なのは、プログラムの書き方ではなく、仕事の始め方、進め方、終わり方なわけで、
作るだけが仕事ではない事は、強調しすぎることはないかと。
コメント削除 (スコア:3, 興味深い)
ソースコードからコメントを削除するプログラムがいいのでは。
特にC系とかに見られるOpen/Closeのあるコメントはネストするのかとか、
その記号が文字列の中にあるのか外にあるのかとか気にしないといけないので、
数行というわけにも行かないですし、そこそこ楽しいと思います。
CでCのコメント削除とかするとその言語のコメントの文法も覚えられますし(笑)
因みに、新人研修のときに同期の書いた、コメント8割空行1割コード1割なソースを見せられて思いつきました。
Re:コメント削除 (スコア:3, おもしろおかしい)
>なんかスゲー良いプログラムみたいな気がするのだが。
過去に1行毎に関数や代入文の説明を書いてくる新人がいました。
さすがにあきれて、やってることを書くんじゃなくてやりたいことをコメントに書けと指導した覚えが・・・
こんな感じ
Re:コメント削除 (スコア:1, おもしろおかしい)
コメントはコメントでもコメントアウトされたコードなんです。
書く→コンパイルできない→とりあえずコメントアウト→書く
のループを続けて、うるう年判定プログラムが100KBくらいのファイルになっていたのでした。
理解してないし、考えてもいないから答えに近づくことなく、疲弊するだけ。
さっさと人に聞けばいいのに。
Re:コメント削除 (スコア:1)
……という、文化もあったな。
何で読んだんだろう、思い出せない。
Re:コメント削除 (スコア:2, すばらしい洞察)
カーニハンがそんなこと書いてた気がします。
私も似たような意見ですが、コメントがなくても理解できるコードを書いた上でコメントも書くべきだと思います。
パズル (スコア:3, 興味深い)
ネタについてはまた探しとく。
Re:パズル (スコア:1, 参考になる)
アルゴリズムによって速度に差が出るので
競い合わせると盛り上がると思います。
grep クローン (スコア:3, 参考になる)
Windows 環境では(よく知りませんが)適切ではないかもしれませんが、
grep のクローンなんていかがでしょうか。
実際に動く grep があるので仕様の説明も楽ですし、
ファイル入出力や文字列操作など基本的な要素が詰まっています。
簡単にできてしまった人にも、ファイル名表示や行番号表示など
追加課題も容易に出せます。
もう少し簡単にして tail も良いかもしれません。
過去に tail クローンの課題を出した時、
ファイル全体をメモリ上に入れてしまう実装が多く提出されました。
読んで捨てる実装にしなければならない理由や
その方法を説明できる良い機会となりました。
DFAにすべきかNFAにすべきか、それが問題だ (スコア:2)
文字列からステートマシンを生成するなんてのは学校で習った知識をフルに生かせる貴重な瞬間だと思います。
DFAにすれば展開は速いけどメモリはいりそう。
NFAでバックトラックで解けば表現力はあがるけど時間はかかりそうだな。とか。
時間があったらマルチバイトgrepで。
文字クラスが複雑になりstate explosionするところなどを想像すると萌えませんか。
Re:DFAにすべきかNFAにすべきか、それが問題だ (スコア:2)
確かに書いてはみたけど早いかどうかはわからないよね。
決定的に解くことはできますね。
> 上がらないよね。「全てのNFAは、DFAに変換可能である」って習わなかった?
DFAで展開しきれないような性質の悪い文字クラスがある場合
DFAで展開するのが無理とは言い切れないまでも、NFAで展開
するのが妥当な場合があります。実際世間の正規表現ライブラリ
のうちNFAで動いているもののほうが表現力が高い場合が
多いかと。
1から10までの和を求めるプログラム (スコア:3, おもしろおかしい)
こんな人もいました。。。
案外いろいろ出てくるかも
Re:1から10までの和を求めるプログラム (スコア:3, おもしろおかしい)
こう書くべきでは?
printf("%d\n",1+2+3+4+5+6+7+8+9+10);
自分が指示したこと (スコア:2, 興味深い)
1:「1万円分、これはと思う入門書を買ってこい」
2:「付録のCDを全部破棄して、サンプルの載ってるURLは黒塗りせよ」
3:「本のサンプルコードを全て手打ちで打ち込み、動作を確認せよ」
新人には嫌われたけど、送り出した先では最低限コードが読めるので助かると言われました
Re:自分が指示したこと(-1: オフトピ) (スコア:2)
「本人が困るから」というのは本人の問題であって、会社が関与するのは余計なお世話です。そんな理由で書籍の購入を強制するのはブラックと言われても仕方ないでしょう。
なお、自己負担させること自体に法的な問題はありませんが、就業規則に記載していなければ違法です。(労働基準法 89条) そもそも、ブラックな会社だとまともに就業規則作って無さそうですが。
HIRATA Yasuyuki
Re:自分が指示したこと(-1: オフトピ) (スコア:2)
「余計なお世話」なのは「個人の持ち物として異動や会社辞めて転職するときに持っていけないと、困るのは本人」に対してです。そのときになって、必要になったのであれば経費 (異動の場合) や自費 (退職の場合) で買えばリカバリできますよね? もっともその頃には入門書は不要で、リファレンスが必要な時期かも知れませんが。
「新人を最低限レベルに押し上げることは、会社を維持する上での重要課題だと思います」 と仰るわけですが、その重要課題に対して経費をけちってしまう会社は問題ではありませんか?
HIRATA Yasuyuki
Cだけど (スコア:2, 参考になる)
たとえば、icalc ((1+3)*4) とかすると 16と返してくるようなやつです。
ただ作らせても、おもしろくないので
詳細設計の単純なものをつくってそこに肉付けさせるところから
やりました。
実装では、
コメントの付け方とか、コーディングスタイルの話とかしつつ。
単体の機能テストまでやらせて、できあがったらはい。乙という感じでしたね。
余裕のあるやつには、拡張して進数変換なんかもやらせました。
この課題で教えたかったのは、
・設計の大切さ
・コメントの書き方
・テストの大切さ
・スタック操作
・ポインタ
・CVSの使い方
でした。
時間はかかかったけど、意味はあったと思います。
# C++に変換させて、デザインパターンを教えようとしたところで
# 僕の時間切れが。。。。
ハートマン軍曹風に (スコア:2)
課題は何でもいいですが、軍曹風にやってみるとか。
わたしが訓練教官のハートマン先任軍曹である!
話しかけられたとき以外は口を開くな!
口でクソたれる前と後に“サー”と言え!
分かったか、ウジ虫ども!
ふざけるな! 大声だせ! タマ落としたか!
貴様ら雌豚どもが俺の訓練に生き残れたら各人が兵器となる!
戦争に祈りを捧げる死の司祭だ!
その日まではウジ虫だ!
地球上で最下等の生命体だ!
貴様らは人間ではない!
両生動物のクソをかき集めた値打ちしかない!
#5分で辞める人99%・・・
エレベーターの上下 (スコア:2, 興味深い)
1機だけでも、例えばどの階段もボタンが押されていない時はどこで停止しておくのが効率かを考えることができますし、 2機以上になるととたんに制御が難しくなります。
2台のエレベーターがお互いに逆方向に進行するのがベストですが、ほとんどのプログラマは同期しがちなアルゴリズムを書いてしまいます。
1階は他の階の人間が全員乗り降りする(例えば8階建てだと7階分の人間が乗り降りする)ことを注意してあげてください。
Re:エレベーターの上下 (スコア:2, おもしろおかしい)
アルゴリズムなんていらない (スコア:2)
実際業務で必要なのは、わかりやすい、バグが少ない、修正・仕様変更に強いプログラムです。
(特に最後が大事)
まずは簡単な課題を与え、途中から課題を修正し、最後に機能追加をする、
というステップで課題を与えることが大切だと思います。
#で、なにがいいかというとあんまり思いつかないんですがね
コード自身を出力するプログラム (スコア:2)
学生時代、schemeの課題だったと思うけど、自分自身(ソースコード)を出力するプログラムをかけ、という課題があった(ファイルの読み込みは×)。Cでも書いてみたけど、パズルチックでなかなか難しかった記憶が。
基本に忠実に (スコア:1, すばらしい洞察)
まずは文字数減らす苦労を知ってもらわないと。
#部長→上司の役員への週報が24文字以内だったかな。
Hacker's Delight から1問出す (スコア:1)
多分課題は1つじゃないですよね?
ならば、「大きくて難しいのをやる前に、流れをつかむために1問やってみよう」という形で、Hacker's Delight から1問か2問出すのはどうでしょう??
全部0の場合は 32 を返すのでOK。
この程度なら、考えるのに1時間もあれば十分(というか、1時間で思いつかないなら1日だろうが1週間だろうが思いつかない)でしょうし、コーディングも1時間もあれば十分でしょう(難しい事を考えなければ)。
fjの教祖様
brainf*ck (スコア:1)
brainf*ckのインタプリタはどうでしょうか
http://ja.wikipedia.org/wiki/Brainfuck [wikipedia.org]
Re:brainf*ck (スコア:2, 参考になる)
brainf*ckは,インタプリタよりコンパイラの方がいいかも。
(参考:http://ja.doukaku.org/80/nested/)
で,ただのコンパイラだと簡単すぎるので,最適化機能をつけさせて,mandelbrot.bf [uni-paderborn.de]の実行時間を競わせてみるとか。
開発中のものをデバッグさせる。 (スコア:1, 興味深い)
それに、デバッグ箇所について、それぞれ理由を説明させることで、理解度も分かると思います。
新人教育が、その職場環境に新人を適応させることであるならば、現場でありえそうにない課題をぶつけるよりも、普通に転がっている課題をぶつけるべきだと思います。
#本職でないのでAC。
Re:開発中のものをデバッグさせる。 (スコア:1, おもしろおかしい)
OJTの新人にコードを読ませていたら、受注元のSEの前で「先輩先輩、バグ見つけましたよ」と得意げに。
ただでさえバグ頻発して問題になりかかっていたシステムだったので、その後の修羅場は酷かった。
# 隣の島の出来事だったのでAC
パソコン上でのプログラミングなら (スコア:1)
アルゴリズムの勉強というより、プログラムの作法の
勉強が中心になってしまいますが、
出来の良いグラフィカルユーザーインターフェイスの
ライブラリのソースを与えて、色々と機能を拡張した
派生クラスを作って貰うとか。
どんな拡張をするかは、仕様書を与えてもよいし、
大雑把なお題だけで、仕様等ドキュメントも含めて
作成して貰ってもよいかな、レベル次第。
本当に出来が良ければ、ライブラリにマージしても
よいし、一生使う機会が無さそうな入力支援機能でも、
作りが確りしていれば、来年の教材のサンプルに使える
かも・・・って、ここ数年、私が教えるような新人なん
て配属されてないじゃん。
素数を求めるプログラム (スコア:1)
もちろん力業ではなく。
#そもそもアルゴリズムが見つかるかどうか
Re:素数を求めるプログラム (スコア:2)
素数を検証するプログラムならアルゴリズム思いつくんじゃないかなー。
シードは2^n-1で生成すればいいし、有効な多倍長数処理系が作りこめればそれはそれで面白いと思うし。
画像ファイルのダウンローダーとか (スコア:1)
いかがでしょうか.
ライブラリ無しで自分でソケット開いて,htmlパースして,URLをスタックに詰めたり.
プロトコルも含め,ネットワークに,文字列操作,データ構造の理解とか,一粒で何度もおいしいかも.
もちろん,肝心なモチベーションも(w
Re:画像ファイルのダウンローダーとか (スコア:2)
#散々悩んだ挙句、wget -rでほとんど片付いてしまった過去が...
#今は適当にperlで整理しながら落としt
spam嫌いなbeefeater
でも豚肉は好き
Re:早いもん勝ち (スコア:1, 興味深い)
そんなの教える人間がダメだからにきまってんだろ
新人になに期待してんだ?
興味を持たせるのも、自発性を持たせるのも、理解させるのも
2か月もやってできない人間を作った教育者をクビにしたほうがいいと思うが
#大卒とか関係あるの?
Re:早いもん勝ち (スコア:2)
新人の出来が悪いのは教え方が悪いからだ。
自分も、今年教えるまではそう思っていましたよ……
課題に対するソース見て意味不明だったので
「なんでこう書いたの?ここで何をしたかったの?」
「わかりません」
どうしろと……
その後は、徹底的に「なんで?」攻撃しましたが。
はてさて、身になっているかどうか。
Re:早いもん勝ち (スコア:2)
もう数年すると、会社でもそういう役回りが回ってくるんだろうなぁ……。
Re:早いもん勝ち (スコア:2)
当然、
「そのプログラムはいまこういうことをしているけど、
ここではこういう処理がしたいし、
たぶんこういうことをしたかったんだよね?
なら、どうすればいいと思う?」
ということは言いますよ。
ただ、回答として、自分には理解できないのですよ。
自分で作ったのに、自分で何をしたいか答えられないってのは。
Re:早いもん勝ち (スコア:4, 興味深い)
そんなのまだましで、世の中にはソケット通信でサーバにポインタを送信する強者もいるのですよ。
# サーバで Segmentation Fault が起きるんですけどなぜでしょうと言われて目が点になった。
たかが "Hello, World" されど… (スコア:3, すばらしい洞察)
"Hello, World" ひとつとっただけでも,これだけいろいろなパターンがある [gnu.org]くらいですから…
閏年を求める等、パターンがある物はパス
…と,斬って捨ててしまわなくてもいいような。
Re:これも?Re:早いもん勝ち (スコア:2, 興味深い)
整数 n
n を 99 から 10 まで 1 ずつ減らしながら,
| もし n%3=0 または n%10=3 または (n≧30 かつ n≦39) ならば
| | 「(゜∀゜)」を表示する
| を実行し,そうでなければ
| | n を表示する
| を実行する
を繰り返す
Re:早いもん勝ち (スコア:2)
else節を使わないでFizzBuzzをやれ
http://ja.doukaku.org/77/ [doukaku.org]
Re:言語処理系 (スコア:1, 参考になる)
まず、右隣の黒ヤギさんに、自分の設計した言語仕様を渡してコンパイラを作ってもらいます。
次に、左隣の白ヤギさんからもらった言語仕様を受け取ってコンパイラを作ります。
もちろん、先ほど黒ヤギさんに渡した自分が設計した言語で実装します。
そうそう、初めにぐるっと輪を描いて座っておくのを忘れずに。
研修が終わった頃には、きっと、みんな大切な何かを学んでくれること請け合いです。
フラグの反転では (スコア:2, 参考になる)
フラグの反転だと思います。実行するたびに 1 と -1 を切り替えます。以下のように書いてしまう人、結構いますよね。
個人的には、f = 1 - f で 0 と 1 を切り替える方が、技っぽいと思いますが。
Re:さんすう (スコア:2)
さらに,
…などのオプションを追加するとか。
Re:自分の場合は (スコア:2, おもしろおかしい)
メダカの学校ですね。
♪ソート覗いてみてごらん
ごめん。許して。