Vapor Trail

明るく楽しく元気よく

継続的な学習とやる気

やはり毎日コンスタントに少しづつでも学習し続けることが大事だと思う。

ある先輩が司法試験に落ちたときに、その先輩のことを知っている先生が、「あいつは波があるからな。やる気があるときはやるけど、やる気がないときはやらない。そうじゃなくて毎日コンスタントにコツコツできる人じゃないと受験勉強は受からない」って言っていてそのことを思い出す。

予備試験に合格したある後輩は、自分はその後輩が勉強している姿を見た事はほとんどない。が、なぜかいつも勉強していたという印象がある。

なによりもコンスタントにコツコツと何かをするっていうのが、一番難しいのではないかと感じている。何かを成し遂げた人って、大体、毎日少しづつでもなにかを積み重ねている。

そして、ほとんどの人はこれが出来ない。

なんでこんなことを言い始めたのかというと、来月あたりに子供が産まれるからです。

今までは休日のまとまった時間に本読んだり、コード書いたりして学習していたんですけど、これからは子供中心にいろいろなことが回っていくわけで、今まで通りにはいかなくなるわけです。

時間の使い方や学び方を変えていかないと、時間だけが過ぎて大して何もできない中途半端人間になって詰むと考えている。

なので自分の現在の能力と伸ばしたいスキルを見極めた上で、今の自分に適切な目標と計画を立てて毎日少しづつでもやり続けることに決めた。




参考

1.毎日コードを書く
John Resig(jQuery作者)
週末に頑張ろうとしていたが、失敗。
週末が平日と馬力で書けない、全ての週末が空いているわけではない。

この人は王立地理学協会に入会するために、働きながら毎日、本の翻訳をした。

キャリアにとって重要なことが書かれている

勤務時間外でスキルを習得する事はキャリアを築き上げていくのには不可欠。独学で学んだこれらのスキルは僕のキャリアのステップアップにおいて必要不可欠だった。

自身がどれくらいのスキルを持っているのか、それらがどれくらいの市場価値があるのかを把握するのは転職活動において肝要だ。選択肢は常になるべく多くとっておき、仕事の機会や貴方の市場価値についてのアドバイスを与えてくれる業界人等と話し合う機会を持つ事も大切。
陳列棚に置いてある牛乳が高価なものかそうでないかが分かるのは消費者がその市場価値を把握しているからだ。
貴方の市場価値は幾らですか?
もし分からないのであれば今日知っておきましょう。明日からではダメです。

他人があなたの能力を見抜いてくれることは先ず無いと考えた方がいい。自身の能力をアピールしないと言うことは、ある日突然「君みたいな能力を持った人材が欲しかったのだよ!」と誰かが尋ねてくるのを期待しているのとほぼ同義だ。はっきり言ってこういうスタンスではチャンスが巡って来る事はないだろう。

まわりのスキルがある人は、例外なく1日最低10時間は活動している。

「活動」と表現したのは、仕事以外で勉強をしている時間も含めている。 人によってはこれは残業とも表現できると思う。そして、これを残業とは決して認めない人も一定数いる。だから面倒なので「活動」と表記した。

こういう人と一緒に働きたかったら、自分も同じスタイルにするか、諦めるか、早い段階で決めてしまったほうが悩まなくてすむと思う。

スキルマップと方向性

 最近いろいろ迷走して何を学べばいいのかわからなくなってきていた。 たとえば、技術書読んでいても、今自分が学ぶべきことはこれなのだろうかと考えてしまって、あまり手につかなかったりした。

 そこで今の自分のスキルの棚卸しと今後どういう方向性でスキルを身に着け、何をするべきか考えることにした。ある対象を学ぶにあたって、自分の現在の能力を客観視し適切な段階を踏んで学ばないと努力が実を結ぶことはないと自分は考えている。掛け算もできないのに微分積分を学ぼうとするのは無謀だろう。英語を学びなおしたいと考えている人がいて、Be動詞からきちんと学びなおそうとする人を自分は馬鹿にしない。

 スキルの棚卸しをするにあたって、Dan Abramov先生の「2018年の段階で私が知らないこと」を参考に、現時点でできること・あまりできていないが努力・意識していること・できないことをありのままに書くことにした。

スキル・経験

  • HTML
    • HTMLタグを使用してWebページは作れる
    • MDNを参照しないと、 セマンティック・ウェブを意識したHTMLのマークアップはできない
  • CSS
    • idとclassはわかるが適切な命名・再利用性を意識した設計はできない
    • Bootstrap最高
    • CSSを書くのはBootstrapで実現できないことがあるときだけ (※クライアントが見た目にこだわらない&デザイナーがいないため、 基本的にBootstrapを使用して実装しており、極力CSSは書かないようにしている)
  • JavaScript
    • jQueryの使用のみ
    • jQueryを使用してフォームの簡易的なバリデーションやAjaxでバックエンドのAPIとデータの取得・送信はできる
    • ES2015とは何かを知らない
    • Promise・ThenなどはGuzzleで知った

