genonymous

GenestreamのTechブログ

【連載】エンジニアになるための教科書2(コンピューターの仕組み)

前回、エンジニアになるためにはまずコンピューターを知ることが重要だとお伝えしました。
今回はまず手始めに、コンピューターの仕組みについて学んでいきましょう。

genestream.hatenablog.com

コンピューターの仕組み

コンピューターは2つのものから構成されています。

それは
「ハードウェア」と「ソフトウェア」
の2つです。

いきなりハードウェアソフトウェアといわれても、何のことを言っているのか分からない方も多いと思います。
最初にこれらの用語を整理して理解しておきましょう。

ハードウェアとソフトウェアの違いは?

直訳すると
ハードウェアは、日本語で「硬いもの」
ソフトウェアは、日本語で「軟らかいもの」
という意味です。
しかしそのまま日本語にしてもいまいちピンときません。

なぜならこれらの言葉は
「目で見えるかどうか、すなわち実際に手で触ることができるかどうか」
ということを比喩した表現だからです。

「ハードウェア = 硬いもの = 実際に目で見て触ることができる」
「ソフトウェア = 軟らかいもの = 目で見て触ることができない 」
ということです。

ハードウェアには、パッと思いつくものはキーボード、画面(ディスプレイ)などがあります。

パソコンなどの裏側を開ければCPU、ハードディスク、メモリなど様々なものが入っていることも分かります。
もちろんこれらも目で見て触ることができるものなので、全てハードウェアです。

一方でソフトウェアはコンピューターによって実行される
「プログラムの命令とデータ」のことです。

アプリはソフトウェア?

ソフトウェアは「ソフト」という略語としてよく使われています。
「映像編集ソフト」「ゲームソフト」「ワープロソフト」などがあります。
ソフトウェアはそれ自体を目で見て触ることはできないので、CDなどのハードウェアに組み込んで販売されたり、インターネットで配信されたりしています。

ソフトウェアはハードウェアと違って、プログラム自体を見たり触ったりすることができません。
しかし、パソコンのゲームソフトなどを入れると画面上で遊ぶことができるので
「触ることはできないけど見ることはできているのでは?」 と思う方もいらっしゃるかもしれません。

しかし、画面に表示されているものはプログラムが実行された結果を画面(ハードウェア)に映し出しているだけなのです。
内部でどういうプログラムが実行されて画面に表示させたのかを見ることはできません。

また近年ではスマートフォンが爆発的に普及したのに伴ない「アプリ」という言葉も一般的に使われるようになりました。
パソコンよりスマートフォンを使っている人の方が多いと思いますので「ソフト」より「アプリ」という言葉を使った方がイメージが湧きやすいでしょう。

「アプリもソフトウェアの種類の1つ」
です。

ソフトウェアの種類

ソフトウェアには大きく分けて3種類あります。

・「基本ソフトウェア」
・「応用ソフトウェア」
・「ミドルウェア
の3つです。

この3つの中の「応用ソフトウェア」の「応用」は英語で「アプリケーション」です。
英語名だと「アプリケーションソフトウェア(Application Software)」ですが、これを省略して「アプリ」と呼ばれているのです。

これらの違いを簡単に説明すると
基本ソフトウェア=「コンピューター自体の稼働に必要なソフトウェア」
応用ソフトウェア=「任意でコンピューターに入れることができるソフトウェア」
という違いがあります。

ミドルウェアに関しては今の段階ではちょっと難しいので後の連載で説明することにします。
今はそういうものもあるということだけ覚えておいてください。

アプリとは?

応用アプリケーション(以降アプリと呼称します)は、身近なところでいうと皆さんが電気屋などでパソコンを買う時にセットで購入するソフト(セキュリティソフト)などがそれに該当します。

例えば先ほど例にあげた 「映像編集ソフト」「ゲームソフト」「ワープロソフト」がそうです。

これらはパソコンに入れて使うアプリがほとんどです。

もっと皆さんがイメージしやすいところで言うと、スマホのAppStoreやGooglePlayStoreで沢山の種類のアプリが配信されています。
ゲームや音楽などのアプリをインストールして楽しんでいる人が多いと思いますので、より身近で親しみがあると思います。

