読者です 読者をやめる 読者になる 読者になる

futoase

よろしくお願いします。

Webアプリケーションエンジニアとして1年間働いてわかったこと

人生 雑記 開発

流れ

freeeという会社に2014年6月に入社してから2015年いっぱいまでインフラエンジニアとして働いていた。 2015年の秋が終わる頃、「サービスのことがわからない人としてやってくのはこの先気持ちが厳しいかも」 という強迫観念に近い思いが込み上がってきた。

早速会社のQiita::Teamに 「インフラエンジニアからWebアプリエンジニアになりたいです」 という旨の記事を書いたところ、翌年(2016年)から会計freeeのWebエンジニアとして働くことになった。

バンザイ。

早速変わったものの、、

2016年になり、Webアプリエンジニアになった。 React.js, Rails。おー、みんな喋ってる言葉だ。それに俺も触れることができるのか。 ワクワク感でいっぱいだった。が、甘かった。

インフラエンジニアのときにRDBへの接続を切り替えるgemを書いていたので Railsについてはある程度詳しかったものの、それはFrameworkやシステム面での詳しさであって、 サービスロジックはさっぱりだった。

特に会計ロジックについては会計処理を知らなければ実装できない・メンテできない。 Model/Service間での会計ロジックの表現・計算・ドメイン解決をどのようにしているのか 実装しながら、コードリーディングをして追っていった。わからなければagコマンドにより 気になった処理のフェーズを成果物以下すべてから検索し、関連してると思われるソースコードをすべて読み漁るというやりかたをした。

複雑なロジックで理解はすぐにできないことが多かった。が、複雑なことだけあって面白かった。 時間をかけて理解を自分の中に落とし込んでいくというプロセスがとても楽しい。

心のもやもやが取れていく

しばらくして、既存機能の問題を解決する、改善することから 新機能を作るということができるようになった。

なるほど、新しい機能を作るにはこうすればいいのか、こうこうすればいいのかとわかっていく。 インフラエンジニアをやってるときに見えなかったサービス側の処理が見えてくるので楽しくなっていった。 これはいい。心のもやもやが取れていく。

サービス開発は瞬発力・突破力・まきこみ力

みたいな感じを受けた。品質大事だし、開発プロセスも大事だし、 何よりメンテンナンス性も大事。でも思ったのはこの3つ。

瞬発力

  • 早く実装する
  • スタートを切れるように意識する
  • 調査期間が必要な開発であっても長期はかけないようにする
  • 調査期間・初期設計での手応え/経験をチームで共有する
  • ランニングはスタートを切るのがだるい。そんな要領でとりあえず始めればものごとは動く。と思って動く。

突破力

  • どんどん突破していく
    • 乗り越えなければ、乗り越えられなければかわさねば...
  • xxは無理ですという場合は無理ですを取り除けるところをどんどん話す
  • yyはどうしても無理ですというのであればyyの無理な点を洗い出す
  • 無理と思う源は理解していない不安からくることが多い。その場合はとにかく突破するしか無い。
    • やるしかない、やらなければ製品・機能は世に出ない 😇

まきこみ力

  • ふわっとしているけど、目的はなんとなく定まった機能を作ることになったときのこと。
  • あっ、自分まだ会計freeeのドメインについてそこまで詳しくない
    • どう使われているか、フィードバックをお客様からもらっているかよくわからなかったりする
    • つまり、課題が見えない
  • カスタマーサポート、プロダクトマネージャ、セールスなどいろいろな人を1つのミーテイングにとりあえず集める
    • 話したことがない人も居るがやらんとだめだ
  • 話しているといろいろな課題が出てくる
  • 見えてくるそれぞれの立場からの意見
  • その中で1つ、できそうなことをつまむ
  • 1つできそうなことをすればほかのこともできますよねっていう感じで話を進めていく
  • 軽い感じでできたら、Slackで即連絡する
    • かなり躓いたこともあったが、躓いたときもSlackで都度連絡していた

初めて新しい機能を作ったときの実感

感動があった。サイコーって感じ。高揚感にちかい。 インフラエンジニアも高揚感を感じるような仕事も多いが、 お客様や自分自身の問題、揺れ動く現実に対処するものを出したという達成感が半端なかった。

インフラエンジニアから変わってみてよかった

よかった。もやもやしながら2016年を過ごすことにならなくて。 あと周りのWebアプリケーションエンジニアに今のインフラの仕組みについて話すことができたりするので それも良いかもなと思っている。

