はてなキーワード: オブジェクト指向とは
俺たち姉弟は不幸にも出来損ないの遺伝子を受け継いでしまった。
コミュ障で多動気味の父親と、美人だが(だったが)学習障害気味の母から生まれた私達は二人の特性を見事に受け継ぎ無能という名のサラブレッドとして現代社会の悲しき烙印を押された。
社会性がないため姉は中学2年生から不登校になった。県1の馬鹿高校に行ったが夏休みが来る前に中退した。
俺は別のアホ高校に入学するも高校2年のときにいじめに耐えかね姉と同じく中退した。
俺はすぐに高校認定を取った。意外とこの程度ならなんとかなった。
姉はネトゲ廃人だったりニコ生主だったりとよくわからない生活をしていた。たまにバイトらしきものをしてたこともあるがどれも一瞬で辞めていた。
18歳になった俺は1.5年程度だけの短期のIT系の専門学校に入学した。
普通に偏差値の高い大学卒の元社会人なんて優秀な人もいたが入試という学力によるふるいの概念がないためか何しに来てるんだろいうという人が多かった印象だった。
就活はかなり苦労した。短い学生生活の中で個人開発やプログラミングは好きになれたから喋りは下手だったがエンジニア面接では意外にも好評なことが多かった。
しかし無能であるが故にエンジニア外の人事面接と適性試験でふるい落とされるのだ。
俺みたいな無能がちゃんと弾かれるなんて現代社会の採用フローというのは大変良くできていると感心した。
オブジェクト指向という言葉すら知らない級友が次々と内定を取る中で応用情報持ちで何個かWebサービス構築経験もある俺だけが取り残されていった。
卒業間際になってなんとかギリギリ田舎の零細IT企業に内定した。
頭は壊滅的に悪く初っ端から愚鈍ないじられ役というポジションを確保したが、証券会社の株うんちゃらシステムを構築できるくらいの知能がギリギリ残っていたのは不幸中の幸いだった。
コンビニバイトもあんまり続けられなかったがSlackメインでほとんど人と喋らなくていいプログラマーという職業はまあまだましな環境だと思えた。しかし2年ほど勤めたがやはり上司のパワハラで鬱病を発症し退職した。
俺は遅刻しても怒られない、気が向かなかったらリモートワークOK、残業なしな自社サービス中心の県外のIT企業を1年かけて探し出して転職した。残業代で稼げない分給料はちょっと下がったけど、もろもろゆるいオタク中心の会社だったから生きるだけならギリギリなんとかなった。
姉が結婚したと連絡があったのは俺の転職から2年後くらいだったと思う。
出会いは親には言ってないらしいがペアーズがきっかけだったらしい。
相手は姉より2歳年上の大卒公務員。見た目は身長は160cm前半くらい。女に慣れているようには見えなくて、良く言えば誠実、悪く言えば陰気な印象を受ける男だった。
結婚の報告を聞いたとき俺は素直におめでとうと言った。姉は優しい夫に支えられる不器用な専業主婦になった。幸せになったようだった。
久しぶりにGWに自分と姉は実家に帰った。家族が実家に揃うのは随分と久しぶりだった。
そこで姉に「あんたも私みたいに良い人はよ見つけて幸せになりや。」というような無神経な言葉をかけられて俺は思わず頭に来てしまった。
『良い人を見つけて幸せになる?』そんな人生の救済ルートは無能な男には端から存在しなかった。
「俺は両親の無能を受け継いでしまったために毎日毎日地獄みたいな人生を送ってきた。お前みたいに俺と同じ社会の最底辺の無能なくせに女というだけで何の努力もせず冴えない公務員に媚売って養ってもらって人生救済されるような甘えきった人生送ってる奴と一緒にするな。頼むから俺みたいな不幸を作らないためにも子供は産まないでくれ。」というようなことを言ってしまった。流石にちょっと謝ったが姉は泣いた。
両親に怒られたが似たようなことを両親にも言った。
俺は無能な母親の甘えと冴えない父親の妥協により無能に産まれ、無能だからとありとあらゆる差別を受けてきた。
無能な男にポリコレの救済なんて存在しない。有能な同性愛者への差別にどんなに厳しい社会になったとしても無能な異性愛者の男に救済が訪れることなんてないのだ。
トイレの男女アイコンなんかに差別とかケチつけて大真面目に議論してる人達より俺は何百倍も苦しんで生きてきた自信があるからそんな彼らがなんだかとても空疎に見えた。
俺は社会になんて出たくなかった。姉のように優しいパートナーに養われるヒモみたいな人生を送りたかった。
答えは簡単、無能な女は男の性欲に愛されて、無能な男は女の性欲に愛されないから。
6年もニートやってた社会経験0のコミュ障な男に『公務員の女性と結婚して養ってもらう』なんて選択肢があるか?あるわけねーだろ。
脳みそ含めて五体満足生まれた有能な男女にはわからないかもしれないが、無能には無能の世界がある。無能な男は異性に媚売って守られる生き方すら許されず、それは即ち毎日が生きるか死ぬかの戦いで、この世に味方は一人もおらず、そこがどれだけ地獄なのか、考えたことはあるだろうか。
頼むから男は自分が狙える範囲だからといって無能な女性で妥協するのは辞めてくれ。
無能な女性は結婚して幸せになるのは百歩譲ってまだいい。ただ子供は作らないでくれ。少なくとも男を生むのだけはやめてくれ。
あなたは女性だからあなたのような無能でも生きていけたかもしれないが、男の社会はそんなに甘くはない。
俺は恐らく間違えてるんだろう。でもこういう風にしかなれないんだ。
俺はめちゃくちゃ人生苦しいよ。30までには死のうかなと思ってる。
オブジェクト指向の本質なんて禅問答に近いものだから教えられない。
ちなみに俺は問題の切り分けをしたときにその「切り口」をインターフェースによって規格化できて、
問題を構成する部品を交換可能になるるあたりに本質があるのではないかと思う。
まあそれはどうでもいいとして、プログラミング言語におけるオブジェクト指向という機能の説明なら、普通にできるでしょ。
データとそのデータに対する操作をひとまとめにしたものがオブジェクトです的な。
あと具体的にいけ。
多態性は犬とネコをワンニャーさせるのではなく、テキストボックスとボタンでそれぞれFocusメソッドを呼び出す説明をせよ。
プログラミングまったく理解してないけど某大手の下請けでSEとして5年くらい働いてた。
偏差値ギリ50くらいの大学の情報系の学科で、JavaとかC言語とかのプログラミングが必修科目だったし、基本情報も過去問丸暗記で合格したんだけど、まっっったくプログラミングが理解できないのにSEとかいう大それた名前の仕事についてしまって死ぬほど後悔した。
forっていうんは、なんか繰り返し同じことするやつで〜、i=i+1って書いてあったらiが一個ずつ増えるんだっけ?みたいなレベル。
最初の行に書いてある〜.〜みたいなやつどのプログラムでも同じだけど何?ライブラリって本借りるとこでは?ポインター?オブジェクト指向…?型?桁溢れ?何語…?全然わかんない…
いやもうほんと、社名とか書いたら「こんなのがよく働いてたな…あの会社やばいな…」って思われそう。
そんなくらいの不出来さでも、現場の人手が足りないから、1日に何度も上司に怒鳴られながら、機能追加も故障改修もやったし、顧客問い合わせの対応も本番環境のトラブル対応もした。
徹夜も休出もサビ残も代休がいつのまにか消えてるのも経験した。
流石に二年三年働けば何だかんだできることは確かに増えたし、リリース関係の社内手続きとか、一人で夜間本番監視なんかもどうにかこなせるようにはなったけど…
しかし上司もよくあれだけ怒りながら四年も面倒見てくれたなぁ…とちょっと思ったので、恨みレベルが「子供に早死にされろ」から「40手前でバーコードハゲのメタボになれ」くらいになった。
話逸れた。
今の仕事でも、既存のマクロでエラー出たときに原因箇所を調べたりするのは出来るけど、そこから何を直したら直るのかわかんない。
欲しいマクロの機能の要望とかフローチャートとかは作れるけど、それがプログラムにならない。
この先ずっと、大学から8年も触れてきたのに意味もわからないし苦手なもの、って思い続けるのが嫌すぎてこの八年分の人生を無駄にした気がして憂鬱になる。
八年あったら簿記とかFPとかTOEICとか勉強できたんじゃないか?とか、社労士とか書士とかそういう職業につながる資格の勉強できる大学にした方が良かったんじゃないか?とか。長い人生のうち八年かもしれないけど、人生80年としたら一割だし、自立して過ごせるのが18〜60くらいだとしたら二割だし、二割分出遅れたらもうフツーの人間はゴールする前に足切りされちゃうでしょ多分…
大学はよく考えて選んだ方が良いし、大学で失敗してもせめて仕事はよく選んだ方が良いよぉ…
仕事選びも失敗したなら、辞めるなら早い方が良いよぉ…
プログラミングのプロになるつもりなら、Pascal → C → Python → Java あたりでどう?
俺は今でも Pascal のシンプルさと一貫性と融通のきかなさ(良い意味で)は初心者にうってつけだと思う。すぐ学べるし。
C と Python は知らないでは済ませられないだろうから必須。
で、結局は Java もやることになるだろうし。
何が言いたいかと言うと、まずは構造化プログラミングを学び、それだけでは収拾がつかなくなる場合があることを実感してからオブジェクト指向へ進むのが自然で納得できるだろうということ。
そして、最初はオブジェクト指向の要素が無い言語を学べば、オブジェクト指向の要素を使いたくても使えないので、その方が却ってスッキリしてわかりやすいだろうという事。
プログラマじゃないけどプログラミング完全に理解した()おばさんが理解してる基礎知識書くよ。
(追記 この文章はプログラミングの勉強をしたいけどその周辺にある基礎知識になかなか触れる機会がない人向けに書きました。これらの基礎知識があると、困ったときに調べ方すら分からないという状況は回避しやすくなるはず)
ターミナル、いわゆる黒い窓からCUI(コマンドユーザーインターフェース)でコンピュータを使う方法を覚えよう。これは大学のコンピュータリテラシーで習った。MacOSXで復習すると捗った。(追記 すごく間が抜けてたけどMacOSXはUnix系OSです)
まずはファイル操作。Macでターミナルを使って、cd Desktopって打ってからecho ohayou > aisatsu.txtって打ってみて、cat aisatsu.txtってやる。そうすると何が表示されるのか?とりあえずやってみよう。ここで>は増田の都合上大文字全角にしてるけど、ちゃんと半角にしてね。なんで増田の都合上半角がダメなのか、そのうち想像できるようになろう。(追記 ブコメ指摘感謝)
そして、実際にデスクトップを見に行ってみると、aisatsu.txtってファイルがあるはずなんで、開いてみよう。これで何が起こったのか7割くらいはわかるはず。
こういうファイル操作の基本をまず覚えよう。これこそ空気みたいなものだから。
(追記 ここも間が抜けてたけど確かにhogeって何かわからないね。直しました)
最近は何も考えなければ文字コードはとりあえずUTF-8でなんとでもなるようになってるけど、バックスラッシュとかは環境設定で出てくるように設定しないと出てこないし、その意味合い、つまりエスケープとしての使い方を頭に入れておくと後々困らないと思う。あとEOF(エンドオブファイル)とか改行コードとかもそういうものがあるよ程度には覚えておこう。これ頭の片隅にはいってないと分からん殺し的な罠にはまることがある。
これは使いたいプログラミング言語の公式サイトに行くと大抵書いてある。
でもMacだとだいぶ楽。とりあえずターミナルからgccって打ってみるとなんかCUIツールとか書いてあるものをインストールしろって言われるのでインストールする。これだけでCとかC++とかRubyとかPythonとか一通り使えるようになる。もしかしたら最近はこのインストールすらいらないかもしれないけど。
あと、シェルのコマンドとかプログラミング言語を実際に使うときはいろんなライブラリをインストールする必要があるけど、そのライブラリは管理がすごく面倒なので管理をまとめてくれるコマンドがあったりする。aptとかhomebrewとかがそういうのだから、そんなものの使い方も覚えておこう。
(追記 言語の文法を追うだけなら環境構築なんてしなくてCloud9とか使ってもいいかもだけど、プロダクトを作ろうとした時にはまだまだ手元で環境作って必要なライブラリを入れてとやった方が後々応用がきくと思うのですよ。それにそうしていくとDockerの有り難みなんかも理解できるようになっていくのではと思います)
最初に勉強するプログラミング言語は、Javaだけはやめておけ。
なんでかっていうと、Javaはオブジェクト指向言語ってやつなんだけどオブジェクト指向的にしか書けないから。古い人間だと言われそうだけど、最初は手続き型言語から始めるべきだと思ってる。少なくとも、手続き型的に書ける言語から始めるべき。
なぜそう思うのかも含めて、とりあえずおばさんが理解しているプログラミング言語の発展の経緯を軽く解説する。
最初の頃のプログラミング言語は、手続き型と呼ばれるものが多かった。
この〇〇型ってのはプログラミングをするときの考え方によって名前がついているんだけど、手続き型はまず0を作って、0に1を100回足して、最後にその結果を表示してください、みたいな、上から書いた順番通りに動くのが基本のルールである考え方。プログラムは基本的にはこうやってデータをアルゴリズムを使って変化させていって望む結果を得ている。でもこのやり方は問題も多かった。プログラム全体がひとかたまりになってしまっているので、数千行とかになるともう普通の人では手がつけられないし、人間のミスでデータを間違って扱ってしまうことがバグの温床になった。
なので、この手続き型の考えに構造化という考えが加わって、関数というものが生まれた。関数っていうのは料理のレシピに例えるとわかりやすいかも。
5:豚こまを入れて色が変わるまで炒めます。
9:火を消して8をお皿に盛り、野菜炒めの出来上がりです。
B:肉に味付けをします。
2:Bを入れて色が変わるまで炒めます。
3:Aを入れてしんなりするまで炒めます。
4:火を消して3をお皿に盛り、野菜炒めの出来上がりです。
って書ける。ここではAとBが関数。
この程度だとあまり意味を感じないかもしれないけど、これがもっと複雑なものを想像してみると、なんとなくありがたみが分かって来ないだろうか?こうすると、多人数でプログラミングをするときに、Aを書く人、Bを書く人、1〜4にまとめる人って感じで作業分担ができる。それに、バグが起きた時もAの領域でバグったのか、Bの領域でバグったのかとか、全体にまとめると上手くいかないのかとか、原因の切り分けがしやすい。
でも、プログラムがとっても複雑化すると、これでも手に負えなくなる。料理の例えを拡大すると、料理店を運営することを考えるといいかも。
料理店でたくさんの料理をさばくときに、レシピを完全に1から作ることってないと思う。Aさんが野菜の仕込み担当、Bさんがスープの仕込み担当、というように各人に仕事が割り振られているはず。AさんもBさんもそれぞれの仕込みのレシピを持っていて、最終的に出てくる仕込みがちゃんとしてればAさんBさんの仕事の詳細までいちいちシェフが細かくチェックしない体制になっていると思う。大雑把にいうとそういう考え方をプログラムで再現したのがオブジェクト指向型言語。
なので、本気で料理の初心者がいきなり厨房の仕切りを任されて上手くいくのは難しいように、構造化プログラミングのありがたみすらわからない段階でオブジェクト指向型プログラミングに手をつけても意味がわからんだろうと思うのがおばさんの立場です。
(追記 おばさんはRubyを勧めておきます。オブジェクト指向型言語ですが、手続き型的に書き下すことも出来るからです。一つの言語で手続き型構造化オブジェクト指向、全部勉強できます。メソッドも便利なのが一通りあるし、日本語を扱うのにも問題が少ないです)
次に問題を分解できるようになろう。
例えば、クイズゲームを作りたいと考えたときにクイズゲームを作りたいです、って問題は大きすぎる。
クイズゲームに必要な要素は、問題文を表示する、回答を入力してもらう、正誤判定をする、正誤判定の結果を表示する、ということだなぐらいにまず分解する。
これを実際にプログラミングしようとすると、もっと分解できてさらに問題が見えてくると思う。
コンピュータってのは創造的なことはできない代わりに、とても簡単なことをとても階層的に重ね合わせて大きな問題を解けるように作られてる。それを心するといいと思う。
これ超大事。プログラミングって本当に自分で1からものを考えなきゃいけないことってあまりない。大きな問題はあなただけの問題かもしれないけれど、それを構成する小さな問題は大抵他の誰かが解いている問題なので、調べてみれば答えが見つかると思う。
エラーメッセージが出てきたらまずググってみる。翻訳しても初心者には意味がわからないし、ググったら誰かが解説付きで紹介してくれているのでその解説を読んだりしながらエラーメッセージとの付き合い方を覚えていけばいい。
メソッドの使い方がわからなかったら言語の公式サイトに行ってみる。メソッドの使い方で大事なのは呼び出し方、返ってくる値の型とかそういうのだから、こういうところはググるよりも公式サイトに書いてあることをしっかり読んで理解する。
あと、アルゴリズムの勉強もしてみるといいと思う。アルゴリズムとデータ構造と計算量の勉強。大学の学部レベルの教科書をちゃんと読んでみると、例えばデータベースを操作するSQLというものを書くことになった時とかに効いてくる。あとは作ったプログラムが遅すぎてどうしようとかいうのを解決する時とか。
なんか深夜までいろいろ書いてしまったけど、あくまでもプログラマじゃないおばさんが書いたものなので、みんなでツッコミとか入れてくれると大変助かります。
「その分野のことを知らない初学者には,とりあえずオライリーとか.ヘネパタとかK&Rとかオススメ.」
とかいってるあたり何もわかってなさそうなんだけど。オライリーって本はないしヘネパタは初学者向けじゃないし(パタヘネのこと?いずれにせよ初学者向けじゃない)、K&Rは学習という意味ではクソ以下の価値しかない(歴史的価値はおおきいが)。
ていうかプログラミングって工学ではありえても理学にはなりえないので、もういろいろと初手からダメなんじゃないかと。視野狭くなってません?
(ところで増田って & って書くと展開されるんだっけ?)