はてなキーワード: メソッドとは
世の中には「新しもの好きな人」と「ほどほどに流行を気にする人」と「流行に無頓着、我が道を行く」人がいる。
自ら流行を周りに発信するほどの新しもの好きを「Aグループ」、
ほどほどに流行気にするが、そんなに熱心に新しものを追いかけない人を「Cグループ」、
Aグループが人口の5%、Bグループが15%、Cグループが60%、Dグループが15%、Eグループが5%、
そんな感じだろうか?
民間企業が新商品を売り込む場合、基本的に「AグループBグループCグループを相手にすればいい」。
DグループEグループは高い宣伝費用掛けても買ってくれないし、
その宣伝費用をABCグループに投入して、リピーター、ロイヤルカスタマーに育てた方がはるかに売上は上がる。
極端な話、DグループEグループは「捨ててしまってかまわない」存在であり、民間企業はABCグループを大切にすればいい。
特に流行の発火点のAグループ(アルファブロガーなど)は重要で、企業はカネ払ってでもAグループを抱き込みにかかる。
つまるところ、民間広告は、基本的にABCグループへいかに情報を伝えるか?が勝負。
最近のネットSNS社会では、Aグループを発火点にして仕掛ける宣伝手法が進化している。
ところが、行政の啓蒙広告は、情報強者のAグループやBグループへの宣伝は意味がない。
なぜなら、AグループBグループは、情報の内容を既に知っているから。
行政啓蒙の主旨は、「リテラシー低く情報弱者なCDEグループにこそ、伝えなければならない。」という点。
つまり民間企業広告とは真逆であり、民間企業広告のメソッドは通用しない。
特にEグループの人は「自分の思い込みが激しい」「行政の広告にわざと逆らおうとする」という、
極めて「あまのじゃく」な人種の塊。
電通博報堂などは、ABCグループへの宣伝などは極めて上手だが、その手法は行政啓蒙広告には全く通用しない。
しかし行政が啓蒙広告する場合、信用と実績の電通博報堂が選ばれる。だから行政啓蒙広告は失敗する。
女性手帳が果たしてCDEグループ啓蒙に有効なツールなのか、「啓蒙工学」の真価が問われる
「こんなこと、女性なら誰でも知っている、今更女性手帳などで啓発するなんて、女性をバカにしているのか?」
と反発しているのだろう。
A・Bグループの人は、
「リテラシーボトムな人、情報弱者な人に対してこそ、情報を正しく届けなければならない、という
そしたらなんか、やんわりと釘を差された。君のは「お遊び」なんでしょ?はしゃぐのもいいけどちゃんとセクマイの人について思案したほうがいいんじゃない?
しかも論法が自分の気に食わない言動を抑圧するために一見反対できない人を持ってくるっていう「前線の兵隊さんを思え」メソッド。
そいつリベラルでもなんでもないよ。ただのジェンダー固定思考 (ただし自分から見てかわいそうなひとは除く) じゃん。こういうやつは「マイノリティーに理解あるワタシ素敵(キラリン」ていう思考だから無視しとけ。
それにしても、
後悔しないよう自分の好きのことしろよ。30まであっという間だし、30前後になると肌のつやはなくなるし髪の毛は薄くなるしでしたい格好もできなくなるぞ。
過去の輝かしい実績についてはこちら参照。
そのかっこいいigiさん、最近はてなについての言及が多いんだけど
https://twitter.com/igi/status/328537144320749568
最近ちょいちょい出てきてたからなんとなく今後のはてな界隈について予想として新たに思うことが出来て。限界集落的になって団塊Jr.世代の再生産限界地点に到達しているのが今なワケだけど(だから増田がああなる)、数年後は中年化として何かに対するエネルギーの出力が下がるだろうなとは読んでる
https://twitter.com/igi/status/305125534726225920
ブコメとか文章の中に「ネオテニー」って単語があるかなーと思って待ってたんだけど、待てど暮らせど出てこず。お前ら不勉強すぎだ。他にも「ニューエイジ思想」とかはてな村大好きそうなのにあんま出てこねーし(ブツブツ
https://twitter.com/igi/statuses/317620213560512512
増田はいい線いってるけど、75点止まりなんで、分析は出来ても解法にまでたどり着けてないから、また同じ事を繰り返すんだろうなってのは容易に予想出来るんであって。オタク的なナルシズムとエゴでいけばそりゃそのあたりがおそらく限界だろうと。
一部取り上げたけど、まあいっつもはてながどうのとか増田がどうのみたいなこと言ってる。
site:twitter.com/igi はてな - Google 検索
はてなで言えばいいのに。
怖いの?
ていうかこんなの見つけた
https://twitter.com/igi/status/322142425898430464
増田に書こうかと思ったが週末事務所ぶっこまれると多分めんどっちくなってやんねー気がする。というかそもそも宣言するとやらない率が跳ね上がるのでエッセンスだけ抜くか。
増田に書こっかなー|д゚)チラッ|д゚)チラッ
何がしたいの
また言ってる
まあ山本ってホラ吹き中傷クズ野郎であり続けてることは一貫して変わってないのに、ガキができて妙に分別のついてきた自分もアピールしようとしてるところが
最高にいやらしいよね。
それで山本の罵詈雑言ヘイト記事を毎日楽しく消費している知恵遅れの信者がそういう記事を見て「隊長も丸くなったなあ」とかいうわけw
まあ山本のガキがでかくなった時にちゃんと親父の悪行をネットで確認できるようにきっちりアーカイブ活動はしていかないといけないよね。
(こういうこと書くとゲスだの品性がないだの噴き上がる馬鹿が湧くんだよねえ。これってやまもと信者的なネットユーザーが憎んでる「DQNがたまにいいことすると褒められる」メソッドの逆パターンだよね)
公私ともにアイデアマンと認めるこの俺が創造力を発揮する秘訣はというと何と言ってもある1つの心構えにあると思う。
だいたい創造性開発といえば好きを貫けってことと、インプットとアウトプットを増やせってこと、それからKJ法に始まる発想法を身につけろと、そういうことしか言わない。これでは本当の創造力はつかない。
『スーパーIT高校生"Tehu"と考える 創造力のつくり方』も何か新しいことが書かれているかなと思ったけど特に書かれてなかった。ってか創造力について記述がほとんど無いだろこの本。
その心構えとは、これ「新鮮さを貫け」である。
だいたい気付かないといけないよ。好きを貫くことによる視野の拡大ってのは実はその裏で視野の固定化も孕んでいることに。
俺は世の中で素晴らしいとされているあらゆることが好きになれなかった。好きを貫けとか糞くらえと思っていた。だからこそ「新しさに目を向ける」ことに気付けたのだろう。
新しさに目を向ける、という発想こそが創造力開発の妙薬なのだ。
暮らしのなかで積極的に新しさを見つけようとする。そのためには予想を立てることが不可欠である。予想を立てて現実と照合する結果、違いに気づき驚きが生まれる。
君は新しさに驚く日々を過ごしていますか?新しさは心の栄養ですよ。予想を立てないから違いに気付けずありきたりの日常に見えてしまう。
それから好きを貫いたり1つの目的や目標のために身を粉にしたりすると一気に新しさが見えなくなってしまう。もっと柔軟にならないといけない。
音楽を聴く時もみんな「イイ曲」を探そうとするんだよ。それが駄目。イイ曲ってのは自分の既存のモノサシでイイ曲ってこと。それでは視野が広がらない。
そうじゃなく「新しい曲」を探そう。本当に「イイ曲」なんて1000曲に一曲で、そのためにせっせとCD買いまくるのはご苦労なこったとしか言いようがない。馬鹿である。一種のギャンブル中毒、スロット馬鹿と同じ。
そうじゃなく「新しい曲」を探そう。「新しい曲」であれば50曲に一曲はそういう曲が見つかる。新しさが無いかなと注意深く聴いていれば5曲に一曲はそういう曲が見つかる。
そうやってどんどん新しい感覚を心に取り込んで味わっている人と、固定したモノサシで「イイ曲」ばかり追い求めているとでは、心の豊かさに雲泥の差が生まれるのは言うまでもねえことだ。
facebookにも「イイネ!」ボタンがあるがあれは「新しい」の意味で用いるべきなんだ。「良い」の意味で使うと心が狭くなる。評論家気取りで良い悪いを判定しているとまたたく間に心が死んでしまう。
少しでも新しい部分がないか耳を澄ませて生活しないと。パクリって言葉を多用する人間も危ない。あいつらは新しいものまでパクリ認定してる。
あれもパクリこれもパクリと連呼してる人間がさあ自分が作り手側に回ったとき何も出来なくなる。自分の首を絞めちゃってる。だから新しさに鈍感なヤローは何も作れないんだ。
これまで話を聞いてこう思った人もいるだろう。新しさだって1つのモノサシに過ぎないからそれに拘るのは視野を狭くするんじゃない?現代アートも新しさに拘って珍妙な方向へと迷走してるように見えると。
それはある意味正しいように見えるが現実には新しさを追及していけば1つの新しさだけでなく色んな新しさを求めるようになるから狭い視野に陥ることはない。
現代アートと言ってもいろいろあるが理屈に拘って迷走してる人もいるのは事実である。だがそれは新しさに拘っているからではない。新しさに拘ることで珍妙なアートが出来るとすれば
それは新しさがマジョリティに理解されないからであって、それは視野が狭いのとは別問題である。発想法みたいに機械的に理屈でひねり出した新しさではなく、
ちゃんと本人の感性が新しいと感じたのであれば、それは同じ感性の持ち主には感動として伝わるはずである。珍妙に見えても一部の人には価値あるアートなのである。
好きを貫くデメリットをもう1つ書いておこう。それは好きには限度があるということ。例えば作曲家が「イイ曲」ばかり作ろうとしていたら必ず壁にぶつかる。
作曲のセンスや技術が成長してどんどん「イイ曲」が出来ているうちは良いが必ずどこかで壁にぶちあたる。芸術家の苦悩と言えば聞こえは良いがはっきり言って自業自得の馬鹿である。
「イイ曲」ではなく「新しい音を追い求める」というスタンスでいけば一気に視野が広がる。「イイもの」以外は全部捨ててしまうのではなく、その中にも面白い音がたくさんあることに気付く。
「新しさ」を追い求めると興味が特定分野に限定されない効用もある。例えば、ポップスばかり作曲しててジャズに全く興味のない人が新しさを求めはじめるとどうなるか。
最初はポップスの中から色んな新しさを見つけようとする。だけどよくよく聴いてみるとジャズ要素の入ったポップスに新しさが見いだせるかもしれない。あるいはポップスの中に新しさが見いだせなくなって
他のジャンルも聴こうとしてジャズにたどりつくかもしれない。そうして自分の興味分野がどんどん広がっていくのが新鮮さを貫くメソッドの大きな効用である。
そしてジャズの新しさを一通り取り込んだ心でまたポップスを色々聞き直してみると面白いことにこれまでとは違った聞こえ方がしてさまざまな新しい新しさを発見できるようになる。
そうやってどんどん新しさが見つかって心が広がって楽しみが尽きることがない。新しいもの探しをしない作曲家は駄目なんだよ。「イイ曲」ばかり作ろうとしてる作曲家は感性が窒息死してしまう。
http://anond.hatelabo.jp/20130325172822 の続き
言語はJava7を想定。(Java8が迫っていますが、Lambdaなど関数型は、まだ早いと言うことで)
選定理由は、C++と比較して学べるところが大きく、安全でシンプルな言語だから。
※いきなりJavascriptはやめとけ、PHPは論外。
Ruby・Scalaでないのは、筆者が初心者には適切には教えられないから。
おもちゃ・ToyとしてjQueryで遊ぶのは、悪くは無いと思う。
これ以降は名著の紹介や学習方法の紹介が主体となります。名著のコンポジションという形が時間的限界ですね。
量については「初級になるなら、専門書を計3,000ページは修得することは覚悟してね」なんて言ったりしています。
Javaで初級のわかりやすい指標ですと、[amazon:Effective Java]とGoFまでの修得。
初級になるまでに登竜門への挑戦期間を含めて、3~4年はかかっても仕方が無いとも思います。
※逆に「一山いくらのコーダー」というのは、Effctive JavaやGoFが達成している技術も知らずに「自分がJavaプログラマー」だと誤解してしまっているような人達です。
そういったコーダーは何年経とうとも初級プログラマーにすら敵いません。
初級を目指して、プログラミングを楽しんでください。
ただ、学ぶべきことはべらぼうですが、「各分野毎に、エレガントな方法がある。だから探して修得する」ということが大切です。
※「一を聞いて十を知る」ような優秀な人に、50冊くらいドーンと本を置いてあげて、各本の目次を読ませるだけで、
底の見え無さを悟ってくれたりすると、嬉しくなってしまいます。
※余談ですが、その底の見え無さは数学という学問そのものですね。例えば、関数型言語の底流に「圏論」というここ100年の最新の数学があります。
また中級くらいで、Liskovの置換原則などが載っている本を紹介しますが、
そのLiskovの置換原則の周辺で出てくるcovariant(共変)って、圏論という数学の概念だったりします。
数学畑出身としては、数学が現実に活かされている嬉しい事例です。
「速く正確に大量の出力」という能力は、プログラミングをする上でも、ドキュメントを書く上でも、何より「つまらん仕事」の時間圧縮ができるようになるため、重要です。
スローガンとしては「思考のスピードで出力することを目指そう」です。
紹介するエディターはemacsやvimやExcelです。ついでにIMEとしてATOKを使用しているため、ATOKの操作をEmacsライクにする話も紹介します。
ExcelはWindows環境でMeadowすら入れさせてくれない場合の最後の砦という扱いです。
コマンドラインは、「コマンドラインというものがある」「時として非常に強力である」程度の紹介です。
※筆者はzshは全然使えません。使いこなしている方々と接する度に「勉強しなきゃな~、でも、あっちの方を先にやりたい・・・」とグズグズして、はや何年・・・
正規表現は置換を用いて、テキストの一括編集が重要です。後、遭遇したくない事態ですが、スパゲッティコードの解析をする上での最後の砦です。
※遭遇したくない例
ん?何か変なところで副作用のある処理があるようだなぁ(消沈)、SQLのInsertかUpdateか一応Mergeも使っているところから逆算して原因箇所を探すか・・・(諦念)
この糞コードがっ!!こんなところに書くんじゃねぇ!!(憤怒激高)
(ここで、他にやらかしていそうな似たようなコードを正規表現でgrep検索。改行コード込みにすれば複数文検索も可能)
わはは、予想通り共通化すべきロジックのメソッドがそこら中にある・・・
入門編で一つLinkedListというアルゴリズムを学びました。
少なくとも一つ本を読みながら自力でアルゴリズムを学べる人なら、大成できる可能性があります。
前に紹介した[amazon:C++実践プログラミング]には、LikedListやStackなど基本的なアルゴリズムが載っておりますが、
これに加えて、初級になるためにはこれくらいは知っておいて欲しいというものを紹介します。
※後、最初から必ずしも手を出さなくても良い上限も紹介いたします。
プログラムは、データを入力して、加工して出力・保存する処理の繰り返しです。
つまり、各一連の繰り返し毎に、「正しい入力」「正しい出力」を定式化する必要があります。
それを人間の手では無くコンピューターにやらせられるように、つまり自動テストできるようにテストをプログラミングします。
そこで処理の進捗を確認するためにロギングし、処理が想定通りであるかをアサーションでチェックし、
不正な入力・不正な出力=例外が起きたら、対処策をプログラミングします。
(ex 途中で処理を中断して、入力者に適切な入力のメッセージを伝えてあげる。入力の自動補正などもあり得る)
で、ここら辺をまとめてどうあるべきかとして「契約プログラミング」があります。
※余談。定式化・テストに際して、数学畑の人間としては、Javaだとequalsのオーバーライドでも必要になるし、同値関係・同値分割だけでなく、集合論・群論から学んで欲しい・・・(ここいらは数学科の学部1~2年の学習内容)
名著は英語で読みましょう。名著が名著たる由縁は、度々引用されることにあります。
つまり最新の技術書を読むときに、引用された名著のフレーズが、新旧のリンクをなし、理解の助けになります。
壁打ちといって、独り言で思考補助をするよりも遙かに有益です。
※素晴らしい師匠を探すなら、大学行くのが一番ですが、見聞を広げていく中で出会いを待つしかないとも思います。
マルチスレッドが難しいのは「バグを起こしにくいプログラミング」を求められるから。
つまりTry and Errorからの決別が求められ、今後の仕様変更・拡張も踏まえて慎重に慎重にデザインする必要があります。
できる限りステータス変数を持たずに安全に、でもマルチスレッドにするのだから、効率を追求しなければ本末転倒。
でも効率のためにはメモ化に代表されるキャッシングは必須と、アンビバレンツな要素のバランス取りが難しい。
このために、リエントラントな実装・抽象と実装の分離など様々なエッセンスを駆使することが必要です。
というよりも孔子曰く、知っているよりも好きであること。好きであることよりも楽しめることのほうが強く、
気づいたら日々時間が許す限りプログラミングをしてしまうのが理想です。
※仕事として嫌々スキルを磨かなきゃということが、これほど不幸な職業も無いですね。
学習の達成度を測るには、簡単すぎる不適切な問題ですね。
写経は数学の証明問題を、教科書のテンプレ通りに、数値や名称だけ変えて記述することしか出来ない人の発想。
つまり「矛盾無く一貫した論理モデル」の構築が自由に出来ず、テンプレの微修正しか出来ない人の発想。
また、外部の「矛盾無く一貫した論理モデル」の吸収が不自由で、アルゴリズムを「手順」としてしか捉えられないように見受けられる。
「連続」であること確かめるための「ε-Δ論法」(数学科の学部1年の学習内容)
事前知識無く、このモデルを理解できる人は、十分に「矛盾無く一貫した論理モデル」を構築できる人。
世の中「プログラミング言語」を説く本はごまんとあれど「プログラミング」を説く本やブログはあまりない。
いや実際に "ない" というのはかなり語弊があるかもしれない。
しかし、通常この種の説明している本に辿り着くまでには多くの時間が必要だ。
普通の人は、多くの間違った方法を試し、その都度試行錯誤を重ね、プログラミング経験を経ることよって、重要な概念を獲得するのだと思う。
例えば、「計算機プログラムの構造と解釈」や「実用 Common Lisp」、「コンピュータプログラミングの概念・技法・モデル」などの書籍は現実の問題に対し "プログラム" をどう書くかという問題に正面から取り組んでいる良書だ。
しかし、どれだけ”普通の”プログラマが上記のような書籍を読んでいるのだろうか。
そして、"普通のプログラマ" がプログラミングを学ぶ書籍として、それらは果たして適切と言えるだろうか。
僕はそうは思わない。
というのも、多くの人は計算機科学を学び、効率のよいアルゴリズムとデータ構造、美しい階層化・モジュール化されたプログラム、などを作るためにプログラミングするのではない。目の前の問題を解決するためにプログラミングを行うからだ。
授業で出された宿題だったり、人それぞれだろう。
このような目の前の問題を解決したい人達が、わざわざ Lisp や Mozart など何の役に立つのか分からない言語を、根気よく勉強するのだろうか。(ちなみに、Lisp や Mozart は上記の書籍で実際に使われている言語である。)
新しいプログラミング言語を学ぶことや、プログラミングの種々の概念を獲得することではない。
もちろんプログラミング言語を上達するためには一つでも多くの概念を会得する必要があるので、あるレベル以上を目指すのであればこれらの書籍を読むことや、抽象化を実現するための様々なツールを手にすることは必須だと思う。
純粋にプログラミングを楽しんでいる人やハッカーを目指したい人はこのような文章を読むのではなく、ぜひ上記に挙げた本を実際に購入し、自分の手で動かして確かめてみることを勧める。プログラミングに対する考え方や姿勢が変わるのは間違いないと思う。
今回はそのような”純粋にプログラミングを楽しんでいる人”に向けた文章でない。
現実の問題をプログラミングを用いて取り組んでいる人に向けて書いた文章だ。
そのような人の中で、なかなかプログラミングが上達しないという人に向けた文章である。
もしプログラミングの学習に限界を感じているのであれば、プログラミングの学習方法が間違っている可能性が高い。
そして残念なことに、初学者向けの書籍では、"プログラミング言語の文法" を説く本はあれど、"プログラミングの学習方法や上達するための正しいスタンス" を説く本はほとんどない。
できるだけ多くの人にプログラムをする楽しみを知ってもらうためにも、
より多くの人がより生産的にプログラムが出来るようになるためにも、
そして特に、右も左も分からなかったプログラミングを始めたばかりの過去の自分に対して、
効果的な学習方法やプログラムする際の指針を書き記したいと思う。
それらは単に指針を示しているだけなので、
どんなプログラミング言語を使っていようとすぐに実践に移せるはずだ。
後はどれだけそれを実践に移し地道にプログラミングしていくだけである。
正しい努力と、ちょっとしたコツさえ知っていれば驚く程生産性を挙げられるはずだと確信している。
プログラマのレベルを以下の 3 つに分けてそれぞれについて説明していきたい。
・使えるプログラミング言語は一つだけ
ただし以下のことは出来ない。
・500行以上のコードが書けない
2. 中級者レベル
・1つ以上のプログラミング言語は使える
・オブジェクト指向は理解している
ただし以下に当てはまる。
・自分が制作しているアプリケーション向けに "実用的なフレームワークやライブラリ" を書けない
・1万行以上のコードだとスパゲッティコードになり、保守不能になる
・適切なサブルーチン化できない
3. 上級者レベル
・プログラミング歴 3 年以上
・現実の問題に対して適切なデータ構造とアルゴリズムを選択できる
・抽象化について理解し、可変部分と不変部分を考慮した設計ができる
またそれぞれのレベルをクリアするには明確な壁がある様に思う。
これらの壁を超えるにはどうすればよいかを説明する。
前置きが長くなったが、以下ではまず初級者レベルの人に向けた具体的なアドバイスをする。
完全に初心者レベルの人はまずどのようにプログラミングを行えばよいのか分からない。一行も書けない。そのため、必然的に以下のような行動を取ると思う。
・本に載っているプログラムをそのまま書き写す(いわゆる写経)
上のような行動を行なっているだけでは、いつまで経っても自分でプログラミングが出来るようにならない。
なぜなら上記のプロセスでは決定的に重要なことが学べないからだ。
それは、【プログラミング言語のモデル】を自分の中に作ることである。
それは普通の言語と同じように文法が存在し、そのしきたりに沿って記述しなければならない。
そのしきたりを学べば書けるようになれる。非常に単純だ。
それなのに、なぜいつまで経っても書けないのか?
それは、”書き写す・コピーする” だけでは、そのしきたりが習得できないからである。
特に最初のうちのプログラミングは頭を作業使う作業でなく、むしろ "体で覚える" 類のものである。
それは例えば、日本語を話すことと似ている。
友達と会話する時、頭を使っているだろうか。
それは簡単な受け答えについては体が覚えているので、考えるより先に日本語が出てくるのではないだろうか。
プログラミングも同様に頭を使うのではなく、こうしたい時はこう書く、という反射神経を育てなければならない。
もちろん日本語話せるだけでは、ミーティングでプレゼン出来ないのと同様に、文法が出来ただけではプログラミングが出来るとは言えない。しかし、文法が出来ないと "現実の問題に対処するソフトウェアを作る" というレベルには到底進めない。そのために、まずそのような文法の反射神経やパイプラインを頭の中に作る必要があるのだ。
・"何をしたい時" に "どう書けば正しく動くか" というデータベース(プログラミング言語のモデル)を自分の中に作ること
このままでは抽象的すぎるので、このような "データベース" や "考える習慣" を自分の中に作るための具体的な指針を以下に挙げる。
1. エラーをたくさん出す
2. デバックの仕方を覚える
3. 小さく動かして確かめる
4. Google を使い倒す
つまり、小さく動かして、エラーをいっぱい出し、デバッグを素早く行なって、分からないことは google などの検索エンジンで解決する。これが上達のコツである。
これらについては以下で詳しく説明するとして、
無理して覚えなくてよい。
プログラマは覚えることが星の数ほどあるので、メソッドなどはリファレンス片手に検索できればよい。
よく使うメソッドなどについては自然に覚えていくので、積極的に覚える必要はなし。それこそ、"体" で覚えるはずである。
覚えられないメソッドについてはそもそもあまり使わないから覚えられないので、重要性は低く覚える必要はない。
むしろ実現したい処理が既にメソッドや関数として提供されていないか、調べる力の方が大事。
・エラーがいっぱい出てつらい
全く問題ない。
・写経をしなければならない
教科書や本の中に書いてあることをそのままエディタで書き写し、実行することを写経という。
上記でも述べたように、これからあまり無駄な努力をしないことを願って言えば、
写経して書いた 10000 行のプログラムより、自分で考えて書いた 100 行のプログラムの方が遥かに意義がある。
そこに "言語のモデル" や "思考" が伴わないと意味がない。
”思考” が伴わないとただの書き写す作業をしているだけだ。
自分の中に "モデル" が出来ていないので、いざ自分でプログラミングしようと試みても、写経をしているだけでは全く書き出せないだろう。
写経はそもそもプログラミングに対するスタンスやプロセスそのものを勘違いさせる危険性をはらんでいるいる。
写経する場合、書き写しの間違いがなければプログラムは問題なく動く。
しかし実際のプログラムではコンパイルや実行するまで、そのプログラムが期待通りに動くかどうか、は絶対に分からない。
そして通常は一気に全てを書き上げるのではなく、まず小さなコア部分を書き、少しずつ他のコア以外の部分を書き上げながらプログラムを完璧なものにしていく。
書き間違えさえなければ正しく動くと知っているプログラムを、上から一行ずつ書いていくプロセスとは正反対だ。
また、以下で述べるようにエラーが発生した場合のデバッグ作業は非常に重要であるだが、そのための作法も写経から学ぶことができない。
なぜならば、写経中にエラーが発生した場合、教科書と自分で書いたプログラムの間違い探しをまず一番最初に行うからだ。これはプログラミングに関する作業ではなく、むしろ間違い探し絵本とにらめっこしているに近い内容である。
それでは、デバッグ方法や言語のモデルを作るとても大切なプロセスを経験できない。
ゆえにそのようにして完成したプログラムもおそらく正しく動きはするが、得られる経験値は驚くほど低いはずである。
とは言え、いきなり自分で書けと言われても書けないと思うので、小さなプログラムを一旦は教科書通り写し、その後自分なりに改変していくのがよいと思う。この場合も写経にはほとんどが意味がないと思った方がよい。"自分なりに改変する" というプロセスこそ意味がある。
今度はどのように "言語のモデル" を自分の中に作っていくかについて説明する。
初心者はエラーを出さない様にと慎重にプログラミングしようとしがちだ。
なぜならば、エラーを出すごとに、その言語の新しいルールを1つずつ学んでいくことになるからだ。
PHP で例えると、
printf の書式だとか
文末に付けるセミコロンだとか
function はネストできないとか
変数には $ を付けなければならないだとか
グローバル変数を関数の中で使う場合は global 宣言するとか
などである。
初心者のうちは一切上のようなルールは知らないはずだからエラーを全て踏むかもしれない。
例え今回作っていたプログラムでエラーを踏まなかったとしても、回数をこなしていけばいくつかエラーに遭遇するだろう。
しかし、それでよいのだ。
エラーを修正することの繰り返しの中で、その言語のモデルが自分の中に出来てくる。
そのようなトライアンドエラーを繰り返えすことで、"言語のモデル" は文字通り体の中に染み込み、プログラムをだんだんと書ける様になっていく。
おそらくこれはは自転車に乗れるようになるプロセスと似たようなものだと思う。
誰しも最初は上手く走れずに転んでばかりいるけれど、何度も何度も転んで起き上がってを繰り返しているうちに少しずつ多くの距離をこげるようになっていくだろう。
そして最終定期には、難なく自転車を乗りこなせるようなっている。
それらのエラーを地道に1つずつ潰して間違いを訂正していくうちに、少しずつ多くの行数の複雑なプログラム書けるようになっていく。
そして最終的には、自由にプログラミング言語を使いこなせるようになっていることに気付くだろう。
自転車も本を読んだだけで乗れるようにはなれないのと同じで
プログラミング言語も本を読んだだけで出来るようになれると思わない方がよい。
それらはトライアンドエラーの繰り返しの中でしか得ることはできないし、誰かから教わる類のスキルでもない。
そして、プログラミングを行うからにはエラーとは一生付き合っていかなければならない。
早めにそれに気付いて受け入れる必要がある。
実際にエラーに遭遇した時に大事なのはエラーに遭遇した時にいかにその原因を突き止めるかだ。
期待しない動作をした時のデバッグという。
まずいちばん基本的で一番重要なデバック方法は printf デバックである。これをまず出来るようにする。
怪しい変数をとにかく printf で出力し、変な値が入っていないかを確かめる方法である。
僕が常々許せないと思っていることは、初学者向けの書籍にはデバッグの重要性やその具体的な方法論が非常に重要であるにも関わらず、それについては解説すらされていないことである。
初心者だからこそ、デバッグの方法論や開発環境をきちんと整えるべきである。
ほとんどの言語処理系では、デバッグ作業を支援する機能を提供している。
分からなければ、"言語 デバッグ方法" でグーグルで検索してみればよい。
例を挙げると、
javascript だったら firebug
各言語にはいわゆる"定石"と言われるデバッグ方法があるはずで、それらを検索し習得すること。
これは無益な時間を過ごさないためにも本当に重要な要素なので、面倒くさがらずに開発環境を整えや方法論をマスターすること。
最初の内は、基本的にプログラミングする時は小さな部品に別けてから1つずつ確かめながら作る習慣を付けるようにする。
その理由は簡単で、人間は正確無比に物事を進めるのは苦手な一方で、プログラミングでは正確無比に物事を進めることを要求されるからである。そのため、大きなプログラムを一度も実行せずに作成し、一気に確かめようとするとまず間違いなく正しく動作しない。
そして厄介なことに、大きなプログラムを作ってしまうとどこに問題があるのか切り分けすることが困難になるので、ますますデバックが難しくなってしまう。
そのためまず小さく作って小さく確かめ、部品を組み合わせてプログラムを作っていくことが大事になる。
一般的に言って、どんなに熟練したプログラマーであろうとも、一つのミスもせずに一定以上の大きさのソフトウェアを作り上げることは不可能である。そのため、ミスやエラーはある程度発生することを前提に、少し作っては実行して確かめる、というサイクルをたくさん回す習慣を付ける。
ソフトウェアは一行書き上げた瞬間から指数関数的に複雑性が増大し、気付いた時にはどうにもならなくなっていることも多い。そういう時は思い切って一から作り直すという選択肢も検討してみるべきだ。
"Small is Beautiful"
これは非常に有名な unix (という OS)の設計理念である。
unix の開発者は様々な失敗経験から、このようなソフトウェア開発のベストプラクティスを学んだに違いない。
まだプログラミング経験の浅い人も、これから偉大な開発者の経験から学ぶことができるはずである。"Small is Beautiful"。小さく作って動かすこと。
先ほどから何度も書いてあるように、プログラミングする上ではエラーとの付き合い方が非常に重要になってくる。
おそらく何らかの上手くいかない場合は何らかのエラーメッセージが出るはずだ。
原因がどうしても分からない場合は、エラーの文章をそのままコピーして検索してみる。そうすると、おそらくエラーの原因と対策方法などが表示されるので、それを足がかりに再度挑戦する。
現実のプログラミングは、どんなにスキルが伸びようとも、いつも上手くいかないことばかりだ。それこそ、何をしてもエラーが出てくるし、何をしても上手く動作しない。だから僕は初心者のうちで一番大事な能力とは、実は "忍耐力" だろうと少しばかり思っている。
でも悩んでるのはあなただけではなく、おそらく全てのプログラマーが通ってきて道だ。
そして、自分の思い通りに動くプログラムを見た時程うれしいものはない。
ぜひ初心者の人はこれを読んで少しでもプログラミングが出来るようになればと思っている。
つ
http://d.hatena.ne.jp/iad_otomamay/20130318/1363596244
この記事。本当に腹が立ちました。
まず質問自体が酷いのが多い。
省略したのは知らないと障害の危険があるので知っとくべきってことで同意なんですが、
これは使うときにググれば良い話。暗記しておくメリットがわからない。
結合テスト中のシステムで、OutOfMemoryErrorが発生しました。UT後ソースコードの変更はしていません。ヒープメモリは足りているようです。原因として何が考えられますか?(筆記解答)
「UT後ソースコードの変更はしていません」という一文が意図不明。単体テスト終わった後にソースコード変更したら、再度単体テスト必要だと思うのですが?この一文は何のヒントにも制限にもなっていないです。
なぜNGなのかというのは「文字列連結演算子(+)では速度が遅いから」であり、StringBufferかStringBuilderのような結合用クラスのappend()を使うことでパフォーマンスは向上する、というところまでが質問の狙いなのかと思いました。もう一歩踏み込むならば、+をしたときにコンパイラでどのようになるかを知っているかどうか、みたいな。しかし結合用クラスにはデメリットもありまして、append()は冗長過ぎて可読性が酷く低下するデメリットがあります。文字列の連結時にクラスをnewするタイミングを調節したほうが速くなることもあります。近年ではマシンのスペックもあがってますので、そんなに気にする部分ではないと思います。そもそも、このStringBufferの仕組みは絶望的に救いがないJava言語の汚点と言ってもよい部分です。なんで文字列の連結方法に複数のやり方を速度だけの理由で取捨選択させるというバッドノウハウなので、早くコンパイラが最適化して一元化くれることを望む部分です。
StringBufferかStringBuilderと書いていて、そういやスレッドに関しての質問がないのはどういうことなのかと感じました。JavaのWeb系ってスレッド重要だと思うのですが。
JavaScriptでHTML要素をid属性の指定により取得するメソッドは何ですか?(筆記解答)
もうjQueryやDojoも使われるようになってきたからこれも知らなくてもいいんじゃないかと。id指定で取れるということとを知っておけば答えにはたどり着けるはず。バッドノウハウです。どうしてJavascriptが最近になって流行ってきたかを思い出して欲しいです。
プログラマーはバッドノウハウの塊でなくてはならない、というのが見えてくる質問内容ですが、最近は覚えなければならないことが多く、技術の更新スピードも早いので、あの質問のような重箱の隅まで暗記するようなことをしていては、重要な部分が抜け落ちているし、暗記の苦手な人は辛いと思います。書籍もネットのような情報の蓄積と抽出する部分は充実してきたので、概念は知っておいて、実装手段はその都度調べるほうが効率的であるかと思います。質問は、応用の効く根本的な部分を問う方がよかったです。
「現実は、もっと凄惨な世界を経て時代が進んでいくようだ。」などと締めくくっていますが、この人は凄惨な世界が嫌なのでしょうか?不安を煽るだけで対策も講じていません。まず、質問の回答を書くだけでも、読んだ人の知識の底上げに貢献できると思うのが普通です。「これは基礎教育をやってれば当たり前」とか言ってドヤ顔して、できない人間を馬鹿にしているだけに見えます。本心では凄惨な世界を望んでいるのでは?としか思えてなりません。
この記事を読んだことで、またSI業界から優秀な人が遠のくことでしょう。こんな人間が居る業界には居たくないと。
どうして悲しみを減らす方向に動いてくれないのかと…
※追記
頭沸騰しててスルーしてしまったのですが「淘汰」って書いてあったので、業界の底上げは望んでないんだなあと、見当はずれなこと書いてしまったなあ、と、後悔した。
下級のクソプログラマだって時間さえあれば多少メソッド化してみせるくらいの器量はあるのさ、時間さえあればね
下流の質を嘆く前に、まず上流で時間を食い過ぎてないか、下流が滞るようなクソ要件定義やクソ基本設計を作ってないか、そういうところも見直しが必要だったりするよ
http://anond.hatelabo.jp/20130309233920
俺、それなりの規模のSIer側の人間なので、下請けに出す側の人間だけど、下請けもたいがいクソだよ。
会社は、対象のプログラミング言語を「やったこともない」人間を出してくるし、
そうやってやってきたPGは、コーディング規約(何も難しいことはない、空白の入れ方や大文字小文字のルール等)すら守れず、ひどいときはインデントすら合っていないコードを書く。IDEでどうやってそんなことができるのか不思議だが。
まともにロジックが組み立てられないから、プログラムはフラグの嵐。長大なメソッドを書く。
ソースコードレビューで品質が担保できるのは、かなり早い段階からレビューが実施できた場合で、デスマってくるとなんだかんだで先送りになり、気づいた時には千行のメソッドができあがっているわけで、そんなもんレビューしたって直しようがない。もちろんそんな状況にしてしまったプロジェクト運営に問題があるのだけれど、それにしても、それにしてもさあ。
で、下流の人間は、(契約形態によるけど)残業代がかかるし期日がくると逃げる。で、バグだらけのクソコードを俺がサビ残でせっせと直しているわけさ。
1. そうなって欲しいこと・願望・コンセプトを得る。得ようと思っても得られない。ここは偶然起こること。
2. 何をするか・What・思い付きを挙げる。ブレインストーミング。
3. どうやるか・How・方法を考える。「できそう」という段階まで。
4. 必要なもの・使える技術・前例を集める。他人を説得できるようになる。
5. 機能・クラスといった実装上の分割、役割分担など行動に移すための細分化と割り当てを行なう。
7. やること別に「そのためにやらなければならないこと」を実行順通りに書き下す。擬似言語(擬似コード)
8. 擬似言語→設計→擬似言語にフィードバック、設計と擬似言語→実装
擬似コードを書くならアサーションも一緒に書く。不要な用語や用語の重複があるとうまくアサーションを書けない(かみ合わない)。用語の最適化は変数やコードの最適化でもある。
事前条件→事後条件をアサーションで表明、事後条件→他の事前条件へ連鎖。契約によるプログラミング(契約プログラミング)
擬似言語でのアサーションはそのままプログラムコードでもアサーションになるか、テストコードになるか、メソッド|関数|手続きのパラメーター・戻り値コメントになる。アサーションは「実行可能なコメント」(Executable Comments)とも呼ばれている。
RIGHT:[[:t/Prog]]
----
変数に型がないということの利点について考える
http://d.hatena.ne.jp/perlcodesample/touch/20130227/1361928810
が大変お粗末な内容だったので、反論記事を書きます。
型推論はソースコードのコンパイルの時間を遅くしてしまいます。ソースコードが大きくなってきた場合に、すばやく書いて、すばやく実行結果をもらうことができなくなります。
大規模開発環境はコンパイル時間よりリンク時間の方が問題になりやすいが、それは別に型の話とは関係ない。
あと、インタープリタも最近は実行時にJITコンパイラが走る。
実行時間に影響がなく、開発者の待ち時間で済む方が実はよいのでは?
統合開発環境での、メソッドの自動補完の機能の実装が少し難しくなります。
みんなが統合開発環境をつくるとでも?
そもそも型が不定なら補完することすらできないので、
比較対象として相応しくない。
変数に型がないとソースコードの変更に強くなります。たとえば右辺の返す型に変更があったとしても、受け取る側のソースコードを変更する必要はありません。
これは逆に危ない。
実行するまで意図したインスタンスが返ってこなくなった事実に気づかないから。
変数の型を持つ言語は、型が異なるのだが、処理としては同一の処理を行いたい場合には、オーバーロードという機能を使う必要があります。変数の型がなければ、オーバーロードの機能は必要ではなく、ただ単にif文で分岐すればよいだけなのでとても楽です。
CならVTable。Javaならinstanceofなど同等の事はできます。
というか、これ。型を意識しまくったコードじゃないですか???
C++のテンプレートのような複雑でデバッグしにくい機能を使ったりしなければなりません。
実は全然ちがうものが混ざってた!なんて事故がコンパイラによって止められる分、デバッグする必要すら無いんですけどね。
変数に型がないとどのような型の値が代入されているかわからないという批判があるかと思います。可読性の問題で
はじめはワザとやっているのかと思っていたがどうやら本気でそう考えているらしいし。
このメソッドを使えばこの世の出来事のあらゆることを批判できるだろうに。
たぶん、あなたの8年ぐらい前に修士にいた人間からの助言ですが、
はっきり言って、あなた、それ、何も心配しなくていいよ。超大丈夫。
だって、学部の頃とぜんぜん違う能力が求められるってことに気づくのが、
だいたいみんなそのぐらいのタイミングなんだよね。
学部の時はすごく優秀だったけれど、修士に行って憂鬱になって、
大学院の制度にも、あなたにも問題がないわけじゃないだろうけど
それは、無能だった訳じゃなくて「相性が悪かった」んです。
学究の道、そのものと相性が悪かった可能性もあるけど、
単に、設定したテーマや、環境の掛け違いだった可能性も大きい。
そうならない人のほうが珍しい。そう思って下さい。
そういう人、たくさん見てきてますよ、わたしは。
前に踏み出せなくなる必要はまったくありません。
たぶんね。
偉そうなこと書いてる連中の半分前後が、
「たいしたことないな」
って思えてるでしょ?
虚勢とかじゃなくて、そう思えるはずですよ。
そのレベルに達していれば、充分あたまいいです。
あなたの特殊な幸せと不幸は、教官が優秀すぎたことかもしれませんね。
「うちの教授、まあ、バカじゃないけどねぇ…まぁ、教授もいろいろと問題のある人だしなぁ…」
「あーあ、修士2年間冴えなかったなぁ。まぁ、俺も悪いけど、教授も教授だしなぁ」
という感じで、2年間が終わっていくわけです。
でも、教官に責任転嫁させられなかった、というのが、あなたの辛かったところなんでしょうね。
確かに、あなたにとって教官はすごい人に見えていて、ものすごくお世話になりまくって、
それと対比するように、あなた自信が、ものすごくダメな奴に見えているかもしれない。
でも、教官にとっても、たぶんねぇ、いま後悔してる真っ最中だと思うよ。
教官にとっても、「ああ、自分は優秀な学生をうまく育てられなかった」って、後悔すべき状況そのものでしょ。それ。
教官も、すごい反省してるんじゃないの?優秀な人であればこそ。
質問できる環境をきっちりと構築できなかった教官にも、責任の一端はあるんです。
「いや、大学院生は自己責任でしょ」って思うかもしれないけど、
そりゃ、究極的には、そうだけどさ。
教官が、学生の自発性を引き出すためのメソッドとかって、本当は、たくさんあるんですよ。
たとえば、ごく単純に、週一でガンガンミーティングする時間を増やすとか、
モチベーションが下がってきたように見えたら、共同研究に強引に組み込んであげちゃうとか。
でも、大学院生の場合、そういう懇切丁寧なことやらない場合が多いだけ。
経験的事実として、大学院関係者は、だいたいみんな知ってるわけ。
でも、やれてないの。
そういう組織設計が必要だということを、大学院運営側の人間のコンセンサスにできてないの
できているところでも、大学院の組織の制度設計に、まだ充分成功してないの。
あなたは、そこにひっかかっちゃっただけ。
ほんとは優秀なはずの人間が、
本当にこの国の損失ですよ。
大学院での研究に挫けた人とか、ネット上に掃いてすてるほど転がってるから。
とりあえず、あまりに気持ちの落ち込みがひどいようだったら、
まず、CES-Dに行ってね。
ここで、チェックしていって、
16点超えたら、心療内科行って下さい。
#####
http://d.hatena.ne.jp/next49/20081019/p2
(その後の対処法については、いろいろ議論したいところではあるけれど)
この先生も書いてるけど、
ある種の優秀そうな学生のほうが、実は鬱になりやすいっていうのは、
まじで、経験的には、その通りだと思う。
わたしは、大学院で鬱にならなかったけれど、
あなたと同じような鬱で、とてもとても大事な後輩を一人失ってしまいました。
とても悲しかったよ。
それは、裕福な偏差値50は大学進学して、貧乏な偏差値55は進学できない。とかそういうのどうするの?
無茶苦茶頭良くなくても、普通でも裕福なら進学できる。そうじゃなければ進学できない。というのは変だろ。
そのうえ、大人になってから振り返れば、塾って、あるいみ答え暗記メソッドだよね。
塾は塾で有効だけど、社会的に有用か?というのは考えなきゃならん。
未知の問題に対する対応力が低い人間を大量に生み出しているから、『想定外』なんていう事態が起きるんではないか?(必ずしも塾だけのせいではないけど)
塾に行けば偏差値10ぐらいは底上げできるとすると・・・それって本来 自頭だけでみると
バカを社会構造の上に押し入れるシステムで・・・あるいみ裏金とあまりかわらんよね。(大きく違うけど、わかりやすくするためにこういう表現を使った。)