ちょっとインフラ側を触らなければならない作業がでたとき、 不安に思ってるアプリ側のエンジニアに「大丈夫だよ」とか言って 作業自身その人に任せられるように伝えるということをしたりした。 その後その人自身がインフラ側をさわるか、またはインフラエンジニアチームに 直接やりたいことと何をしたいかを伝えて作業をどんどん進めるようになっていった。

自分にとってそういうのが良いよなぁ、ちゃっちゃとするのが大好きだし。 と、今までエンジニアをしていて思っていたので今それができているので最高である。

インフラエンジニアであってよかったなと思ったこと

Qiitaに書いた以下の記事の仕事を今年最後1,2ヶ月やってみた。

qiita.com

QA基盤を作る仕事なのだけど、 VPC作成してRouting tableを適切な形で設計してSubnet切った後、 うまい具合にdocker-selenium hub, node それぞれのcontainerを立ち上げつつ、 ネットワーク上でくっつけてnodeはauto scalingで増減できるようにしておく。 Jenkinsからjob叩ける用にした。

E2Eテスト対象となる環境を最新のsource codeにするべくgit pullを行い、 rake db:migrate, webpackによるassets作成できるようdigdagでフロー化した。

こういうの、インフラエンジニアをやってなければ心が折れてた気がする。 その点について経験が役立ってる気がする。

2017年は

2017年もWebアプリケーションエンジニアとして働く。

が、mobileも触りたい、メンテしたい、作りたいという心の躍動が抑えられない。 システムプログラミングや、機械学習の勉強会が社内で始まったので参加したいし、 色々ある。目標を定めすぎずいろいろやっていきたい。

お知らせ

freeeではエンジニアを通年募集している。👇

jobs.freee.co.jp

詳解MySQL 5.7を読んだ

読書 開発

詳解MySQL 5.7を読んだ

MySQL 5.7のアップデート情報について説明がかかれている。 175の新機能について小さいものから大きなものまで取り上げられていた。

MySQL そのものの機能も知れる良さ

MySQL 5.6ではこうだったが、5.7ではこうなるという記述があり、 そのたびにMySQLでこういう機能があったのか、とか オプティマイザにこういう問題があったのかというのを知れる。 知らないことだらけなので黙々と読みきった。

スレッドの扱いや、ページサイズの対応、TRUNCATE TABLEのアトミック対応など。 その点についてMySQL 5.6を使っていても特に意識していなかった。

MySQLを普段から触っているエンジニアであれば、 MySQL 5.7というバージョンへのこだわりではなく MySQLそのものを知れる本なので読んだほうが良いと思う。

ただ、新機能175個すべてを頭にいれ、また手元で試す時間はなかなか見つけられないので できそうなものをやっていく。

Server side Swiftに触れてみる

プログラミング swift

Server side Swiftに触れてみる

swift.org

昨年からServer side Swift という単語が見られるようになってきた。

Swift については 2014年のWWDCで発表されたプログラミング言語

iOS, macOS など Apple製品向けとして、また処理系は2015年末にOSSとして公開され、 現在はUbuntu上でもSwiftで作成した成果物を利用できる。

Swiftのオープンソース化、Swift 3.0のロードマップ

mobile開発向けの言語でもありserver sideでも利用できる。 Kotlinのようだ。Swiftについて以前から利用したいと思っていたが、手を出していなかった。 今回、最小限のものを作ってみて理解を深めようと思う。

開発環境

私が利用している開発環境/OSは

である。

処理系のインストール

homebrewを使ってSwiftをインストールする。

> brew install swift

まず、Hello world

何をつくるか、がわからない。とりあえずHello worldをやってみたい。 Swift 3.0からpackage-managerというパッケージを作る機能(Rustのcargoみたいな)があり、 library/module のスケルトン(ディレクトリ構造など)を作成してくれる。

Swift.org - Package Manager

ディレクトリを作り、moduleを作る

ディレクトリを作り、ディレクトリの中でコマンドを実行する。

> mkdir -p hello-world
> cd hello-world
> swift package init

swift package init
Creating library package: hello-world
Creating Package.swift
Creating .gitignore
Creating Sources/
Creating Sources/hello_world.swift
Creating Tests/
Creating Tests/LinuxMain.swift
Creating Tests/hello-worldTests/
Creating Tests/hello-worldTests/hello_worldTests.swift

moduleの成果物を生成、テストを行える状態になっている。