OSって?

しかし基本ソフトウェアというと、ほとんどの方がよく分からないと口を揃えて言います。

基本ソフトウェアはほとんどの場合
オペレーティングシステム(以降OSと呼称します)」
のことを指して言われます。

「OS(オーエス)って何だろう?」
と、皆さん疑問に思うでしょう。

OSには
Windows」「Mac OSX」「iOS」「Android
などがあります。

これらの言葉はほとんどの方が一度は聞いたことあると思います。

「えっ、これってパソコンとかスマートフォンの機種の名前じゃないの?」
「作ったメーカーが違うから名前が違うだけじゃない? マイクロソフトGoogleが開発したかの違いなのでは....」 と思ってしまう方が多いと思います。

OSが何をしているかを簡単に例えると
「ハードウェアとアプリの橋渡し」
です。 本当に基本的なことを行っているので、普段私たちが意識することはほとんどありません。

基本的なことというのは具体的にいうとこんなことです。

OSが活躍している場面例

例1:画面にHを表示する
「キーボードのHの文字が押されました(ハードウェア) 」

「わかりました。画面にHの文字を表示しなさい(OS)」

「画面にHを表示します(ハードウェア)」

例2:カーソルを右に動かす
「マウスが右に少し移動されました。(ハードウェア) 」

「わかりました。画面のカーソルの位置を少し右に移動しなさい(OS)」

「画面上のカーソルの位置を少し右に移動します(ハードウェア)」

パソコンを使っていてキーボードを押したら文字が入力される、マウスを動かしたら画面上のマウスの位置が変わる。
スマートフォンであれば、ホームボタンを押すとホーム画面に戻る。

このような当たり前と思ってしまうような普段意識をしない部分の
「ハードウェア ⇔ ソフトウェア」
の制御を行ってくれているのです。

OSはさらに活躍する

そして、「OS」は「アプリの制御」も行っています。
どんな風に制御を行っているかというと

「画面のこの部分がクリックされました(ハードウェア 画面上)」

「わかりました。そこはゲームアプリのアイコンが表示されている場所ですね。ゲームアプリを起動したいのでゲームアプリのプログラムをください。(OS)」

「ゲームアプリのプログラムはこれです。(ハードウェア ハードディスク)」

「ありがとうございます。ゲームアプリのプログラムを実行します。最初はどれから実行すればいいですか?(OS)」

「最初はこのプログラムを実行してください。(アプリ)」

「わかりました。なるほど、このプログラムは画面に起動画面を表示するプログラムですね。画面にこの起動画面を表示してください(OS)」

「指示された通りの画面を表示します。(ハードウェア 画面上)」

少しやりとりが複雑になりました。
OSやハードウェアやアプリがこういった会話を実際に行っているわけではありませんが、裏側ではこのようなやりとりがされています。

ここから分かる事が1つあります。

「ハードウェアもアプリもOSを経由して実行、制御されているので、OSが存在しないとハードウェアもアプリも動かない」
ということです。

なんとなくご理解いただけましたでしょうか?

もちろんOSはこれだけではなく、他にも沢山のハードウェアを制御しています。 まずはコンピューターの仕組みを理解する事が目的ですので、この場で全てのOSの機能を説明していくことは割愛します。
OSが何を行っているものだったのかを知っただけでもかなりの進歩なので、OSに関しては後の連載で徐々に知識を深めていけば十分だと思います。

まとめ

今回のテーマである「コンピューターの仕組み」についての説明は以上です。

コンピューターは「ハードウェア」「ソフトウェア」の2つから構成されている。
ソフトウェアは「基本ソフトウェア」「アプリ」「ミドルウェアの3種類ある。
「基本ソフトウェア」である「OS」はハードウェアとアプリの基本的な制御を行っている。

みなさんが普段あまり意識しないコンピューターやソフトウェアについて、少しでも「なるほど!」と思っていただければ幸いです。