結論:フロントエンドはかじった程度しかできない

  • PHP

    • FuelPHPを主に使用している
    • MVCに基づいた設計・実装
      Fat Controllerにしない、Viewにロジックを書かない、Modelにロジックを集約する、 複数のModelにまたがる処理はServiceクラスを作る、少数の大きなクラスより小さなクラスをたくさん作るようにしテストしやすいクラスを作る
      などを意識して実装するようにしている。
    • 保守と再利用がしやすいような設計をするため、オブジェクト指向デザインパターンの本を読み学ぶようにしているが、実際に使いこなせてはいない
    • テスト駆動開発を実践しようとしたことはあるが、うまくいっていない
    • APIの設計・ドキュメントの作成(API Blueprintを使用)は一応できる
    • PHPUnitを使用したテストが作成できる
    • Laravelは実務で使ったことはない
  • DB(MySQL)構築・テーブル設計

    • 数億件のレコードが保存されるテーブルの運用経験を通して、パフォーマンスのボトルネックはDBのIOから発生することを身をもって知った
    • DB設計の変更は影響範囲が広いためアプリケーションの設計の変更よりも難しく、DBの設計がアプリケーションにとって最も重要だと学んだ
    • テーブルの正規化(第3正規形まで)、将来的に何件のデータが入る可能性があるのか、どういうクエリが発行されるのか、どのカラムにインデックスを貼るべきか、パーティション分割するかなどSQLアンチパターンに当てはまらないようなテーブル設計ができる
    • ERMasterというツールを使用してER図を作ることができる
    • 基本的なクエリの発行はできる。SELECT,INSERT,UPDATE,DELETE,WHERE,JOIN,EXPLAIN,DISTINCT,COUNT,GROUP BY,EXISTS,INとかはざっと思いつく
    • ただDB構築にあたってのメモリ・ディスクサイズの見積もりなどはできない
    • OS・MySQLレベルのチューニングはできない
  • インフラ

    • さくらVPSさくらのクラウドを使用したサーバ構築はできる
    • シンプルで簡単なインフラ構成なら設計(draw.ioで構成図を作成している)、Terraformによるインフラ作成の自動化はできる
    • サーバの構築・セットアップ(CentOS)は一応できる
    • が、障害時のための高可用性を考慮した設計や負荷が高まったときにロードバランサーを用いてサーバを割り振る、CDNを使う、などの知識や経験はない
    • またネットワークについてはほとんど何も知らない
    • Linuxの最低限のコマンド操作はできるが知識は浅い。 よく使っていて思い出せるのは、cd,ls,grep,ll,top,sar,ps,vi,touch,mkdir,rm,cat,head,tailくらい。あとはググる
    • AWSは「手を動かしながら2週間で学ぶ AWS 基本から応用まで」をやってクラウドラクティショナーを取得したが、実務で使用したことはない
  • 設計・実装・運用・保守・機能追加・設計ミスの経験
    この約1年半ほどずっと同じWebアプリを担当している

    • お客様とのやりとりは営業の人がやってくれているが、運用フェーズに入ってからは、この半年間はほぼ一人で作業しており、設計・実装・運用・保守・機能追加を一通り経験した。 この記事1で書かれていることを経験できたので良かったと思う。
    • 誰も助けてくれないので、自力でなんとかする力は身についた
    • 一方で、期限に間に合わせるためにあまり深く考えずに動くものを作るというやり方が身についてしまっている
    • また工数の見積もりをするのは得意ではない
    • 小さい会社なので、ほぼ一人で作業しており、チームで何かを作った経験はない
    • そのためコードレビューも受けたことがない
    • ただベトナムのオフショアへの指示や連携は経験している
    • Redmineを使用したチケット駆動開発
    • Gitの基本的な使用に支障はない。Git Flowは一応理解している(と思っている。一人で開発している分にはコンフリクトが起こらないしブランチ戦略も特に必要ないので)。
  • これから身につけたいこと

基本的な姿勢として今までフロントエンドはほぼやらないことにしていた。
やらないと言うと語弊があるかもしれないが理由としては、

  1. 変化が早いため身につけた知識が廃れやすいこと
  2. 手を広げすぎても器用貧乏になるだけだから
  3. フロントエンドとバックエンドで分業されている現場が多いと思うから (実際はフロントエンドとバックエンドの垣根がなくなってきているかもしれない)
  4. 現在の職場でほとんど必要とされていない

