カレーなる辛口Javaな転職日記 RSSフィード

2015年 02/01

プログラミングが簡単に見えるのは,それはまだ言語学習の第1フェーズしか知らないから

本日の釣り堀.

プログラムって難しいとか、上達しないとか言ってる人をよく見かけるけど、こんなもんどこが難しいのか理解できない。

どんな言語でも基本的にやることは変わらないし、構文さえ理解できれば後は理解云々というよりは、どう構築するかという話になるわけでそこに言語への難しさなどは無いと思う。ほとんどのプログラマは細かいアーキテクトまでを隅々まで理解している必要はないしハードルもむちゃくちゃ低い。

スマートな書き方ができないというのであれば、事細かにコメントを残せば良いだけだ。なによりプログラム上をデータがどのように動くか、そちらのほうが大事だ。こんなもん習得できないやつは向いてないと思う。というか知能レベル低すぎ。

本気でそう思ってるんなら匿名ダイアリーじゃなくて自分のブログで書けや.匿名に逃げてるのは,自分でも本気でそう思ってないからだろ?

あと「どんな言語でも」って具体的に幾つの言語をやったの?実はJavaC#VB.net,或いはPHPを触っただけで,世界を知ったつもりなんて勘弁な.*1

「アーキテクトまで理解している必要は無い」って書いてるけど,そこは設計なので「アーキテクチャ(architecture)」だな.「アーキテクト(architect)」だと「設計者」になる.事細かにコメントを遺したところで糞設計や糞コードが救われることはない.

そして日記を削除して逃亡か.どうやら図星だった模様.匿名ダイアリーで良かったな.


「Effective Ruby」のイントロダクションより

Effective Ruby

Effective Ruby

新しいプログラミング言語の学習は,通常2フェーズで進む.第1フェーズで,言語の構文や構造を学ぶことに時間を費やす.このフェーズは,新しいプログラミング言語を学んだ経験があれば短期間で終わることが多い.Rubyの場合,構文は,ほかのオブジェクト指向言語の経験がある人にはとてもなじみやすい.言語の構造(構文からどのようにプログラムを組み立てていくか)も,ベテランのプログラマにはおなじみだろう.

それに対し,第2フェーズには少し時間がかかる.このフェーズでは,言語を深く掘り下げ,イディオムを学ぶ.ほとんどの言語は,よく見られる問題を解決するための独特の方法を持っており,Rubyもその例外ではない.たとえば,Rubyは明示的なループではなく,イテレータパターンとブロックの組み合わせを使う.危険を避けながら「Rubyのやり方」で問題を解決する方法を学ぶのがこの段階だ.

この匿名氏は,短期間で終わる第1フェーズを終わっただけで,時間のかかる第2フェーズまで進んでない.しかもこれは「言語学習」の第1フェーズであって,初級プログラマーになるまでだけでも,まだまだ他に学ばなければならないことがあるのだ.


  • id:qtamaki 難しさを理解出来るところまで達していないSI系の中堅PGに多い考え方

だいたいそんな感じだと思う.

こういうこと言ってる奴は,あまりに無知すぎて自分が無知であることにさえ,まだ気付いてないだけ.*2

プログラマが知るべき97のこと

プログラマが知るべき97のこと

まずは手始めに「プログラマが知るべき97のこと」を読んで,どういう視点を持つべきかから始めてもらいたい.


たとえばJavaを例にとって考えると,

「やさしいJava」レベルなら,こういう馬鹿でもすぐに到達できる.

「プログラミング言語Java」くらいになると,既に壁にぶつかる人も出てくる.(上記の言語学習の第1フェーズ.)

そして,こういう人は「Effective Java」を理解できないどころか,読んだことさえないかもしれない.(上記の言語学習の第2フェーズ.)

EFFECTIVE JAVA 第2版 (The Java Series)

EFFECTIVE JAVA 第2版 (The Java Series)

Effective Java (3rd Edition)

Effective Java (3rd Edition)


そして,たとえば「EffectiveJava」と「Effective JavaScript」と「Effective C++」を読み比べたことはないと断言できる.もし読み比べていたら,「どんな言語でも同じ」だなどと,絶対に言うはずがないから.

JavaScript Ninjaの極意

JavaScript Ninjaの極意

Effective C++ 第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTI)

Effective C++ 第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTI)

*3

Effective Objective-C 2.0

Effective Objective-C 2.0

Effective Perl 第2版

Effective Perl 第2版

*4

Perlベストプラクティス

Perlベストプラクティス

「Effective Ruby」というのもあるんだな.まだ見てないけど.*5

Effective Ruby

Effective Ruby

そして「Effective Python」も...

http://www.oreilly.co.jp/books/9784873117560/

Effective C# 4.0

Effective C# 4.0

More Effective C#

More Effective C#

少し経路が違う 毛色が違うけど,こんなのもある.

タイトルが違うので分かり難いが,その和訳がコッチ.

追記

Effective SQL

Effective SQL


しかしEffective PHPというのはないのか.やはりバッドノウハウの塊だからかな.

Modern PHP: New Features and Good Practices

Modern PHP: New Features and Good Practices

こういうのならあった."Good Practices"とは書いても,"Best Practice"とは書かないのか.