次回では少し気分を変えて、今後のために学習効率をあげる方法を学習していただきます。
初学者が学習を続けていく上で陥りやすい罠があります。
この罠にはまることなく学習をすすめることにより、今後に次々と出てくる専門用語の学習や理解を効率よく行うことができるようになります。

次回「エンジニアになるための教科書3」

【連載】エンジニアになるための教科書1

こんにちは、株式会社ジェネストリームの佐野です。

実は僕がスタートアップに転職し、ゼロからエンジニアを開始してまだ1年も経っていません。
しかしすでに、Webサービスを1つとAndroidアプリを1つ、ゼロから創り上げリリースしています。

この1年間、わからないことが多すぎるので手探りでがむしゃらに自分なりに動き勉強していきたのですが、最近急にバラバラと散らばっていた知識が点と点がつながって線になり、やっと円になり始めました。

そこで解ったことは、
「初心者の頃の自分がなぜ理解できなかったのか? 」
ということです。

そこで僕が学んだことを整理し、初心者向け(業界未経験含む)の方々がエンジニアになるための教科書をつくることにしました。

エンジニアを目指している方の助けとなり、エンジニア一年目の方の技術力向上に貢献できれば幸いです。

概要

このブログは全くの初心者(業界未経験)の方から1年目のエンジニアの方々向けの教科書です。

内容はコンピューターの基本からプログラミングの基本、インフラ、データベースなどの知識です。
また知識とは別に考え方や慣習も記載しているので、これらの知識を身につければエンジニアとして仕事ができるようになることを最終目標としています。 

週1回程度で連載していく予定ですので、気長にお付き合いください。

目的

エンジニアになるための教科書を作ることです。
作ろうと思いたった理由は以下の2点です。

  1. 基本情報技術者データベーススペシャリストなど、資格を取るための教科書や技術書は多々あります。 しかし、「エンジニアになるための教科書」は実は存在していないため。
  2. 優秀なエンジニアの人数が足りないため。

1について

まず大前提を。
賛否両論あると思いますが、僕は「資格を取ることを目標にしてはいけない」と考えています。

その理由として、資格はそれを活かした仕事を獲得するなり就職するなりし、はじめて意味をなすと考えているためです。

現在、様々なシーンで誤ったエンジニア教育がされていると思います。

例えば資格については、エンジニアとして仕事をしながら、さらなる知識の習得や復習を兼ねて資格を取っていると思います。
また学校の教育では、プログラミングを学習させたりしているが、本当に初心者のことを考えた学習方法ではないと思います。

僕は仕事柄インターン生や近くの学生達の話はよく聞きますが、聞いてもプログラミングなどは無理だと口をそろえて言います。
これはまさに、間違った教育がIT技術の習得は難しいという先入観を与えている影響ではないでしょうか。

2について

基本的にエンジニアの数が不足している中、優秀なエンジニアはさらに不足しています。

その結果、優秀なエンジニアは仕事が山のようにあるので仕事を選べるため、単価の高い仕事や、自分がやりたい仕事だけを請け負う傾向になるのは仕方のないことだと思います。

そうすると僕たちのようなスタートアップにリクルーティングしようとしても、すぐに環境を変えて同じ仲間として仕事をするのは難しい状況だと実感しました。

しかし優秀なエンジニアは獲得したい。
そこで、自分たちで優秀なエンジニアを1から育てていく方がコストが低く、かつエンジニアが増えれば世の中のためにもなると思い、どうやったら優秀なエンジニアをゼロから育てていくことができるのか?という視点に切り替えました。

連載していくこと

以上を踏まえ今日から、優秀なエンジニアを育てるための手順を僕たちなりの視点でまとめていきたいと思います。

まず学ぶべきこと

まず学ぶべきこと、それは「コンピューター」についてです。

エンジニアにならない、またはなれない方々に共通な点があります。

それは、
「コンピューターに苦手意識がある」
ことです。

パソコンの操作がわからない人や機械を見ただけで、拒絶反応が起こる人も多いですよね。

身近にある家電でも、最近のものは高機能になってきています。
電子レンジや冷蔵庫ですら完璧に使いこなせる方も少なくないと思います。