もちろん知らないより知っていたほうが良いに違いはないが、時間は有限なので学ぶ内容は集中すべきだと考えている。

身につけたいことを書くにあたって、達成可能な具体的な目標を設定することにした。

  1. Linuxの知識を身につける
    アプリケーション作る上で何やるにしてもLinuxありきだし、あまりにもなんとなくでやっているのでLinuxの知識をきちんと身につけるべきだと考えた。(最近、ローカルの開発環境をVagrantからDockerに変えたこともあって、いかにLinuxの知識がないかを思い知ったこともあるし、あとはコンテナ技術の知識もこれからマストになるような気がする)
    自分の身につけたい知識を網羅していると思われるLinuCのLevel2を目標にしたい。また自分の現在のレベルに適切だと考えたので『新しいLinuxの教科書』、『ふつうのLinuxプログラミング 第2版』を買って読むことにした。
    ・資格について
    結局実務経験が優先されるので、ここ半年若干資格取る意味はあるのかと悩んでいたが、いくら「できます!知識あります!」と言っても証明できるものがないので、やっぱり客観的に証明できるものとして資格を取る意味はあるのかなと考えている。
    例えば漠然とLinuxの知識身につけたいなと考えたとして、 目標がないと本を1回読んでわかった気になって終わりそうなので、LinuCのLevel2を目標に設定した。

  2. 設計を学ぶ
    設計が一番大事だと考えているので、オブジェクト指向デザインパターンを理解できるようにしたい。
    『Head First オブジェクト指向分析設計』をPHPで写経する。
    『Head First デザインパターン』をPHPで写経する。

  3. Goの学習
    実務でGoを使用したAPIサーバの実装をするので、Goのスキルを身に着けたい。 ただ客観的な目標を設定するのが難しい。一応『プログラミング言語 Go』を読み込むことを目標にする。


  1. ポートランド・ウェブワークスで得た一番の教訓は「どうやってシステムをデザインするかは、その後に多大な影響を与える」ってことだ。とても小さい会社だったので、ぼくはとても自由に仕事をさせてもらった。自分で書いたコードは、働いていた2年半の間、全部メンテしていた。ソフトウェアの開発に最初から最後まで関わるという経験はとても貴重だったんじゃないだろうか。なぜなら、プロジェクト開始時のダメなデザインのしっぺ返しを、後で自分でモロに受けるからだ。”ぼくはこうしてプログラミングを覚えた

さくらのクラウドをTerraformから作る

さくらのクラウドをTerraformから作る

わざわざTerraform使わずにコンパネからポチポチ作れるが、Terraform使ってみたかったしテスト環境とか複数の環境用意するときに手順忘れるので使ってみた。

sacloud.github.io

バージョン

CentOS7
Terraform v0.11.13
Terraform for さくらのクラウド v1.11

インストール

curl -L https://releases.hashicorp.com/terraform/0.11.13/terraform_0.11.13_linux_amd64.zip > ~/terraform/terraform.zip
unzip terraform
echo export PATH=$PATH:~/terraform/ ~/.bash_profile

http://releases.usacloud.jp/terraform/

さくらのクラウド for terraform をterraformのディレクトリに入れる

mkdir sakura
vi sakura 
provider "sakuracloud" {
    token = "[ACCESS_TOKEN]"
    secret = "[ACCESS_TOKEN_SECRET]"
}
terraform init

動く

Initializing provider plugins...

The following providers do not have any version constraints in configuration,
so the latest version was installed.

To prevent automatic upgrades to new major versions that may contain breaking
changes, it is recommended to add version = "..." constraints to the
corresponding provider blocks in configuration, with the constraint strings
suggested below.

* provider.sakuracloud: version = "~> 1.11"

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

qiita.com を参考に進める

環境変数に設定して使うこともできる
export SAKURACLOUD_ACCESS_TOKEN=
export SAKURACLOUD_ACCESS_TOKEN_SECRET=
export SAKURACLOUD_ZONE=tk1v
  • tk1a … 東京第1ゾーン
  • is1a … 石狩第1ゾーン
  • is1b … 石狩第2ゾーン
  • tk1v ... サンドボックス

SAKURACLOUD_ZONEをサンドボックスにすると、料金がかからないで作ったり壊したりできる。ありがたい。

manual.sakura.ad.jp

terraformの基本的なコマンド

terraform init
terraform validate
terraform plan
terraform apply
terraform destroy

  • グラフ化
terraform graph > input.dot
dot -Tpng <(terraform graph) -o dependency.png

参考