"@kon_yuさん"フルコミットCTO辞めたってよ
現職の正社員のCTOではなくなりました。 現在はフルコミットではなく、週3日開発にたずさわって全力投球しています。
後半に連れてエモい話になって行くので、面倒な人は要約を読んでウィッシュリストからなんか送ってください(新日のTシャツとか)
要約
- 技術顧問とフリーランスの開発案件を承ります
- インプットとアウトプットのバランスを取りたい
- 何をやるかより誰とやるか
- 最近の興味は労働生産性を上げる事
- Amazonウィッシュリスト公開してみた。書籍については一つ工夫をしてみた
このような活動をしていきます
- 技術顧問の領域を増やします
- エンジニアの採用補助します
- 設計のレビュー致します
- 戦略の開発項目の相談します
- モダンな開発環境・チーム構築いたします
- エンジニア採用面接お手伝いします
- フリーランス開発を増やします
- エンジニア転職の相談承ります
まずは相談ベースでコンタクトしていただけると助かります。 下記に載せるAmazonのウィッシュリストで何か送ってくれた人から待ち行列のキューの優先度を考慮したいと思います。
ほしい物リスト 奮ってご応募ください
業務経歴書と言うか技術者としてのプロフィールはWantedlyのプロフィールページが一番ちゃんとメンテしてるので貼っておきますね 業務経歴書的なプロフィール
なぜフルコミットを辞めたのか?
理由は2つ
理由一つ目 技術顧問の活動領域を増やすため
去年(2015年)から2社ほど技術顧問をしているうち、圧倒的に関われる時間が少なかった。その活動する時間を増やしたかった。 いままでの技術顧問で扱っていた内容は以下のような感じで、関わっている時間は週に1時間から2時間程度だった
特にissueベースでの質問する場合、issueを立てる側の顧問先のエンジニアのスキルやとれる時間の関係で、何が課題となりえるのか、将来的な問題になりそうなところはないか見えずらい。 もっと顧問先のコードベース俯瞰的に見る時間かけて、戦略ベースでどこに注力するべきかを総合してアドバイス(ないしは実装)して行こうかと思っている。
さらに基本的にやれることは上記のことに加え
- 設計のレビュー
- 戦略の相談に乗ります。開発タスクの順番の相談
- モダンな開発環境・チーム構築いたします
- エンジニアの採用補助
小さい会社のCTOが孤独という話と、技術がわからない人がエンジニア採用するのが難しいと言う話をもう少し説明すると
小さい会社のCTOは孤独
スタートアップや小さい会社だとCTOまたはリートエンジニアクラスと他若手数名と言う体制だと、 技術的な決定をする「このライブラリを使っていいだろうか?」「この開発言語で進めていいだろうか?」「AWSでほんとにいいのだろうか?」このようなときに相談できるレベルの相手がいないのである。
経験豊富なエンジニアと議論して「これで行きましょうと」合意すると先にすすめる不安が払拭される
自分もRailsのバージョンを3系から4系に上げるときに、週に数日手伝ってくれた@Oakbow7のおかげで大変助かった。もちろんコードを書いてもらって助かったが、技術的な議論ができたことがかなり助けになった。
この経験は他の人にも体験してもらいたい精神的な安寧を手に入れて欲しい。
技術がわからない人がエンジニア採用をすると失敗しがち
いままで外注でサービスを作っていた会社が、自社でエンジニアを採用するときに誰を採用したら良いのかわからないと言うような相談を何度か受けたことがある。 かなり大きな企業の採用担当者の方も同じようなことを言われていて、口がうまいプレゼン上手だけど他の能力がオンボロなのを採用してしまったりなどある。
採用時に誰を採用したら良いのかについて、マッチしそうな人を紹介したり、テクニカルな方の面接を代行したり採用担当者と一緒に面接に同席したりと関われたら良いかなと思っている
理由ふたつ目 インプットの量を増やしていきたい
これは単純にアウトプットの量よりインプットの量が減っている そのために、インプットする時間を確保したい
iOSの開発もしたいし、趣味の電子工作もしたいし、もっと英語が話せるようになりたい(いまは一人で海外旅行はできるけどガッツで英語を話している程度)
技術書以外の読書量が激減していてるので、語彙が減ってると自覚がある。語彙は知性の現れだと思うし、知性のない人はあんまり好きじゃない。好きじゃないものに自分がなるのは嫌だろ?
次に何がしたいか?
それなりにキャリアがあるので、普通にフリーランスのエンジニアとしてはそれなりに食べられるし、どこかの会社に入るのもいまのところ合う合わないのマッチングの問題だけで、少なくとも首都圏に住んでる分には選択肢は多い。 このちょっと贅沢な状況で、次何をするのかはかなり悩ましい問題だ。
今年で3回めの歳男なわけさ、元気に走り回れる年齢がせいぜい50歳ぐらいだとするとあと15年ぐらいなわけ。 けっこうリアルな数字だろ?
その元気に走り回れるうちにどうやって過ごしていきたいかを考えた時に思ったのが、「オレがウェブサービスで世界を変えるぜ」よりも、「時間や場所にとらわれずに旅するように働きたい」や「何をするかより、誰と働くか」だった。
誰と働きたいか
一言で言えば背中を任せて戦える仲間を探していきたいなんだけど、この誰と働くかに関してはもやもやしていてきちんと文章に出来ないので今思ってることを箇条書きにすると以下だ
- 37signals(現basecamp)や、bufferのような場所や時間にとらわれない働き方に好感を持っている人
- ムダに長い会議をどうやったら短く出来るかなど常に考えられること、KPTなど振り返りをして全体最適化に頭を回せる人
- 創造性が高い仕事は同じオフィスで働かないと生まれないではなくて、なぜ席が近いと創造性が発揮されるのかや、距離が離れたでも創造性を発揮するにはどうしたら可能なのをかを考えようとする人
- がっちり組織というよりはそれぞれ自立していてヤマがあったら協力して働くといった感じがいいな、the guildがそのイメージに近いかもしれない
- 技術を使ってくだらないものを作る人がいい
もやもやしているので、よく人に合うようにしている
Web系企業の部長職やCTOクラスの人にあったり、はたまたフリーランスのエンジニアの人にあったりと積極的に人に合うようにしている
一般的に言う大企業でキャリアを積んでいる人にも合ってみたい。 ちょっと話を聞いてやんよ って人は@kon_yuまでメンションなりDMをください
ほしい物リストの公開とそのちょっとした施策
ほしい物リストの公開するのって今までやったことがなかったんだけど、退職エントリなどでちょくちょく友達に物を送ったりするようになったので自分も公開してみることにした
ほしい物リストリンク
書籍に関してちょっとした施策
ほしい物リストには書籍が多く、送ってくれる人にとって知りたい情報を替わりに読んで原稿用紙2枚程度(800文字)のレビューを書こうと思う。
- 「この本買おうかどうか迷っているが、自分にとって役に立ちそうか」
- 「こういうことが知りたいのでこの本で解決できそうか、また解決できるところを抜き出して教えてほしい」
このように本を読んだ自分の感想ではなく、送ってくれた人にパーソナライズして役に立つかどうかを伝えられると両者得なんじゃないかな。
レビューの例として、先日読んだ「ともに戦える「仲間」の作り方」という本のレビューを参考にしてもらいたい。 もらった本のレビューはもう少しちゃんと書くつもりだがイメージは掴めるだろう。
ネットに疎いけどウェブサービスで起業した元エリートって言う、スタートアップ界隈にいるよくいる感じです。 わかってないのに開発を外注して失敗してるという、スタートアップあるあるをしています。 1/3読んだ時点では、エンジニアの自分としては嫌いなタイプですね、これが残りの2/3で変わっていく、雇われているエンジニアとしては好ましい経営者になっていく 内容は、リーンスタートアップなど読んだことある人にはこれと言って新規で得られる知見はないかもしれない。事例として現在も日本で稼働しているサービスなのでよりリアルに感じられるかも。内容はこんな感じ ・エンジニア無しで外注でシステムを作るとうまくいかない ・夢を詰め込み過ぎてMVPでリリースしないとうまくいかない ・事業に共感してくれる仲間を探すために積極的に人に会って、たくさん自分のやりたい事業を説明しましょう 心に響いたのは 南さんがたくさんのエンジニアに合って「仲間になりましょう」と言っても、エンジニアから「仲間と言っているが、利用してやろう」と言う気持ちがすけて見えると指摘されていた点 けっこう起業家というか、エンジニア出身じゃない人が採用イベントで使うこの「仲間」って言葉に力が無い。と言うのはよく見かける 一番良いのは、ビズリーチをCMを打てるまで成長させた南さんが導いた結論が、「何をやるかより、誰とやるか」と言っているところ。オレもそう思ってるけど、ちゃんと成功させている人の言葉のほうがしっくり来るだろ?
SwiftでRealmを使う
はじめに
アプリ内にデータを永続化させる方法として内部的にsqlite3を使うCoreDataは素で使うのはけっこう大変、 CoreDataのORMのライブラリMagicalRecordやSugarRecordを使う方法もある。
RealmはSqlite3ではない高速なDBと、ORMがコミコミで使い方を簡単も簡単(らしい)
Android, iOS含めデファクトスタンダードになるつつあるRealmを使ってみる
ゴール
- Realmをプロジェクトに含めて設定する
- Realmを使って読み込み・書込する
動作環境
※プロジェクトの設定等はこちらの記事を参照 http://konyu.hatenablog.com/entry/2016/05/20/192759
CarthageでRealmを追加し、プロジェクトで使用可能にする
iOS向けのライブラリをCarthageを利用して取得する
コンソールからXcodeプロジェクトのディレクトリに行きCartfileに以下を追記する
github "realm/realm-cocoa"
Carthageを利用してライブラリのバイナリを取得する
> carthage update --platform iOS realm-cocoa
Xcodeプロジェクトルート/Carthage/Build/iOS の下に書きファイルが作成されていればOK
- Realm.framework
- RealmSwift.framework
※ realm-cocoaとライブラリ名を指定してあげないと、Carthageに書いてあるすべてのライブラリを更新使用してしまうので注意が必要
--platformでiOSを指定してもrealmの場合はBuildディレクトリに各プラットフォームにコンパイル済みのRealm.frameworkやRealmSwift.frameworkが作成される。 --no-use-binariesオプションをつけるとソースからコンパイルする このへんはCarthageというよりは各ライブラリのCarthage向けの設定の問題かもしれない
XcodeプロジェクトにRealmのライブラリを紐づける
Xcodeでプロジェクトを起動しプロジェクトファイルを開き、Generalを選択、Embedded Binariesに先ほど作った
- Realm.framework
- RealmSwift.framework
を追加する
次に、プロジェクトファイルのBuild Phasesを選択、Run ScriptのInut Filesに以下を追記する
$(SRCROOT)/Carthage/Build/iOS/Realm.framework $(SRCROOT)/Carthage/Build/iOS/RealmSwift.framework
コンパイルが通ったら成功
Realmを使って書き込み・読み取りをする
Realm browserをインストール
書き込みの確認のためにRealm browserをインストールする https://itunes.apple.com/app/realm-browser/id1007457278
Realmモデル作成の準備
XcodeのパッケージマネージャAlcatrazのインストール
HomebrewのようなXcode向けのパッケージマネージャAlcatrazをインストールする http://alcatraz.io/
コンソールから下記の実行して、xcodeを再起動する
curl -fsSL https://raw.githubusercontent.com/supermarin/Alcatraz/deploy/Scripts/install.sh | sh
WindowメニューにPackege Manegerの項目が増えていたら成功
RealmPluginをインストールする
先ほど入れたAlcatrazを利用するためにXcodeのWindowメニューPackege Manegerを開く Searchのウインドウに「RealmPlugin」と入れて検索してヒットしたRealmPluginをインストールボタンを押してインストールする インストールが完了したらXcodeを再起動し、新規ファイル追加するメニューに「Realm」があり、その中に「Realm Model Object」が選択できるようになっている
Realmモデルの作成
新しいファイルから「Realm Model Object」を選択しクラス名をRealmTestとする
import Foundation import RealmSwift class RealmTest: Object { // dynamic修飾子を付けないとあかん、なぜかは説明を読んでも説明に見がわからんので、今のところおまじない dynamic var name = "" dynamic var number = 0 // Specify properties to ignore (Realm won't persist these) // override static func ignoredProperties() -> [String] { // return [] // } }
Realmで書き込みをする
アプリ起動時に実行するViewController.swiftのviewDidLoadメソッドに追記する シミュレータを起動して書き込みを行う
import UIKit import RealmSwift class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // モデル作成 let myRealm = RealmTest(value: ["name" : "なまえ", "number": 100]) // デフォルトRealmを取得する(おまじない) let realm = try! Realm() // トランザクションを開始して、オブジェクトをRealmに追加する try! realm.write { realm.add(myRealm) } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }
Realm browserで書き込みを確認する
Realmで書き込まれれると default.realmファイルというものに書き込まれる。 (たぶんdefault以外にもファイル名を変えられたり複数ファイルを使ったり出来るんだろうがそれはまた別のお話)
Realm browserからシミュレータにあるrealmファイルを開く
realmファイルの場所については以下の記事が詳しいく書いてある http://stackoverflow.com/questions/28465706/how-to-find-my-realm-file/28465803#28465803
Realm browserを起動して、ダイアログでrealmファイルの場所を指定する際には、「Cmd + shift + g」で絶対パスを利用すると便利 /Users/ユーザ名/Library/Developer/CoreSimulator/Devices/デバイスID/data/Containers/Data/Application/アプリID/Documents/default.realm
このように書き込まれているのを確認できる。
Realmで読み取りをする
書き込みをしたコードの直下に、読み取り部分のコードを追加する
import UIKit import RealmSwift class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // モデル作成 let myRealm = RealmTest(value: ["name" : "なまえ", "number": 100]) // デフォルトRealmを取得する(おまじない) let realm = try! Realm() // トランザクションを開始して、オブジェクトをRealmに追加する try! realm.write { realm.add(myRealm) } // 追記 読み取り部分////// let objs = realm.objects(RealmTest).filter("number == 100") if let obj = objs.first { print(obj) } // 追記終わり } }
コンソール画面にprint出力した結果が表示される。
RealmTest { name = なまえ; number = 100; }
refs: https://realm.io/jp/docs/swift/latest/
本気ではじめるiPhoneアプリ作り Xcode 7.x+Swift 2.x対応 黒帯エンジニアがしっかり教える基本テクニック (ヤフー黒帯シリーズ)
- 作者: 西磨翁
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2016/02/27
- メディア: Kindle版
- この商品を含むブログを見る
XcodeでGitのリモートリポジトリでソース管理する(Carthage対応)
はじめに
OSSライブラリを利用するのにCarthageを使ったXcodeのプロジェクトを作成した場合にCarthageのライブラリ設定をまるごとリモートリポジトリで管理して 他のメンバーもGit cloneしたら利用できるようしたい。
ゴール
先日作ったiOSのシングルページアプリケーションのXcodeプロジェクトを使って以下ことをする
- Bitbucketを使ってXcodeのプロジェクトをリモートリポジトリで管理する
- リモートリポジトリからcloneして、シミュレータで起動を確認する
- Carthageを利用したライブラリがチーム開発できるようにうまく利用できていること
動作環境
Bitbacketにプライベートリポジトリを作る
この辺は簡易に書いていくと
- Bitbacketのサイト(https://bitbucket.org/)に行きアカウントを新規作成する
- リポジトリのメニューからGitで新規リポジトリを作成する
- 作ったリポジトリのページに行きクローンのメニューを選択すると、https://account_name@bitbucket.org/xxxx/xxxxx.git とgit用のアドレスを取得できるのでメモしておく
※ git:// のプロトコルだとBitbacketにsshのパブリックキーを登録しておく必要があるっぽい
既存のXcodeにリモートリポジトリを紐づける
Xcodeを起動し、先日作ったプロジェクトを選択する。 メニューバーSource Controlを選択、「プロジェクト名 master」を選択、そして「Configure プロジェクト名」を選択するとダイアログが表示される
「Remotes」のタブを選択し、プラスボタンを押すとメニューが出るので、「Add Remote」を選択する
Name:Origin(デフォルトのまま) Adress: https://account_name@bitbucket.org/xxxx/xxxxx.git(メモしておいたBitbacketのgitのアドレス)
「Add Remote」ボタンを押して、「Done」ボタンを押して設定完了
メニューバーSource Controlを選択肢、Pushを選択、 Push先をoriginにするとBitbacketのパスワードが求められるので入力するとBitbacketにPushされる(アカウント名は非活性で固定されている)
Bitbacketの対象のリポジトリのページへ、ソースのメニューを開き、ソースコードが追加されているのを確認する
リモートリポジトリからクローンする
コンソールから適当なディレクトリに移動し、リモートリポジトリをクローンする
git clone https://account_name@bitbucket.org/xxxx/xxxxx.git Password for 'https://account_name@bitbucket.org': Bitbacketパスワードを入力する
Xcodeプロジェクトを開いて確認する
クローンしたディレクトリをFinderで開いて、xcodeのプロジェクトファイルを開いてみる コンパイルするとCarthageで指定したライブラリファイルが無いとエラーが出るのがわかる。
Carthageのライブラリを取得する
> carthage bootstrap --platform iOS
carthage update だと最新版のライブラリのバージョンを取得しCarthage.resolvedを参照しない ライブラリを追加しない時はcarthage bootstrap を実行するべきだ
Carthageディレクトリが作成され、ライブラリが作成されたことを確認できる