そんな激しい変化に取り残されたまま、パソコンやIT技術に興味を持った人たちがプログラミングを覚えたり、データベースやネットワーク、情報セキュリティなどを学習し始めているのが現状です。

コンピューターに興味があり、また好きな方ですら、いざIT技術者になろうとすると路頭に迷ってしまうのです。

「何をどこから勉強したらいいのかわからない」

「仕事ができるレベルってどれくらいなの?」

「本当に自分がエンジニアになれるのかな?」

今この記事を読んでいるあなたも、まさに頭の中でこういったことを考えていることと思います。

エンジニアはほぼ毎日パソコンを使って作業をし、様々なツールを使いこなしながら仕事をする必要があります。

コンピューターを知ることは地図を手に入れること

コンピューターの操作に慣れることも重要です。
しかしそれ以上に大切なことは、
「そもそもコンピューターってどうやって動いているのか?」
といった根底となる部分を知ることです。

「今自分はコンピューターのどこの部分を何を使ってどうしようとしているのか?」
という、今自分が学んでいる位置や場所がわかるだけでも迷子にならなくなります。

さらに、コンピューターの基本をわかっていることにより、その後の勉強の理解度も全然違ってきます。

何事も基本が大事です。

基本や概念や目的といった根底にあるものはどんな仕事をするにしても大変重要です。
つまり、コンピューターを知ることは、プログラミングの原点(=地図)を持つことになるのです。

これから分からないことや理解しづらいことなどが多々出てくると思います。
そういった時は、まず概念や仕組みなどの基本的なことから調べて理解を試みるようにしてみましょう。

次回予告

それでは次回から本格的にコンピューターについて学んでいきましょう。

エンジニアになるための教科書2へ

ターミナルとエディタとIDEとGitHubを目に優しい色にしよう

眩しい画面と高コントラストのシンタックスハイライトは疲れる

こんばんは徳山です。最近長時間モニターを見ていて目が疲れてると感じることが多いです。特に暗いエディタから明るいブラウザに移動した時や、白が基本のGitHubでコードレビューしている時にダメージが大きい気がします。どうにかできないかなーっと対策してみました。

基本的な方針は見ている時間が長いものを目に優しい色に設定します。

目に優しい色ということでこの2点をします。

  1. 眩しくないようにベースの色を暗いものにする
  2. コントラストなのにシンタックスハイライトがわかりやすいカラースキームのSolarizedを使う

エンジニアが長時間見ているものはターミナル、エディタ、IDEGitHubあたりじゃないでしょうか。 僕の場合だと、iTerm, Vim, Android Stuido, ChromeGitHub です。

以下で実際に設定していきます。

iTerm

iterm2-colors-solarized から Solarized Dark.itermcolors を入手します。 Preferences -> Profiles -> Colors -> Load Presets... -> Import... で先ほど保存した Solarized Dark.itermcolors を読み込みます。 読み込めたらリストにSolarized Darkが追加されていると思うので選択します。

Vim

Vim pluginを使って設定するのが簡単です。 altercation/vim-colors-solarized というVim pluginがあります。インストールしたらvimrcに以下を追加しvimrcを再読み込みします。

syntax enable
set background=dark
colorscheme solarized

Android Studio

Android Studioではまずテーマを黒ベースのDarculaにします。 Preferences -> Appearance -> Theme の所で Darcula を選択します。 OKを押すと再起動するか聞かれるので再起動します。

次にエディタ部分のカラースキーマを設定します。Solarized Colorscheme for IntelliJ IDEA - GitHub から Solarized Dark.icls をダウンロードして ~/Library/Preferences/AndroidStudio/colors に配置します。 Android Studioを再起動すると Preferences -> Editor -> Colors & Fonts の Scheme name に Solarized Dark が追加されているので選択しOKを押すと設定完了です。

f:id:genestream:20150304175259p:plain

ChromeGitHub

サイトごとにカスタムスタイルシートを適応できるChrome拡張のStylishを使います。 Stylish - Chrome Web Store からインストールできます。