> swift build
Compile Swift Module 'hello_world' (1 sources)
> swift test
Compile Swift Module 'hello_worldTests' (1 sources)
Linking ./.build/debug/hello-worldPackageTests.xctest/Contents/MacOS/hello-worldPackageTests
Test Suite 'All tests' started at 2016-12-10 12:12:50.328
Test Suite 'hello-worldPackageTests.xctest' started at 2016-12-10 12:12:50.329
Test Suite 'hello_worldTests' started at 2016-12-10 12:12:50.329
Test Case '-[hello_worldTests.hello_worldTests testExample]' started.
Test Case '-[hello_worldTests.hello_worldTests testExample]' passed (0.003 seconds).
Test Suite 'hello_worldTests' passed at 2016-12-10 12:12:50.332.
         Executed 1 test, with 0 failures (0 unexpected) in 0.003 (0.003) seconds
Test Suite 'hello-worldPackageTests.xctest' passed at 2016-12-10 12:12:50.332.
         Executed 1 test, with 0 failures (0 unexpected) in 0.003 (0.003) seconds
Test Suite 'All tests' passed at 2016-12-10 12:12:50.332.
         Executed 1 test, with 0 failures (0 unexpected) in 0.003 (0.004) seconds

コマンドを作るには

コマンドを作るには、package オプションの引数を追加すれば良い

> swift package init --type executable
Creating executable package: hello-world
Creating Package.swift
Creating .gitignore
Creating Sources/
Creating Sources/main.swift
Creating Tests/

executable オプションを付けると、main.swift のみが作成される。 main.swiftの中身は、print文のみだ。

print("Hello, world!")

ビルドし、成果物として出来上がったバイナリを実行することができる。

> swift build
Compile Swift Module 'hello_world' (1 sources)
Linking ./.build/debug/hello-world
> ./.build/debug/hello-world
Hello, world!

main.swift がエントリポイントになっている。 main.swiftをSourceの下に作成すれば、実行バイナリが生成される。

Web applicationを作る

簡素なWeb applicationを作ってみようと思う。

> mkdir simple-web-server-swift
> cd simple-web-server-swift
> swift package init

利用するlibrary

簡素なWeb server を作ることができるZewoを利用する。

github.com

パッケージの設定

Package.swift に依存関係を追加する。

import PackageDescription

let package = Package(
    name: "simple-web-server-swift",
    dependencies: [
        .Package(url: "https://github.com/Zewo/HTTPServer.git", majorVersion: 0, minor: 14),
    ]
)

main.swiftに書く

main.swift に書く。README.mdのものを使う。

import HTTPServer

let log = LogMiddleware()

let router = BasicRouter { route in
    route.get("/hello") { request in
        return Response(body: "Hello, world!")
    }
}

let server = try Server(port: 8080, middleware: [log], responder: router)
try server.start()

ビルドする

依存関係をいろいろと解決してくれる。

> swift build

ビルドが成功した。成果物としてのコマンドを実行する。

./.build/debug/simple-web-server-swift 



                             _____
     ,.-``-._.-``-.,        /__  /  ___ _      ______
    |`-._,.-`-.,_.-`|         / /  / _ \ | /| / / __ \
    |   |ˆ-. .-`|   |        / /__/  __/ |/ |/ / /_/ /
    `-.,|   |   |,.-`       /____/\___/|__/|__/\____/ (c)
        `-.,|,.-`           -----------------------------

================================================================================
Started HTTP server at 0.0.0.0, listening on port 8080.

サービスが立ち上がった。

f:id:syanbi:20161210133301p:plain

かなり気軽に作れた。

ドライバなど調べてみると...

AWS SDKを利用したいと思ったが、

AWS iOS SDK について Swift Package manager が対応していない。Package.swiftが無い... ので対応待ち。 cocoa podsを入れてやってみるというモチベーションはわかなかった。

DB用のドライバ

以下のものがあった。

Swift package managorに対応している。

その他のドライバについて

Perfect というWeb frameworkプロダクトがあり、 そのプロダクト内の成果物としてコネクタやライブラリがある。

Redisであれば以下。

https://github.com/PerfectlySoft/Perfect-Redis

言語としてのSwift

特徴

Optional (nil代入可能) や Null safety (?演算子によるnil参照)、型推論があること、があげられる。 qiita.com

サーバサイドで利用するときに気になる点

スレッドセーフ、Goのgoroutine, channelに準ずる機能の実装に関して 以下のドキュメントに書かれていた。

Concurrency.rst

要約すると

  • ネイティブ(APIを利用しない形)でのスレッドセーフのサポートレベルはC++と同程度
  • Stream, Taskを利用することでGoのchannel, goroutineと同等のことが行える
  • 非同期処理をサポート(async, await)
  • Actorによるメッセージ非同期処理をサポート

という感じだ。モダンだなこれ。

Copyright (c) 2013-2015 Keiji Matsuzaki