はてなキーワード: 離散数学とは
世の中にはプログラマー35歳定年説というものがあった。昔からそんなのはないという人と、あるという人がいた。40代も半ばになったときに「あぁ、これが35再定年説の根拠か」というものがなんかちらほら見えるようになってきたので書いてみようと思った。
世の中にはものすごいプログラマーというのはやっぱりいる。なんなら死ぬまでプログラミング書いていられるという人たちもいる(ブラック的な意味ではなく)。そんな彼らからしたらプログラマー35再定年説とか意味がわからない都市伝説にしか映らないだろう。
だが、普通に職業プログラマとして生きている俺のような人からすると、この35歳定年説はかなりの真実味を帯びている。
だが、そんな俺でも40代半ばまで延命できたのはやはり技術革新のおかげかもしれないが、結局平均寿命が伸びただけとも言えるだろう。
まず、技術に対する姿勢が変わる。正直言うとプログラミングとかもうしたくなくなる。というか、そもそも一生プログラミングを仕事にしたいと思う最初の頃は好きだと思っていたが、仕事にしてしばらく経ったら大して好きでもなかったな、と思うようになる。
大して好きでもないことを仕事にし続ける体力はやはり年とともになくなり、体力がなくなった分「自分が本質的にしたいと思うこと」が見えてくる。そしてそれはプログラミングではないため、ギャップがきつくなっていく。
おそらく、この辺が35歳くらいのあたりに来るのではないだろうか。35歳定年説と言ったら35歳ピッタリしか想像できないのが離散数学の世界で生きているプログラマらしいといえばらしいが。
そんな感じでやってても、20年もやればそれなりにスキルも身につく。さすがにGoogleの一線で働くような大天才たちと渡り合うことはできないが、もしかしたらGoogleの片隅で働ける程度のスキルはあるかもしれないが、正直もういいっす、っていう気持ちのほうが大きくなる。
次に、自分がどうにか身につけてきた知見というものがなかなか広まらない。コンセンサスが取れない、という状況にも苦しくなってくる。
自分がやってきたプロジェクトでこういうことをやったらうまく働いた、というような知見は共有するが、なかなか価値観が共有できないことに気がつく。若いうちは「だったら俺が全部やりますわ」くらいの気合を見せられたものだが、年を取ってくると「あ、そうですか・・・」となってしまう。純粋に体力も気力もなくなっていく。
プログラミングをやっているだけありみんな論理的な思考が大変上手だ。「皆さんホント論理的でいはりますなぁ」と言いたくなるわけだが、悲しいことに自分たちの振りかざす論理が、単なる正論、飛躍、極論、屁理屈、と言ったものであることに気づけない人も結構多い。こういうのを各個撃破するのも疲れる。
これからプログラミングを仕事にする人たちに言っておきたいことがある。もしこの世界で長く働きたい、定年までコード書いていたい、と思うなら、常に勉強をしなくてはならない。もしあなたがFラン出ているなら、他の人の倍努力しなくてはならない。できないならそこそこで転職したほうがいい。この世界にいるといかに若いうちの勉強が大事だったかを日々痛感する。
実務の上での俺の感じていることを書く。DDDだとかクリーンアーキテクチャだとかも大事だがもっとそれ以前に俺が根源的に重要だと考えているポイントだ。この辺をないがしろにしたらDDDもクリーンアーキテクチャも絶対に崩壊する。
まず、心得てほしいのはどんなにすごいプログラマでも意図の通じないコードは本当の意味で直せないということだ。
まず、引数チェック、状態チェックは必ずやれ。コードが語る、というようなことを言ってやらないやつが昔は多かったが、今もいるんだろうか。悲惨なバグやメンテナンス性の低下はそういった自分の意図の表明を横着したコードから起こり始める。「俺はこれをやる、だからこの機能を呼び出すならこういう状態にした上でこういう情報を渡せ、じゃないならやらない」とはっきり言え。もしこの辺を冗長だと考える同僚がいるならもう辞めたほうがいい。
引数チェックや状態チェックのコードで画面の半分が埋まったならそのコードは設計がおかしい。一旦手を止めてよく考えろ。一つの機能を動かすのにそんなに引数がいるのか、そんなにチェックする状態が多いのか、そしてそれらは本当に必要か検討しろ。
テストコードは絶対に書け。テストコードが書けない技術は絶対に使うな。意味のあるテストが書けないならやめたほうがいいという輩もいるが、とにかく意味があろうとなかろうと書け。引数にこれを入れたらこうなる、こういう状態でこういう事したらこうなる、というお前の意図はとにかく示せるだけ示せ。
だいたいこの辺を横着したやつは翌年酷く後悔するか、そこのメンテを担当した同僚を攻撃している。
コードが書けなくても大丈夫、という会社は、コードが書けたほうが有利な会社ではなく、本当にコードを書かない会社だというこは肝に銘じておけ。身につくスキルはEXCELの方眼紙を最低限の手数で作れるようになることか、本気でやればビジネスを理解できるかもしれないが、お前の技術者としてのキャリアはそこで止まる。
仮に憧れのスーパーハッカーがいる会社を目指しているとして、彼らがそこでどう働いているか、なにが泥臭いのかを想像できない、聞くことができないならやめておけ。浮かれ過ぎだ。
仮にGithubのURLを教えろという会社を目指しているとして、そこのリポジトリを飾り立てようと考えたならやめておけ、そういう会社はGithubにアウトプットすることを日常的な趣味として苦ではなくやり続けられる人を求めている。
年収をその会社の選択基準にしているならそこはおまえには分不相応な会社だからやめておけ。仮に入れたとしても馴染めることはまず無い。これは年収が低くても同じだ。
嫌いな人がいるならその会社はやめていい
コメントを観てこの「最小且つ単一の論理でなにか否定できた気になる」という輩への対処が一番疲れる
一晩立ってみたらこんなにブクマついててびっくりした。気になったブコメもあったのでちょっと追記しておく。
いきなり視点がミクロに、と言うやつなんだが、結局若いうちにこういうのできてないやつはあとで苦労するが、最初のうちは体力でカバーできている。体力でカバーできなくなったときに本当の意味でつけを払う羽目になるという意味で言ったり、あとオレみたいなおっさんが大変つらい思いをする、という意味でも言っている。
Fラン関係なくねっていうやつだが、昭和世代のステレオタイプかもしれない、ごめん。勉強する習慣もなければ大してやってきてもいないやつはこの業界だと倍苦労する羽目になるというふうに言いたかったと思う。どんな業界でもそうだとは思うが。
返す刀で結論づけしたがる人々がやっぱり現れるな、君たちはそう思わない人なんだろうし議論する気もないが何かしら言いたい人なんだろう。別にそれはそれでいいよ。お仕事頑張ってね。
「俺は大して辛くないけどなー」っていう人もやっぱり現れるな。辛くないんだったらいいことだと思う、お仕事頑張ってね。
4Kモニターでものすごく細かい文字を読んでいる若者を見た、という人、俺も同意する。もう見ていられないんだよね。
関白宣言っぽいな、というのは俺も思った。
結局の所、プログラマ35歳定年説は俺も打ち破りたいと思っていた口なんだが、打ち破れる人とそうでない人がいる、ということで、俺は後者だった、ということだ。当然50過ぎてもプログラマやっている人は見かけるので、数学的な真理というわけではなく、統計的な傾向なんだろうと思っている。
若いうちから、いい環境で働かないと、気持ちのほうがどこかで先にギブアップする。いくら大好きで転職だと思う仕事だとしても、体力や若さで捻じ曲げていることはなかなか気づかない。色んな本を読んで客観的な指標で判断したほうがいい。
遺言とか言って書いておいて追記したら俺はソンビか亡霊なんだろうか?
びっくりした。こんなおっさんの愚痴みたいなエントリーがこんなにブクマされるとは思ってなかった。いくつか気になったブコメがあったのでやはり書いてみたくなったので書く。
まず、この遺言を最後にいなくなるのかという話だが、おそらくいなくなる。ゾンビで居続ける体力ももはやない。
次の準備はすでにしている。それは俺が本質的にやりたかったことに近いことだと思うのをピックアップしている。
本質的にやりたかったことって何かという話なんだが、まず俺が感じるプログラマーという仕事は「良き作り手であり続けること」が根本的なモラルだと思っている。若手で右も左もわからないような状態でも、それこそやっとフィズバズが理解できたような状況でも今持っているレベルで最大限にできうる一番いいものを模索し続ける仕事だと思っている。初心者にはチェックコード書け、意図はできるだけ込めろというのはそういう意味でもある。これを真正面から受け止めてくれる職場を探したほうがいいというのは追加しておきたい。
プログラム論とかそういう話がしたいんじゃないということだけは言っておく。
俺も体力があるうちは良きつくり手を目指していたのだが、本質的にやりたいこと、もうちょっと言うなら、俺のモラルの軸は作ることにではなく使うことにあった。プログラミングというアクティビティを挟んでこっちにつくり手がいてあっちに使い手がいる。仕組みを理解して作るのがプログラマーなら、作ったプログラムを理解してよりよい日常を模索するのが使い手、と言ってもいいかもしれない。いいフィードバックループのあっちとこっち、と言ってもいいかもしれない。俺は「良き作りてが使ったものを使う良き使い手でいたい」ということに気づいたので、遺言を書くことにした。少なくともこれに気づいた時点でプログラマーとしての俺は死んだ。
まだ直感的なものでしか無いので、うまく言語化できていないのは申し訳ないんだが、今後10年位はそれを模索していくのではないだろうか。
お前は浅学非才無能怠惰であるが、親の教育の賜物で国立大学に入れた。
しかしデータサイエンティストになりたいなどと夢を見たせいでお前のスキルはボロボロである。まず、お前の学部で学ぶ、経済学であるが、経済学はマクロ経済学もミクロ経済学もテスト問題を解けるようにしただけで本質は掴めず、データサイエンスに少しでも近づこうと取った計量経済学の講義はコーディングのテストは余裕でクリアしたが、面接で理論を答えられず落単した。
プログラミングは学部のまわりのやつらよりは多少できたが、それでも1番ではなく、当然外の世界を見れば、底辺もいいところである。
肝心の機械学習についてであるが、情報学部のパターン認識の講義をとったものの、ただコードが動くように書き、手書きの数字を識別できるようになっただけで、SVMの理論的背景もNNがなんたるかということも理解できぬまま、C評価の単位がきたのみである。
かといって努力せず、まわりの人と交流することもなければ、無理やり実績を作ってインターンに行くようなこともしなかった。
よくて数行のコードとGoogle Analyticsを使う程度の仕事しかできないお前はそうして雪かきをして一生を終えるだろう
学部1, 2年でやること。
3, 4年からはロボットとか人工知能みたいに専門を決めていくらしい。
日本の情報系も変わらないのかな?まあ、あんまり知らないけど。
以下そのリンク。
そのslideshareの人はただのgiftedなのでもう少し他のを参考にした方がいいと思う。
機械学習に興味を持ってビショップ本に行くのもあまりお勧めできない。
過剰にベイジアンだし実際問題あそこまで徹底的にベイズにする必要は無いことも多いから。
よく知らんけどMRIとかの方面もだいぶ魑魅魍魎なので(DTIとか微分幾何学的な話がモリモリ出てくる)、
近づくなら覚悟と見通しを持ってやった方がいいんじゃないかなあという気はする。
オライリーの本は読んだことないけど悪くなさそう。「わかパタ」とか「続パタ」とかは定番でよい。
ビッグデータがどうとか世間では言ってるけど、データのビッグさはあんま気にしなくていいと思う。
ビッグデータを処理するためのインフラ技術というものはあるけど、数理的な手法としては別に大して変わらない。
(オンライン学習とか分散学習とかの手法はあるけど、わざわざそっち方面に行く意味も無いと思う。
超大規模遺伝子データベースからパターン検出したい、とかだとその辺が必要かもしれないけど…)
数学については、線形代数は本当に全ての基礎なのでやはり分かっておくとよい。
「キーポイント線形代数」とか「なっとくする行列・ベクトル」とか、他にも色々わかりやすいいい本がある。
(まあ固有値と固有ベクトルが計算できて計量線形空間のイメージがわかって行列式とかトレースとかにまつわる計算が手に馴染むくらい。ジョルダン標準形とかは別にいらん)
プログラミングはそのくらいやってるならそれでいいんじゃないか、という気はする。行列演算が入る適当なアルゴリズム(カルマンフィルタとか)が書けるくらいか。かく言う俺もあまり人の事は言えないけど。
処理をなるべく簡潔かつ構造的に関数に分割したり、抽象化して(同じ処理をする)異なるアルゴリズムに対するインターフェースを共通化したりとかのプログラミング技術的なところも意識できるとなおよい。
ggplot2は独自の世界観ですげえ構造化してあるんだけどやりすぎてて逆に使いづらい…と俺は思う…。
遺伝子のネットワークとかなんかそれ系の話をし出すと離散数学的なアルゴリズムが必要になってきて一気に辛くなるが、必要性を感じるまでは無視かなあ。
プログラミングの学習は向き不向きが本当に強烈で、個々人の脳の傾向によってどうしたらいいかが結構異なる気がしてる。
向いてるなら割とホイホイ書けるようになっちゃうし、向いてないなら(俺もだけど)試行錯誤が必要になる。
まあせいぜい頑張りましょう。
Web開発などをやっており,文系で修士を出てから就職,最近放送大学に在籍しています.
実際その状況で学位が役に立つのかはわからないので,実践面でコメントします.
基本的には,各技術を支えるメカニズムや,根本にある理論,数学などが大学で学べる特有の内容だと思います.
例えば,離散数学,計算論,アルゴリズムとデータ構造,プログラミング言語論,オペレーティング・システム,リレーショナル・データベースなど.
これらは,具体的に役に立つかというと,例えば深いレベルのチューニングなどでは必要になると思います.内部の構造が影響してくるので.
また,技術,特に新しく出てきたものを素早く理解するためには,体系的に例えば「データベース技術とはこういうものだ」という概念があると非常に役に立ちます.
なので
>トレンド技術を習得しにくくなることは、デメリットが大きいのではと感じる。
また,ソフトウェア工学に関する科目は,意外に大学特有の知識が多いです.
具体的に何が学べるかは,カリキュラムやシラバスが参考になります.逆に見ないと何もわかりません.
基本的には通信制の大学では,時間割はありません.スクーリングは別ですが.
なので,「毎週時間を作って〜〜する」というのは,最終的にはかなりモチベーションを減らしてしまうと思います.
いわゆる一流大学を出た人でも,大学では試験前のみ勉強するなど,気を抜いています.
ちゃんと勉強したいものはいくら勉強しても足りませんが(だから研究というものがあります),
下手に気負いしないで楽にやれば,そんなに大きな負担にはならないと思います.
例えば仕事で半年忙しいことが確定したなら,履修をしなければ良い話です.
基本的には「論理的にものを考えられる」ようにとられがちですが,
専門分野以外のことについては一気に瓦解する人も多いです.
敢えて言うなら,大学を出た後の環境の違いも大きいと思います.
大学を出てストレートに上場企業に入った方は,ずっと頭をつかう立場に配属される場合があります.
そのため,頭を使うこと自体に経験があり,慣れています.そうでない場合ももちろん多いのですが.
今の状況を活かして頭を使っていけば,大学を出なくても十分知性のある人間として尊敬されると思います.
恐らく,私の見立てでは大学を出てもあまり変わらないと思います.
しかし,今そういう思いがあるなら,やってみてはいかがでしょうか.
若く無いと大学に入れないということはないので.
ドットインストールなりrailsのチュートリアルなり、golangなりやって見るんだ。
そうやってブートストラップしていくとどう情報を掴んでいけば良いか分かるようになってくる。
とりあえず学部3年なら簡単なTODOリスト管理アプリを作れるぐらいでバイトも普通に見つかるだろう。
それが難しければ、パソコンのサポートなら出来るだろう。なんでも良いからやらせて貰え。
数学は最低、離散数学でブール代数はきちんと練習すること。あと集合。
ハード系だと
の辺りを意識的に取り組んで欲しい。
その他は、
あたりを読んで、分からないところを先生や詳しい同級生に聞く。
あと、5000万行ぐらいのテキストファイルで、マージソートをUNIXのコマンドでやってみるとかお勧め。
ただし、そうやっていく中で、もし「楽しい」と思えない時間が3ヶ月〜半年なり続くようであれば、
適性を求めて (例えば) 経済学部などに行くが良かろう。
あのさ、偏微分とか、少なくとも理系学部の1年生レベルの話なわけ。
そのレベルの勉強が出来ないやつが理系の博士課程に行こうということ自体が無駄。
そもそも学習能力が低すぎるとしか言いようがない。総合能力とか言うレベルの話じゃない。
そのレベルも理解出来ない人間がまともに議論出来るわけがない。
そんな奴が書いた論文を通す教官の気がしれない(まあ、今の時代、修士どころか博士すら
研究分野に残らないなら面倒だから適当でも出してしまう事もあるみたいだけども。)
この並びで、"グラフ"ってなんだ?アホか?信じられん。
こんなやつが最大の無駄なんだ。
現在、某国立大で修士課程の2年生でFPGAの研究をやってます。
就職は、東証一部のB to Bの産業計測機器メーカーに決まりました。
こんな私ですが、2年前までは理学部生物学科でピペット片手に植物を育てていました。
はじめは、学部3年の時、多くの生物学科の学生たちと同じように、生物学科で勉強をし怠惰な大学生活を送っていました。
生物系の就職がヤバイと気付いたのは、3年生の夏の合同説明会の時。
「去年には一人いた。化学の人に混じってとても優秀だったよ。」
「生物系は。。。。」
どうも回答が煮え切らない。
電機メーカーでは、あまり良い答えが聞けないし、食品メーカーでは「採用は毎年あるよ。」と言ってくれるのだが
倍率が高いことは話に聞いて良く知っていた。
そもそも、理系向け合同説明会となっていても、
少し広げて情報系と化学系ということが何度も説明会に行くうちに透けて見えてきていた。
文系就職という手もあったのだが、やはり技術職で仕事に就きたかったこともあり
ちょうど、2ちゃんで専攻ロンダ関連のスレッドが出てきていたこともあり、専攻ロンダという方法を知り
もちろん、まったく違う専攻に切り替えるということに対して不安は大きかったが
思い切ってみることにした。
3年の秋から専攻ロンダに比較的、入試科目が少ない独立研究科の大学院を中心に回った。
研究室のホームページからメールを送り、教授にアポを取り見学させてもらう。
JAISTやNAISTは他大生向けへの講義があり、専攻ロンダにやさしいらしい。
院試の問題は大学の購買でしか買うことができない場合が多く、自分の受けた大学もそうであった。
院試の勉強は3年の2月から始めて、6月の受験までに間に合わせた。
その結果、NAIST落ち、JAIST合格、旧帝大の独立研究科(情報系)合格という結果だった。
キャンパスゼミで基礎をおさらいしてマグロウヒル大学演習で応用問題を詰める。
マグロウヒル大学演習シリーズは良書で、勉強したことが無い科目でも読めばわかるようになっている。
専門科目についてであるが、離散数学はマグロウヒル大学演習で勉強する。
あともう一つの専門科目であるが、電気回路や電子回路は等価回路など一人では理解できない点が多く、パスし
そして、合格発表に番号を見つけた。
入学後は、FPGAの研究室に入り、朝から晩までコードと「VHDLによるハードウェア設計入門」の本に
向き合いコードを書く日々が続く。
最初は、学部生よりもプログラミングが分からず苦労するが3か月も必死になるうちに書けるようになってくる。
就職活動では、ハードウェア記述言語やっているというと、バイオの時とは反応が違う。
もちろん、面接では「どうして専門を変えたのか」
と聞かれるのだが、「生物について知るうちにそれを工学的に応用することに興味をもった」
で乗り切る。
不況であったが、エントリーシート20枚、面接7社ほどで内定が出た。
NAISTとか、JAISTとか、九工大の生命体工学とか、専門を最初から教えるシステムがあるらしいし
俺よりも苦労しなくて済むと思う。
もちろん、苦労はするのだが苦労が報われないピペドよりもぜんぜんマシ。
生物系の奴に限らず、数学科とか理論物理やってるやつとか数学センスはすぐれてるだろうし特にお勧めしておく。
不況なんだし、生き残りのために多くの手段を考え
手順を考えて、その手順を書くだけ。
言語もあらかじめ決められた手順に沿って解析されて実行されるから、オートマトンやBNF記法、構文木などの仕組みを一通り覚えてどういう機構でチューリングマシンが原理的に実行可能なコードへと落とされるかを理解すれば言語自体も覚えるのなんてそんなに難しくない。
手順を考えるなんて、人間が生活する上でいつもやっていること。
プログラムを走らせるためのデータ構造を考えるのに苦労するという話も聞くけど、プリミティブな要素が数値、型へのリファレンス値しかないんだから大体は離散数学で使うグラフの初歩的な知識があれば事足りる。GoFのデザインパターンなんてまさにそう。
programmingとは、「pro(前もって) + gram(理論を) + -ing(書いておく)」
UIを組んでいて、細かい動作をifの嵐で書き連ねていても事前に起こる事に対して記述をしているのだからプログラミングだし、
何かを自動で処理するソフトウェアを書いても「programの塊」なんだから、結局プログラミングになる。
そこに、勉強不足がどの程度あるかは関係がない。
それにプログラムが好きな人と言っても既存の知識だけで満足してモノをリリースし続けている人かもしれないし、
最新の離散数学の研究結果を見るだけで具体的なコーディングは殆どしない人かもしれない。
好きな様にやったらいいよ。
書いてあるし。離散数学。
数学と看做されてない?
数学でもあり計算機科学(CS)でもあるとも見做しているけど。
余談だけど世の中には専門に拘る人がいて自分と異なる専門を攻撃する人もいる。
転科を勧めたり、学際領域とか聞こえはいいけど理解がないと袋叩きに合う。
基礎体力を養う意味ではここら辺がいいと思うんですがどうでしょう。
これがわかるとCLRやJVMのインフラ部分もわかりますし、組み込み方面にも強くなります。
C++はマルチパラダイム言語であり、これをひとつやれば構造化プログラミングとオブジェクト指向プログラミングの両方がわかります。
C++はCのほぼ上位互換言語ですので(正しくはC99が制定されるまでは)、プレーンなCしかやらない理由はありません。
嫌なとこも多くある言語で(どうしてEffective C++シリーズやExceptional C++シリーズみたいな書籍が多くでてるか考えるといいよ)、メモリ管理も手動ですが(これは半分嘘。RAIIがあるから半分自動。GCがないから半分手動)、逆に細かいとこに気を配る態度を養うには最適です。
Erlangで並列プログラミングをやるのもいいかもしれません。
Common LispかSchemeで怪しい(でも美しい)世界を爆走するのもいいかもしれません。
これだけやっとけばC#やJava、軽量言語の類はあっさりと料理できるでしょう。
あくまでもプログラミング言語についてはですからね。