StylishをインストールしたらGitHub用にスタイルシートを設定します。 GitHub Dark - userstyles.orgSyntax highlight theme を Solarized Darkにします。
他の項目も好みのものに変更し Update with Stylish を押すと設定完了です。GitHubのページをリロードするとスタイルシートが適応されています。

f:id:genestream:20150304174736p:plain

他のツール向けのもある

以上です。EmacsXcodeなど他のメジャーなツール向けは一通り用意されているのでぜひ設定してみてください。

たった2ヶ月でプログラミングができるようになった勉強法

こんばんは、佐野です。この業界に入って3ヶ月が過ぎました。
ど新人で入社しましたが、一つのプロダクトを持たせていただいて現在開発中です。
最初は全くわからず何をどうコードを書いていいのかさっぱり分かりませんでした。
Google Apiって何?Oauth認証って何?っというような状態でした。
しかしながら2ヶ月ほどでRailsjavascriptをある程度書けるようになり、途中から開発スピードが飛躍的に上がりました。
周りの方からはどうやって勉強したのか?と聞かれることもあったので、新人の方向けに僕が実際に行った勉強法を書いてみました。
ご参考になれば幸いです。

irb、pryを活用する

これはRails側です。
何をするにも初めてですのでとりあえず「どう動くのか?」をひたすら覚えていきました。 たとえばRubyで文字列操作、時刻操作などをする場合は多々出てきます。
その場合にはまずirbやpryを使ってコンソールで試していくのが一番分かりやすかったです。 文字列操作であれば、map、gsub、sliceや+、ーなどの基本的なメソッドまでを実際に使ってみて
”あ”の文字列や"1"などの文字列の数字に対して行ったらどうなるのか?
配列やハッシュに対して行ったらどうなるのか? 時刻操作であればDate.new、DateTime.parse、Time.zone.now、strftimeなどを文字列に対して試してみました。
これによってメソッドの動きが分かり、使うべきものが分かるようになりました。

ひたすらp

Rubyの勉強を始めた時に「こんなの使うことあるの?」と思ってたp……。 まさかこの「p」を一番使うとは思ってもいませんでした。
パラメーターがちゃんと飛んできているか?
定義したメソッドがちゃんと意図した通りの動きをしているか?
などを確認するときなどに必ず使いますよね。
このpを使うデバッグ方法を知ったことによって、内部でどう動いているかが分かり、プログラミングに対する理解が深まりました。
デバッグ方法を知り、実際にデバッグを行うことはプログラミングができるようになる早道だと思います。
Rubyではp以外にも、classやinspectなどのオブジェクトを確認するメソッドは多々使い、どういうオブジェクトが返ってきているか?
などを確認することをおすすめします。
javascriptの方でもconsole.log()を多用し、初めて使うメソッドなどは動きを確認するようにしています。

基本的なことを徹底的に勉強する

Rubyなどの言語に関する基本的なことはWebで調べればいくらでも出てきます。
しかし本当にまず勉強すしないといけないところは違うと思います。
僕が勉強した基本的なことは「そもそもコンピューターとは何か?」というところです。
下記の三つの書籍を順番に読みました。
「コンピューターはなぜ動くのか」→「プログラムはなぜ動くのか」→「オブジェクト指向でなぜつくるのか」
これらの書籍は本当に基本的なところが書いてありました。
コンピューターは実は三つのことしかやっていない、クラスっていう概念はなぜできたのか?など根本的な部分が分かると
プログラミング言語の学習をしている際にも、言語仕様などにも納得のできる部分が多くなり非常に身につきました。
この後にWebの基本的な知識を勉強すると「なるほど!」と、簡単に理解することができました。

まず動くものから始める