言語の違いについては刃物の例えが良いだろう.たとえば包丁でも洋包丁と和包丁と中華包丁では,形も使い方も異なる.和包丁でも菜切り包丁と刺身包丁と出刃包丁では用途も使い方も異なる.*6それぞれに合わせた使い方ができて,ようやく一人前の料理人になれる.

そして「刃物」という視点で見ると,それら包丁というのはその一部でしかない.世の中にはカッターナイフやハサミやノコギリ(木工用両刃ノコギリ,糸鋸,回し引き鋸,金属用鋸.はてはチェーンソーや(電動)丸鋸なども),彫刻刀,斧に鉞,鉈,さらには日本刀/太刀など,さまざまな刃物が存在する.どれを使っても紙を切るくらいならできるかもしれないが,それではそれらの刃物を使いこなしているとはいえないだろう.

この匿名氏のように「どの言語でも同じ」と言ってるのは,刃物の特製を全く理解せずに木工用ノコギリで刺身を作ったり,斧で芋の皮むきをしたり,出刃包丁で薪割りをしたりするような物だよ.


さて,そういう言語レベルの学習に加えて,アルゴリズムとデータ構造とかデザインパターンとか,1万行以上の実用レベルのコードを,十分な可読性,メンテナンス性,拡張性,テスト可能性等々を維持した状態で書けるようになって,ようやく初心者プログラマーになれる.たぶんこの匿名氏は,まだその出発点にさえ達していない.

アルゴリズムクイックリファレンス

アルゴリズムクイックリファレンス

そしてその先には,たとえば並列/平行プログラミングや分散システムのような,さらに難易度の高いプログラミングの世界が横たわっている.

この匿名氏にとってそれは,想像を絶するものなのだろう.


http://anond.hatelabo.jp/20150131105001

C++のテンプレートライブラリの実装を俺に教えてくれ。

boost graphとか、実装どころか使おうとするだけで意味不明すぎて挫折したんだ。

http://anond.hatelabo.jp/20150131154439

この程度で思考が止まるような人間ばかりがそのへんにゴロゴロいたりするから、

クズみたいなプロダクトと、その尻拭いをするプログラマだけが取り残されるんだよなあ。

激しく同意...orz

http://b.hatena.ne.jp/entry/anond.hatelabo.jp/20150131090608

  • id:karumado わかった!貴殿の力でみ◯ほのプロジェクトを救ってくれ!!

せやなw


  • id:qtamaki 難しさを理解出来るところまで達していないSI系の中堅PGに多い考え方
  • id:ms6145vv 「うこけばいい」だけの要件で生み出されたクソコードを保守させたい。
  • id:naoya2k こういう人たちに「簡単に実装できるじゃん」って思わせるところまで問題を分割したり全体の設計をするところが難しいんですけど
  • id:ka-ka_xyz "プログラムの難しさ"って一言でいわれても、言語レベルの話から、拡張性やメンテナンス性まで踏まえた設計の話まで色々とある訳で。なんつーかこー、懐かしい。これが若さか。
  • id:vamview チャールズ・ダーウィンは『熟知よりも無知の方が自信の源になる』と語っています。このように正確な自己評価が欠如していること、つまり未熟でありながらそれに気づいていないことを『二次無能力』と呼びます。
  • id:a2ikm 文法や標準ライブラリの使い方さえわかっていればなんでもできると思っていた時期が僕にもありました…

  • id:takhasegawa ブログラマじゃない人向けに言うと、大工「家建てるのなんて簡単。木を切って釘を打つだけじゃないか」小説家「小説書くのなんて簡単。日本語の文法で文字を書くだけだろ」みたいな話。難しさの本質はそこじゃない

まともな小説家や大工なら,それが問題の本質でないことを理解している.だからそういう風な形で「簡単じゃないか」とは言わないはず.


  • id:northlight 某銀行の話はプログラミングの問題じゃないだろうに…

半分正しいけど,でもねえ.

言語の違いが問題の一つだから.匿名氏の主張のように「どの言語でも同じ」なら,COBOLでもJavaと同程度の保守性が実現できるはず.しかしこの匿名氏の描いた未来は,JavaでもCOBOLと同程度の保守性にまで貶めるものだ.

twitter


でもおそらくコンピューターサイエンスの専門教育は受けてない.専門教育を受けているにしては無知すぎる.文系学部出身かもしれない.それこそ文学部や経済学部を出て2〜3年超入門レベルのプログラミングを囓っただけで,「俺スゲー」と勘違いしちゃった残念な人かも.

*1

7つの言語 7つの世界

7つの言語 7つの世界

7つのデータベース 7つの世界

7つのデータベース 7つの世界

*2:「スゲー天才であらゆる言語をたやすくマスターした」という可能性はまずない.天才なら,各言語の違いを理解し,各言語ごとに異なるコーディングの注意点を列挙してくれることだろう.

*3:「C++ の必読本は簡単にいえば C++ in-Depth シリーズ全部なのですが、それはプログラミング言語的に普通のことではなく、 C++ がおかしい、ということは忘れてはいけないと思います。」 http://d.hatena.ne.jp/JavaBlack/20101128/p1

*4

*5Kindle板があるのか....今すぐポチろうかな?

*6:それ以外にも何十種類(以上?)もの和包丁が存在するらしいが,素人レベルならこの三つくらいで十分だろう.