自分で試しに作ってみたがエラーばかりで、それを直せず途中で諦めた。
全く理解できなくてつまらない。
などがあると思います。 これはjavasceriptを勉強するときに実践したことですが、まず「Webでサンプルを探してきて動かしてみる」ということを行いました。
javascriptはエラーが出てもエラー箇所が分かりづらいことが多々有ります。
エラーが解消できないと時間もかかるし、面倒くさくなって途中で諦めることもあるかもしれません。
僕が行ったのは「ます動くものをコピペ」です。
幸いjavascriptの情報はたくさんあるので、サンプルなどはWeb上に多々有ります。
自分が作りたいものと同じものが無くても、似たようなものを持ってきてとりあえず動かしてみる。
動いたら少しずつ自分の作るたいものに変えていく、という方法をとりました。
これなら動く状態からスタートできるし、エラーが起こっても原因を見つけやすいので勉強が捗ります。

とりあえず簡単なことをひたすらやってみた感じです。
プログラミングに苦手意識を持っている人は、ぜひ基本的なことを勉強するようにしてみてください。
「コンピューターはなぜ動くのか」などの書籍を読むことは日々の業務には関係なく
遠回りしてしまうようですが、長い目で見ると今後の勉強の理解度の速さなどを考えれば一番の近道になると思います。

エンジニア実務未経験の僕が、入社早々プロジェクト任されて陥った4つの罠たち

こんにちは、太田です。 一部の方々は既にご存知だと思いますが、僕が担当しておりましたプロジェクト「Team-hacker」が特定少数の人たちに公開されました。

まだまだ課題が山積しておりますが一旦の区切りでもありますので、せっかくなので今回は件名のとおり、エンジニア実務未経験の僕が入社早々プロジェクトを任されて陥った4つの罠たちについて書こうと思います。

git問題

僕みたいなエンジニア初学者の人でこんな経験をしたことはありませんか?

今まで自分だけで開発していたけど、チーム開発することになって初めてgithub flowにもとづいて、ブランチ切って開発してチェックアウトして…ってしてたらあれ?今まで書いていたプログラムが全部消えてるううううううぅぅぅぅぅぅぅぅぅぅぅぅl!!!!!!!!!!

はい、そうです。僕いわく「git問題」。 gitの仕組みをちゃんと理解しないでいきなりgitを使い始めたらもう大変。

今だったらあの頃の自分に対して「お前、馬鹿だなーw ブランチちげーじゃねーか!」って言いたくなっちゃうんですけど、その時は本当にわからなくて社内の先輩エンジニアたちに「プログラムキエタ!プログラムキエタ!」って大騒ぎしてご迷惑をおかけしたものです…。

このおかげで、途中まで作ってたアプリを全部消して最初からやり直しましたからね。 エンジニア初学者の方が読んでいたら、次の言葉を覚えておいてください。

「git checkoutしても、プログラムは別のブランチにちゃんと残ってる」

devise問題

そう、これも激ハマりしましたよ。 devise。railsの第4うんちゃら認証ライブラリとして確固たる地位を築いているあのライブラリさんです。 そして僕がrailsでの実践的な開発で初めて使ったライブラリ。

「ライブラリってちゃんとreadme読んで使うものなのね」っていう今考えたら超絶当たり前のことを知ったのもこの時です。

もともとエンジニアになる前は、かの有名なrailsチュートリアルをやっていたわけなんですけど、railsチュートリアルは認証については自作なんですよ。

それを実践開発で、readmeをまともに読まずにgemに「devise」ってしっかり書いて、bundle installして、できたcontrollerにいきなりrailsチュートリアルの認証のアクションを書き始めたらもう大変。もう止まらないエラーの雨あられ。いくらWEB調べても全然出てこない。そりゃそうだよ…そんなことで間違えてるやつなんて滅多にいない。はい、ここにいました。

readmeはちゃんと読まなくちゃダメですね。

deploy(capistrano)問題

これも超激ハマリしたやつの1つ。 うちの特命エンジニアの釘宮がansibleを使って、すごーくいい感じにEC2にrailsアプリケーションをデプロイする方法をqiitaで書いたんですね。それが以下の記事なんですけど。

ansibleを使った事ない僕がansibleつかってawsにRails + Nginx + Unicorn 環境をセットアップをしてみた(まさかの手動あり) - Qiita

それで僕も同じことやろうとしたら、エラーが出続けまして。直しても直しても「あれ?」みたいな。徹夜してやっても結局ダメで、「こうなったら自分でやってやる!」って思って以下の記事を読みながらやっていたんですけど、「あれ?サーバーの環境構築はいいけど、これアプリのデプロイどうすんの?」ってなって。

さくらVPS契約後、最速でrails(MySQL+Apache)環境を構築する(CentOS6.2 - 2012年8月版) - Qiita

で、filezillaとかcyberduckとかのftpソフト使ってファイルをアップしようとしたんですけど、それもsshエラーが出てダメで。

それでにっちもさっちもいかなくなって、やべーーーーーってなった時に先輩エンジニアに相談したら「capistrano使えば?」みたいなまさに天の思し召し的なアレがきて。で、capistaranoであれば先輩も知ってるっていうので、いろいろ聞きながらなんとかデプロイに成功したんですよ。

え?経緯はどうでもいいから何が原因でどう解決したのかさっさと言え? ですよね。ごめんなさい。

つまりdeployの大きな原因はsshでした。

よくある方法で、ec2使ってやるにしても、ssh接続のためにconfigファイル書くとか公開鍵と秘密鍵の違いとかっていうのは、エンジニアであれば当たり前に知ってることだと思うんですけど、そういうのもいまいちわかっていなくて。

かつcapistaranoだとクライアントとサーバーの関係もあるけど、さらにgithubとサーバーの関係もあって。そこらへんがもう頭のなかでぐちゃぐちゃで当時は全然わからなかったですね。

なのでデプロイにつまったら、まず先にconfigファイルのhostとかhostnameとか、秘密鍵がサーバーの公開鍵と合ってるのかとかそこらへんからまずは疑いましょう。

設計に関する関係者の認識ズレ

これです。これが最もヤバかったですね。Aさんが考えていたこととBさんが考えていたことが違くて、後で合わせたら「あれ?これおかしくね?」みたいな。そこで全部やり直しすることになってっていう最悪のパターン。

自社サービスだからよかったですけど、これがお客さん相手だったらアウトでしたね。いくらベンチャーだからといって設計を甘く見ちゃいけませんね。むしろベンチャーでリソースが限られているからこそ設計はしっかりやるべきだなと。

特にチーム開発であればなおさらですね。全体像についても事前にすりあわせしておく必要があるし、できれば設計の段階でピクセル単位まで落としておいた方がいいと思います。後々になって細かな遷移で違うとかってなると、本当に痛い目に合います(>_<)

まとめ(教訓)

  • git checkoutしても元のブランチにちゃんとプログラムは残っています。gitは正しく使いましょう。
  • ライブラリのreadmeをちゃんと読みましょう。
  • deployで詰まったらまずは鍵とhostname周りを疑いましょう。
  • 設計は事前にちゃんとやりましょう。

それではまた。

世界を相手に腕を磨けるプログラミング学習サイト「Exercism.io」を使ってみた

少し前にWiredで世界を相手に腕を磨けるプログラミング学習サイト「Exercism.io」の紹介がされているのを見て、気になりはしたが試しはしなかった。

今回、ブログを書く順番が回ってきて、ちょうど良い機会なので使ってみた。

ログイン

f:id:genestream:20150127193335p:plain

Top画面には大きく the devil is in the details

直訳すると「悪魔は細部に宿る」だが「物事は細部が難しい」とか「細部をおろそかにすると痛い目に遭う」「細部に予想外の面倒が潜んでいる」などの意味があるらしい。

かっこいい。

ログインにはgithubアカウントがあればよく面倒なメールアドレスやパスワードの入力もない。

「LOG IN VIA GITHUB」を押してログイン。

ツールのダウンロード

基本的には問題を取得したり、回答して送ったりは専用のツール(CUI)を使う。

ダウンロードページがあるので簡単に導入できる。

僕はMacなので下記のページを見ながらインストールした。

http://help.exercism.io/installing-the-cli-on-mac.html

上から下へ順にコマンドをがしがし叩くだけで特に困る事なくインストールできた。

最後の最後で「Homebrewならたったこの2行のコマンドで行けるぜ!」とでてくる。

はじめに書いてほしかった。

Configure keyの登録

ログイン後、チュートリアルのページが表示されている。

ツールのインストールが終わったらチュートリアルに従って、下記コマンドを打とう。

exercism configure --key=[your api key]

API keyはアカウントのページでも見る事ができる。

問題の取得

下記コマンドを叩くとHomeディレクトリに問題が取得される。

exercism fetch

exercismというディレクトリの中に各言語のディレクトリがあり、各言語のディレクトリの中に問題が入っている。

言語一覧は下記だ。

clojurecoffeescript、cpp、csharp、elixir、erlang、fsharp、go、haskelljavascriptlispluaobjective-cocaml、perl5、pythonrubyscala、swift

普段アンドロイダーな日々をおくってる僕にとってJavaがない事実に気付いて心が折れそうになったが、Rubyで試してみた。

問題を解いてみる

Rubyのhammingというディレクトリがあったので中を除いてみると下記の三つのファイルがあった。

GETTING_STARTED.md README.md   hamming_test.rb

基本的にTDDでやっていこうというスタイルらしい。

GETTING_STARTED.mdにはざっくりいうと hamming.rb というファイルを作って hamming_test.rb のすべてのユニットテストをクリアしよう。進め方はTDD的な感じでというもの。

問題のレベルは至極簡単(まぁ一番初めだからかな)で、一言で言うとlengthの同じ二つの文字列の差分箇所数をだすというもの。実装して、テストが通ったのを確認した。

submit!

下記でsubmitできた。

exercism submit hamming.rb

submit後専用のページができた。

$ exercism submit hamming.rb

Submitted Hamming in Ruby.
Your submission can be found online at http://exercism.io/submissions/eebda98167924d08be977f0975a8d443

To get the next exercise, run "exercism fetch" again.

どうやらこのページでFeedbackもらえるらしい。(まだもらえてない。)

さぁ新しい問題を!

新しい問題を取得するときも下記のコマンドで大丈夫。

exercism fetch

やってみると、解き終わったRubyだけ新しい問題が追加された。

$ exercism fetch

                     New: 1 problem
        Gigasecond (ruby) /Users/user/exercism/ruby/gigasecond

unchanged: 19, updated: 0, new: 1

一問解いたら次の一問という感じでどんどんやっていける。

雑感

レビューはされることはあっても、なかなか海外の人にレビューされる機会を持っている人って言うのは稀だと思う。

また制限時間とかも特にないし、空いて切り替えたときとかに解いてみることもでき、気軽感があって良かった。

フィードバックが楽しみ。

新言語にチャレンジするときに知っておいたほうがいいこと

初めまして。昨年12月からジェネストリームのメンバーに加わった前當(まえとう)です。
元々AndroidアプリやWEBサービスを作成した経験がない私が、ジェネストリームに入ってからは日々、まだ知らない言語や技術に挑戦しています。
そんな中で、どんな言語に触れるにしてもこれを知っておいたほうがいいと感じたことがあるのでご紹介します。

 

どんな言語に触れるにしても知っておいたほうがいいこと、それは
エラーの追いかけ方
です。

「エラーの追いかけ方」とは

  • エラーログがどこに出力されるのか
  • デバッガはどうやって使うのか
  • デバッグログはどうやって出力すればよいのか

などを指します。

新しい言語にチャレンジしてHello, World!!やサンプルプログラムを初めて動かすと上手く動かないことが多々あると思います。
そんなときにエラーログやエラーメッセージがどこに出ているかがわからないと、なぜ動かないかを調べることができません。

また、エラーの原因を調べていく途中でデバッガを使用したり、デバッグログ(デバッグプリント)を出力する方法も知っておいたほうがいいです。
デバッグログ(デバッグプリント)については、C言語Javaで一番簡単な方法だと標準出力に文字を表示するという方法などがありますね。

当たり前のことかもしれませんが、プログラミングを始めたばかりの頃は忘れやすいので気をつけたいものです。
「エラーの追いかけ方」さえ知っていれば、あとはGoogle先生に質問することができますね♪