Tailscaleで Joplinを出先でも同期できるようにした

要約: 今まで自宅LAN内でしか同期できなかったのを、出先でも同期できるようにした。

背景

Joplinって何

同期可能なメモアプリ。Notionの機能少ないバージョンみたいな。 なぜNotionを使ってないかはこちらの記事に書いた。ただ、最近は改善されてたので、もうNotionにしてもいいかもしれないと思い始めている。

Tailscale って何

簡単にVPNを構築できるサービス。 ビジネス利用はもちろん、個人なら無料で使える。

VPN構築にWireguardを使いたいと思っていたが時間を取れなかったところ、Tailscaleなら簡単に使えると聞いて導入に至った。 裏ではWireguardという技術を使っている。 裏がWireguardなら、一定の安心感がある。 なお、Tailscaleの存在を聞いた後も結局はしばらく放置していたのは内緒。

VPN接続はTailscaleを経由しない仕組みらしい。そのあたりも無料で使わせてもらえる理由と推測。

なんでVPN接続したかったの

出先でもデータの同期をしたかったから。 現在Joplinのデータは自宅マシンのローカルに立てたNextcloudに保存して同期している。 もちろんスマホやノートPCでもJoplinを使っているが、自宅のWifiに繋がっている時しか同期できない。 大きな問題はないのだが、たまに変更が衝突したり、自宅マシンで調べたメモをスマホで同期するのを忘れて家を出ることがあった(買い物リストを書いた紙を家に忘れる状態)。

出先でも同期できるようにするためには、サーバーを公開しておく必要がある。 もちろんデータは暗号化しているし、奪われて困るデータも(多分)ない。 セキュリティの担保はgateway 等でもできるはずだが、ネットワーク周りの技術はまだ自信がなく、自分用VPNを構築するのも安全策の一つだと思っていた。

やったこと

  • 自宅マシン、ノートPC、スマホ、それぞれにTailscaleのクライアントをインストールして、ログインする。
  • 自宅マシンのVPN上のIPをTailscaleが教えてくれるので、Joplinの同期先のIPを変更。
  • nextcloud側でも、そのIPを許可するように変更。

以上。

え、これだけ?ってくらい早かった。 どこかで詰まって、パケットの中身を見て、分からねーって言うくらいのことを予期していたが、そんな困りごとは与えてくれなかった。楽すぎる。

おわりに

実際、本当に安全なのか、の不安は拭えない。 こればっかりは自分でしっかり技術を理解しないといけない。

Tailscaleトロントの会社だ。留学してたので親近感.

自分のエゴを出すことが会社・ユーザー・自分の三方良しに繋がる

あるプロジェクトで、ユーザーに価値を届けるため(機能開発のため)、落ちているタスクを積極的に拾ったことがあった。 "落ちているタスク"とは、ここでは、「明確にオーナーがおらず、しかしプロジェクトの成功には必要不可欠な仕事」を指している。

それは非技術的なタスクで、むしろドメインの専門知識が必要な類だったが、英語ができる自分であれば相対的に容易にこなせるタスクでもあった。

そのタスクをやると決めたのは、自分の技術力も未熟で、なんとかバリューを出したかったからだ。 そもそも二人のエンジニアで進めているプロジェクトで、他にチームで手が空いている人もいなかった。

結果的にリリースは間に合ったし、ユーザーにも大きな価値を届けることができた。 技術ではないタスクとはいえ、ドメインの勉強にはなったし、作業タスクをどう効率的にさばいていくかの学びもあった。

だが当然ながら、そのタスクから分かりやすい技術的な成長*1はなかった。 技術力をつけたいと強く思っていただけに、後から振り返って、そのタスクに時間を使ったことに強い悩みと葛藤を感じることになった。 バリューを出すことはできたが、それが次の成果を大きくすることには繋がっていないのではないか。 エンジニアとしてできることは増えていないんじゃないか。 しばらくそんな悩みを抱えることになった。

方向性が決まっているなら、自分本位な選択をすることも大事

この時の私は、自分の成長と仕事の関連の度合いを強く意識はしておらず、 事業視点で成果が出るように動くことが結果、自分の成長に繋がると考えていた。 今まで読んできたいくつかの本にもそう書いてあるし、実際正しい。 高い視座から仕事の優先度を判断して、眼の前の仕事を全力でこなすことができれば、誰にとっても大きな成長につながるだろう。

ただ、成長したい方向性、自分が身に着けたい力が朧気でも決まっているのなら、追加の調整が必要だ。 事業や会社にとって大事なこと、ビジネスインパクトがあることが、必ずしも自分の成長の方向性と一致しているとは限らないからだ。身に着けたい技術を使っている別のチームに移ったり、自分の成長の方向性をマネージャーに相談して関連タスクを取れるように動く必要がある。

つまり、会社と事業の方向性から、自分に求められていることを理解して実行すると同時に、自分のキャリアプランと沿うように仕事を選択していくのだ。 もし担当する仕事が自分のキャリアプランと沿わなければ、モチベーションを失ってパフォーマンスを落とすかもしれないし、結局成果が出なくなるなら、会社にとっても良くない。 もちろん、個人の成長ばかり追い求めてインパクトのない仕事ばかりしていれば、今度は会社からみた成果が出ない。本人も評価されないために成長機会は失われるわけで、プロダクトも改善されないので、ユーザーにとっても不利益となる。要はバランスではある。

ビジネスインパクトと自身の成長が重なる割合をできるだけ大きくする努力を怠ると、成長はしていても自分の願ったキャリアとは別の方向に進んだり*2、いつまでも欲しい力が身につかなかったりするのではなかろうか。 人によっては、事業の目指す方向性に100%共感していて、あるいは、チームの仕事が自分のやりたいことと100%マッチしていて、ビジネスインパクトだけ考えて仕事をすればいいかもしれない。 しかし残念ながらそういう人間でも、そういう環境でもない場合*3、長期に持続的に成果を出していくためには、自分のキャリアの方向性に照らしてどうか、の視点をある程度考えた方がよい。

念の為断っておくと、「会社は自分が成長するためにあるから、自分の成長だけ考えていればいい」という話ではない。(私はこの考え方が好きではない。) 長期的視点から、事業に対して生み出す価値の総量の期待値を最大化しようとすると、自分の成長を考慮に入れた意思決定が最善だという話だ。

エゴを出す

つまるところ、「どのプロジェクト/タスクをやるか選ぶときや、仕事をする中で、ビジネスインパクトと自分の成長のバランスをうまくとること」が大事だ。 意思決定に自分の成長を加味することを、私は「エゴを出す」と呼んでいる*4。 とはいえ、プロフェッショナルとしてお金をもらって仕事をする以上、自分の成長を考えることには抵抗があるだろう。

どのようにバランスをとるとよいか。 私の意見では、自分の経験が浅ければ浅いほど、組織が大きければ大きいほど、エゴを出していいと思う。 それは、ビジネスインパクトと自身の成長が重なる割合が低くなりやすいからでもあるし、期待値の中に成長も入っているはずだからでもある。 小さな成果しか出せないのに、目先の成果を追い求めることで将来の成果が出せなくなる機会損失の方が、トータルの損失は大きいはずだ。

それは必ずしも、短期的成果をないがしろにするという話でもない。 仕事で成長できるなら、仕事はより楽しくなるし、楽しく仕事をすればチームの雰囲気を良くすることに寄与するはずだ。 やりたいタスクが自分の実力に対して多少難しいタスクでも、オーナーシップを持ってチャレンジすれば、周りは応援したくなるし、助け舟も出してくれる。 そういった姿は、周りのエンジニアに刺激を与えることになる。 むしろ、チームで経験の浅いエンジニアが、成長しないようなタスクばかり取っている方が心配になる。 遠慮してそこそこのタスクに落ち着くよりも、エゴを出して挑戦する方が遥かに良い。挑戦は自分のためならず、だ。

後輩にあたる新卒と話した時に、「なんでもやります」と話す方が何人かいた。 気持ちはわかるし、やる気があるので大きな心配はない。 だが、「自分が何をしているときが楽しいか」「何はやりたくないか」「何は楽しくないか」といった自分の希望を少しでも言語化できていると、より濃い成長機会が得られるし、マネージャーなど、アサインする側も助かるはずだ。 「やりたいこと」がない場合は、今年度(2023)の東大の入学式の祝辞を読んでみることをおすすめする。

具体的に何をすることがエゴを出すことなのか

では具体的に何をすればいいか。 行きたいチームの希望を出したり、身に着けたい技術に関連したタスクを取ることはすでに触れた。 具体のタスクをやっている中でも、初歩的な例をあげれば、「コピペで済むところを中のコードまで追ってみる」がある。

理解してコードを書いても、コピペで書いても、それが動くコードであれば、翌日与えるビジネスインパクトは変わらない。 だから少し自分の成長のために、そしてもちろん、良いコードを書くために、自分が何をコピペしているのか、しっかり理解する。 多くの人が当たり前にやっているだろうが、人によって深さは違うのではなかろうか。社内レポジトリの実装まで追うのか、依存パッケージまで見るのか、標準ライブラリやさらにその下のレイヤーまでみるのか。 横に広がる人もいるはずだ。マイグレーションを扱うライブラリは複数あるが、何故その技術選定がされたのかを調べてみたり、あるいは、別の実装の方が良い気がするから他の選択肢を調べてみたり、など。

エゴと両立できる組織じゃないとスケールしない

冒頭の話を起点に、エゴを出すことが、先々に生み出せるインパクトに影響することを書いてきた。 冒頭の話について、私がエゴを出すべきだったと思う理由がもう一つある。 それは、私が非技術的なタスクを取ったタイミングが、本当は、会社やチームにとっても、その仕事の専門家を配置する体制を作る機会になったはずだというものだ。

私の所属する会社(当時)は十分に体力のある会社で、必要であれば人材を雇うことはできるのに、あの場では私の腕力で解決することを選択してしまった。 もし私が早い段階でヘルプを求めて、専門のリソースが必要だと伝えれば、それが人員の再配置に繋がり、今後の同様のタスクがより早く処理される体制が作れただろう。 プロジェクトが終わった後にマネージャーにフィードバックして、しばらくたってから専任で人もつくようになったが、もう少し早く動けたはずだ。

会社が十分に大きいというのは私が見逃していたポイントで、例えばスタートアップであれば特に問題ではないし、腕力は一つの正解だろう。 リリースが間に合ったのだから万事OKだ。 私のケースも、もちろんスケジュールは厳しかったし、専門家が来るのを待っていたら間に合わなかっただろう。

だが腕力による解決はスケールしない。大きな企業ほど向いていない。

開発の現場のエンジニアが望まない仕事をしなければいけない状態、本来専門家がやる方が安全な仕事をエンジニアがやってしまってる状態*5は健全ではない。 健全でないとはつまり、持続可能性が低かったり、人材定着率が悪いことを指す。 早期にシステム的な解決を図らないと非効率が生まれ、組織が大きければ大きいほど、その非効率はいたるところで発生する。 (保身のために言っておくと、私は望まない仕事をしていた感覚はなく、必要だから淡々とやった。ただ、それが私でなくてもできるとは思わないし、再現性はないと思っている。) 「それは私の仕事ではないので」などの態度は論外だが、その根底にある「人は楽しくない仕事ではパフォーマンスがでない、長続きしない」点は見逃さずにシステムで解決しないと、組織規模が拡大しても、成果が伸びない要因になりうる。

まとめ

自分語りも含めて長々とかいてきたが、言いたい事をまとめると3行だ。

  • 事業の方向性から自分に求められていることを理解し、自分のキャリアプランと沿うようにチームやタスクを選択していく。
  • すると、自分のモチベーションも保ちつつ楽しく成長でき、より大きな成果を出せるようになる。
  • 大きな価値を生み出せばユーザーも会社も嬉しいし、その過程においても周りに良い影響を与える。

*1:良いプロダクトを作るにはドメイン理解は必須であり、コードを書くことだけが技術的成長ではない。ただ、コードを書いたり設計することは、分かりやすく成長を実感できる。

*2:特に希望がないなら、巡り合わせを楽しめるので、それはそれで面白いと思うが

*3:環境に関しては、むしろ自由度が高すぎてなんでもできる、という状態だった

*4:半年ほど前に命名して好んで使ってる

*5:勘違いされることはないと思うが念のため。法律上、倫理上、またコンプライアンス上でも誰がやっても問題はない。ただ、効率的ではないというだけ。

docker でよく使うけど覚えられないやつ

docker 周りで頻繁には使わないかもしれないが、

それゆえに覚えてなくて毎回調べるやつ

コンテナの残骸を消したい

1時間以内に作ったコンテナ全部消す

直近間違えて作ったゴミ(container)を消す方法

注) "minute" でgrepしてるので、imageとかtagの名前にminute が入っていたらバグる

docker ps -a | grep Exited  | grep minute | awk '{print $1}' | xargs docker rm 

docker の filter オプションを活用すると多分こんな感じ

docker ps -a --filter "status=exited" | grep minute | awk '{print $1}' | xargs docker rm 

since オプションもあるが、これはImage IDを受け取るのでちょっとめんどい。正確にやりたければめんどさを考えてもImage ID 指定の方が良い。

ある時点より昔に作ったコンテナを全て消す

まずはどんなコンテナがあるかを確認する

docker ps -a --filter "status=exited" --format 'table {{.Image}}\t{{.CreatedAt}}\t{{.Status}}'
docker container prune --filter "until=2022-10-07T09:10:00"

ある時点以前に作られたコンテナを消す(Exitした時刻ではなく、コンテナの作られた時刻)

docker image の出力が横に長い

ID は文字数一定だけどその他はまちまちなので整形する余地はあるが、事足りてる

docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"

2週間休みがあったのでやったこと

総評

まとまった休みをとって誘惑なく勉強に集中できるのはとても良かった。

また、普段は優先度があげられなかったり、誘惑に時間をとられてしまって進まないようなことに時間をかけられて良かった

あと2kgやせた。病院食は1日に1750kcal しか取れないのだ(コンビニは我慢した)。

どうして休みがあったか

深くは語りませんが、2週間入院することになり、仕事も有給をとりました。

仕事しない、感染対策のために誰とも会えない、ご飯は出てくる、となり、絶好の勉強タイミングだったわけです。

もちろん治療なので、2週間を毎日使えたわけではないのですが、ただ休みを取った時よりも誘惑が少なく、集中しやすい状態でした。

勉強

技術書

データ指向アプリケーションデザイン

データ指向アプリケーションデザイン を読み切りました。 2022/10から読み始め、もともと5章まで読んでいたので、残りの7章を読み切れました。

日本語版だと全660ページあり、かなり分厚いです。 輪読会で動機付けしたり、こういった時間がとれるタイミングがないと読み切れなかっただろうと思います。

内容は、データベースの概論に触れつつ、分散システムにおけるトランザクションやシステム構成をじっくり解説されています。 正直、読んだだけでは60%も理解できているかは怪しいです。 業務で分散システムに触れたり、分散DBについて雑談する機会があったので、その経験がなかったら何を言ってるか、それがどれだけ重要なことか、想像がつかなかったと思います。

もっとアプリケーションについて深堀するものと思っていましたが、想定よりもデータベースに寄った内容でした。分散システムの難解さに触れることができて楽しかったです。

MIT DB 講義資料

MIT のDatabaseの講義がyoutubeで無料で見れるのをご存じでしょうか。 講義資料も無料で、これを2022/4頃に全部ダウンロードしてkindleに突っ込んで読み始めてました。

技術書ではないですが、無料で手に入る上に短くエッセンスが詰まっていて勉強になりました。 なお、DB基礎の講義の講義資料なので、上の『データ指向アプリケーションデザイン』と60~70%くらいは重複した内容です。

全てかぶっているわけではなく、序盤はpagingなど、物理ストレージに近い処理の話もあります。

なお、youtubeの動画は見てないです。じっと人の話を聞くというのが苦手なので...

ちなみに、youtubeのリンクは2019のプレイリストを張っています。2022版もありますが、2019の方が好評らしいです。好みだと思いますけどね。

競技プログラミング勉強

これは休みに入る前からの日課なので、休みがあったから、というわけではないですが。

LeetCodeのDaily Problem 1問と、AtCoder 典型90問を1問。 1日2問は解くようにしています。

ブログ

年末に翻訳しようと思っててやりきれてなかった記事をかけた。 詳細は該当記事をぜひ。

振り返り・レジュメ作成

二年に満たないキャリアを振り返って、レジュメを書いてた。

レジュメを書くというのは良い契機で、自分がどんなインパクトを出せているか、を振り返ることができた。

そもそも英語版のレジュメはどう書けばいいか、とかも調べた。転職如何にかかわらず、普段から常時最新に保っておきたいと思うのだが、なかなか優先度があげられない。

読書

ストーリーが世界を滅ぼす

ストーリーが世界を滅ぼす―物語があなたの脳を操作する 陰謀論がなぜ信じられるか、物語戦争

長かった。 昨年夏に購入

日本のシン富裕層

日本のシン富裕層 なぜ彼らは一代で巨万の富を築けたのか (朝日新書) 最近は twitter から引っ張る

アニメ

サマータイムレンダ

夏のキャッキャウフフなアニメかと思ってたら全然違った。若干ホラーでもある

評判良かったのもうなづける

哲学的なテーマもあり、今のAIが諸々できる時代にも通ずる問いかけがあるように感じた。 ネタばれしたくないので深くは書けない。

サイコパス

何度も見たことあるが、Amazonプライムで見れたのでもう一度みてしまった。 虚淵さんがガンダムを担当しているので、その関連で無料になったのかもしれない。

物語や劇の引用がやはりおしゃれ。かっこいい。

やはり思考停止せずに命は燃やして生きていきたいなと思う作品。

余談: 現代人が入院するときにあるとよいもの

コロナ化で面会ができない病院も多いです。現代版ということでメモしておきます

あってよかったもの

  • 耳栓
    • これが書きたかったまである
    • CanDoのスパイラルタイプのやつがよかった
      • つけやすい。両手の自由が利くとは限らないので、つけやすさは大事
    • 個室でも、夜に救急車などいろんな音が聞こえるので、あって損はない。
    • 大部屋だと、他の患者さんの診察とか丸聞こえなので
    • 繊細じゃない人はいらないとは思う
  • 有線イヤホン
    • 私は無線イヤホンは長時間つけてたり片耳だけつけてると耳が痛くなったり気持ち悪かったりするので
      • 病院で無線イヤホンの不要な電波を飛ばすのも申し訳ないですし。影響はまず0だとは思いますが
  • 長めのコードの充電器。1m あれば十分だとは思う
    • コンセントが遠い、かつベッドから動きやすいとも限らないので
  • SIMをさせるPC
    • 元々持ってたので持って行ったが、良かった。
    • 病院にwifiはあったが、開発等の使用に耐えるかは不明
  • 長めの本
    • 分厚い本を一冊持っていくと、読み切るぞ、って気分になるのでおすすめです。
    • 入院の場合、可搬性はそんなに考慮しなくてよいので、kindleよりもおすすめ。
    • 寝ころがってる時間が長い人はkindle のほうが良い
      • 私は両方持ってって両方使いました。
    • スマホでも暇はつぶせますが、ずっと眺めてるのは色々よくないでしょう。
  • 爪切り、電動髭剃り
  • 現金
    • やっぱりキャッシュレス対応してないところも多いですね

なくてよかったもの

  • たくさんの着替え
    • 病院によるので要確認ですが、洗濯乾燥機が患者でも使える場合があるので。
    • 洗濯をする場合は使い切りタイプの洗剤を持っていくとよいです
  • ストロー
    • 水吸いを持参したので最低1つは必要だったのですが、回復後は水吸い使わなかったので、たくさんは不要でした。場所はとらないのでどちらでもよいですが。

やってよかったこと

  • 入院前の散髪
    • 入院期間や内容にもよりますが、長い場合は鬱陶しくなってきたりするので
  • 多めの水を買っておく
    • 手術前の動ける間に多めの水を買っておくと、毎回500ml のペットボトルを買わなくてよいので、経済的です。

2023 にレベルアップする方法(Githubのスレッドより)

Github公式から年末ツイート

「2023 にレベルアップする方法」というスレッドをGithub公式が上げていたので、内容を薄く拾ってみます。

  • 時間管理の方法
  • いたずらに時間を消費せず、アウトプットにつなげる方法
  • アジャイルな(意訳)計画方法

なお、DeepLでの逐語訳や、それを元にさらにchatGPTで機械要約することも可能な2023です。 翻訳をしたいわけでもないので、 多分に意訳が含まれており、恣意的にかいつまんでいることをご了承ください。

時間のある方はぜひ元記事にあたってください。長くないです。もし誤訳があったら教えてください。

時間管理

Time management for makers · GitHub

エンジニアが何かを作るためには、妨げ(差し込み)のない、長いまとまった時間が必要なことを大体のマネージャーは認識しています。

しかし、残念ながら差し込みは止みません。 たとえどんなに優れたマネージャーでも、差し込みが一切発生しないようにするのは不可能です。

そもそも差し込みが発生する背景には以下があります。

  • エンジニアが作ったシステムを自分たちで保守することに多くの利点があり、問題が発生すれば修正することが求められる。
  • 組織はトップダウンではなく、現場のデータに基づいて判断するようになり、現場に意見が求められる
  • 避けられないミーティングは存在し、(グローバル企業の場合)地理的な要因で全員のフォーカスタイムを考慮した時間を設定できない

これらの傾向が強まると、エンジニアのカレンダーにはミーティングが増え、さながらマネージャーのようになっていきます。これが罠です。

エンジニアはそもそも作り手であり、作ることを期待されています。マネージャーのようなスケジュールを受け入れてしまう罠にはまると、どちらかの運命が待っています

  1. 時間外労働
  2. "マネージャー"になる

この罠を避ける簡単な方法は、責任を負わないようにすることです。

しかし、そうすると今度はキャリアが息詰まります。

ではマネージャーのスケジュールを避けつつ、かつ責任とインパクトを大きくしていくにはどうすればよいでしょうか。

成功したエンジニアには以下に共通する特徴があります。

  • 時間を確保する
  • Pay Yourself First (まず自分に払おう)
  • 人の時間を守る
  • 差し込みの仕事を明確にして割り当てる
  • 投資対効果の悪いタスクを明確にして処理する

ひとつずつ見ていきます。

時間を確保する

フォーカスタイム(連続する時間)を最大化するため、不要なタスクは消すか、バッチ処理します

具体的には、

  • slackやメールの処理をする時間を決めておく
  • 不可避のミーティングはまとめる(ミーティングを連続させる)

などです

Pay Yourself First (まず自分に払おう)

フォーカスタイムは予めスケジュールに入れておきます。 他の予定が入らないようにします。

それと同時に、それらの時間をどう使うか(プログラミング、ミーティングの準備、など)を長期的視点から予め決めておきます。 プロジェクトごとにどれだけの時間が必要かを考えておかないと、時間が足りなくなってしまいます。

人の時間を守る

時間管理のGolden Ruleです。

自分の時間を侵害されないためには、まず人のフォーカスタイムを侵害しないようにします。 もし本当にしょうがなく、予定を被せるときは最低でも一言聞くとよいです。

差し込みの仕事を明確にして割り当てる

エンジニアにはどうしても差し込みドリブンの仕事があります。これら差し込みにさらされる時間は当番制にしましょう。

これは非常に重要ですが、意外とドキュメント化されていないプラクティスです。

エンジニアは仕事の20%以上を差し込みにさらされてはいけません。つまり、健全な当番制には最低5人のエンジニアが必要になります。

投資対効果の悪いタスクを明確にして処理する

やる必要があるが、費用対効果の悪いタスクがあります。 これらは、相対的に質を犠牲にしても、決めた時間内に処理するようにします。

率直にコミュニケーションする

率直なコミュニケーションの利点は豊富にあります。時間管理の改善もその一つです。

率直なコミュニケーションは他人の時間を無駄にしにくく、"No" と言える力も身につきます。

非情に優先順位付けする

最も重要ですが、難しいでしょう。

ただ、これまでに挙げた点を踏まえれば少しは実践しやすくなるはずです。

元記事(再掲): Time management for makers · GitHub

意図的に生産する(アウトプット)

我々には皆、価値あるアウトプットを生み出す可能性があります。

しかし、消費するコンテンツを絶え間なく与えられる現代において、この可能性を実際のアウトプットへとつなげるのは難しいです。

そこで、アウトプットを生み出す4 step を紹介します

  1. 消費する
  2. 批評する
  3. 集積する
  4. 生産する

1: 受動的な消費を能動的な調査に変える

朝目を覚ました瞬間から、我々は常に情報の波にさらされています。 記事、動画、podcast、最新の Wordle...。

我々は消費に囲まれていますが、消費で終わってしまう状態は危険です。 消費の無限ループは創造の機会を奪ってしまいます。

とはいえ、消費が全て悪いわけではありません。 むしろ、創造は、調査のための消費や、批評を意図した消費から始まります。

2: 自分の反応を批評に変え、反応できる以上の消費をしない

意識的な創造は、目新しい入力に対して、少し立ち止まることから始まります。 難しいかもしれませんが、feed の次に思いをはせる前に、批判的感覚を働かせてみてください。 なんらかの結論を引き出してみてください。仮に吟味されたものでなくても、それはあなたのものです。

もし批評することができなければ、それは、省みることができないくらい早く消費をしていることのサインです。 省みなければ、何も学べません。 もしこういった消費をしているなら、1つ1つの消費に深く潜ってみるか、少し休憩する必要があります。

どんな形であれ、批評は難しいです。 新しい消費を行う前に、まずはエディターを開いてみてください。 今この瞬間に開いてもOKです。

3: 批評をまとめ、生産の参考になる形にまとめる

批評は、価値あるアウトプットのプロトタイプです。 批評をそのままにせず、まとめた形にしておくことは大事です。 まとめただけでも価値が生まれたりします(リンク集など)。

4: Create

まとめがある程度のサイズになると、面白い発見があります。

まとめた中にパターンやギャップが見つかり、それに沿って価値あるアウトプットできるのです。

そこからOSSが始まったりするのです。

元記事(再掲): https://github.com/readme/guides/intentional-creation

ムーンショットではなくルーフショットを

Using ‘Roofshots’ to make impossible decisions · GitHub (注:原文が一人称の語り調なので、それに沿います)

これまで、良い計画をすることでcodingは順調に進み、成功すると信じてきた。 しかし、大企業のスタッフエンジニアになって大規模なプロジェクトに携わると、これまでにうまくいった方法がうまくいかないことに気づいた。

事前に入念に要件定義やデザインをしても、それはその後も正しくあることができず、 決定をやり直すのは難しくなり、結果的に多くのエンジニアの時間を無駄にしてしまうようになった。

その原因を振り返ってみると、あいまいさが支配的な中で、事前の確かな想定に頼ることなどできないことに気づいた。

例えばプロジェクトの期間が長いと、あいまいさの要因は増える

  • エンジニアの退職
  • インフラの緊急対応

すると、まず間違いなく優先度の上下は変わる。 間違った判断はよりやり直しがきかなくなる。

そこで、「変化を前提として、どう上手く軌道を変えるか」を考えるようにした。 リーンの方法論を参考にして、より早く市場に出して反応を見て、方向修正、のサイクルを繰り返すようにすると、うまくいくようになった。

計画段階で誤った判断を恐れて分析しすぎてしまうのはよくない。 とはいえ計画をしないわけにはいかない。 計画段階では以下をやれば十分だ。

  • 課題と制約と想定と目的を言語化する
  • オーナーを指名する
  • 最も価値のある意思決定にまずは注力して、方向を定める

その後は、少しづつ実行するようにする。

ここで、どんなことをしても賭けであり、リスクがあると考えるようにしてみる。 すると、問題は「どれだけのリスクをとるか」になる。

小さいリスクを選ぼう。 そうすることで、自然とやることはシンプルで、本質的で、具体的なものになる。 また、やることが小さくなると、早く市場に出すことができ、その分だけ早くフィードバックを得られる。

賭けの結果を未来の計画へのフィードバックにする。 小さな賭けを繰り返すことで、全体の計画のずれを小さくすることを目指す。 特定の銘柄に投資するのではなく、市場全体に投資するイメージだ。

この戦略の良い点は、自分が達成できると思うよりも大きいことに挑戦できるようになることだ。

技術界隈では、大きなプロジェクトをムーンショットと呼ぶことが多いが、歴史的には月面着陸は複数の計画の末に実現されたものである。 それを聞くと、不可能な目標も、長く、地道に取り組むことで達成可能だと勇気づけられるはずだ。 これにはルーフショットという名前もついている。

ここまでの話をまとめると、以下のような段階を踏めばよい。

  • 大きく、複雑だが解決したい課題を見つける。
  • 次に進むために積み重ねる道が見つかるまで課題を吟味する。
  • それらの方法を試す。ただし、短く実行する。結果を見て、修正する。
  • 繰り返す!

元記事(再掲): Using ‘Roofshots’ to make impossible decisions · GitHub

ほかにもたくさんある Best Practice

Github のREADME Project には、参考になる話がかいてあります。見てみてください。 Guides · The ReadME Project · GitHub

あとがき

翻訳のために自分の中で反芻したりするうちに、自分の考えを反映してしまったものになった感もあります。 あとかなり端折りました。

正直もっと技術的な話を期待してスレッドを呼んだのですが、こういうソフトビジネススキルみたいなのも定期的に読んでいかないと経験則に頼るようになっちゃうと思うので、大事ですね。

ハッカソン(SPAJAM2022) に初参加した

ハッカソン初参加

1月経とうとしているが、2022/10/01-02 にハッカソンに初参加してきた。 SPAJAMというハッカソンで、広めのテーマを与えられて、そのテーマに関連したスマホアプリを24時間で作る、という内容。 初心者でも参加しやすいらしく(参加資格に特に制限がない?)、私も気軽に参加できた。

twitter でフォロワー数の多い方が審査員としてきていたり、知る人は知ってるハッカソンということらしい。

参加するまで

参加した理由はほぼノリで、会社に同期入社したUXデザイナーが、一緒に参加する人を募っていたので乗っかった。

同期で5人集めて参加したが、一人がUnity の経験あり、一人がiOSのエンジニア、私とデザイナー2人はアプリを作ったことはない、という感じだった(厳密に言えば私はちょっとしたAndroidアプリを作ったことはあるが、ほぼ初心者)。

どうみても経験不足のチームなので、敷居の低いハッカソンでありがたかった。学生や新卒入社してすぐの人が少なくなかったので、実際に参加しても気おくれすることはなかった。

参加した感想

事前にモブハッカソンやってみたり、深夜テンションで徹夜で開発したりはとても楽しかった(ミスっても誰も死なないサービスだからこそできる)

懇親会で聞いた話だと、一番楽しそうに開発していたらしい。実際一番わいがやしていたと思う。

チームとしても「楽しむこと」を第一目標に据えていたので、まずはそこが達成できてよかった

その他

チーム内で1人だけUnity の経験があったが、審査員には「全員がUnityが初めて」と伝わっていたようで、プレゼンの仕方には気をつけないとと思った。

デザイナーの二人がとてもかわいいイラストや分かりやすいコンテンツ、熟考したユーザー体験を作ってくれていたので、それをアプリに昇華しきれなかったのは悔やまれる。

そもそもはUnityを使うつもりはなかったので、その意思決定は明確にやっておくべきだった。使う可能性があるなら練習しておくし、練習しないなら使わない、と決めておくとよかった。

また、ハッカソン慣れしているチームは、事前にそれぞれの役割分担が決まってたらしい。納得。

その他、自分がゲーム開発には向いていないことも感じた。自分はロジックを考えたりするのが好きでフロントを動かすことにそんなに喜びは感じないタイプだと思っていたが、今回で結構確信を持った。 一方で、Unityがクロスプラットフォームを実現しようとしてたり、フロント側にもいろんな取り組み、チャレンジングなポイントがあるのを実感できてよかった。

総括

とにかく楽しかった。時間や自分の伸ばしたい分野などは特に考えず、ただ楽しみのためだけにまたやりたい。

すごいH本の勉強終えた

amzn.to

すごいHaskellたのしく学ぼう!

を全てではないですが写経もしながら進めて、終えたので、読書感想文を書きます

そもそもなんでやってたの

なんとなく、

97 Things Every Programmer Should Know - Kevlin Henney (2010) にも「関数型言語の原則を適用せよ」とありますし、

関数型言語は一度は/一つは学んだほうが良いという共通認識があると思っていて、それは私にとっては大きな関心事ですし、強迫観念でもありました。

会社でもそんな話をしていると、「すごいH本」が良い、と何人かから聞いたので、とりあえずやってみるかー、と始めた次第です。(一応補足すると、『すごいHaskellたのしく学ぼう!』が日本では通称「すごいH本」とよばれているようです。)

完璧超人エンジニアになった?

入門も入門ではありますが、実際に関数型言語を勉強してみて、今後の成長曲線にプラスの影響はあると思います。

非線形の成長が得られた、とかではないです。

入門本を一冊通して読んだ(写経もしたが全部ではない)くらいでおこがましいですが、現時点では、普段のコーディングが飛躍的に改善するわけではなさそうです。

普段から map とか filter とか lambda はもちろん使っているし、関数型のような書き方はところどころでしているので、新しい武器を手に入れた、という感じではないです。

関数が副作用があるかどうか、とかも個人的には意識していると思ってます。(多くの場合は副作用があるとよみづらくなるんじゃないだろうか)

「関数型バンザイ」というよりは、 Kevlin Henney が言うように、関数型言語の考え方を知って、その原則を意識して適用できるようになることが大事なんだろうな、と思います。

なので、これからは関数型言語風の実装を意識的に扱っていこうと思います。そのうち、より洗練されたコードが当たり前に書けるようになっていると期待して。

雑多に感想

誤解していたのが、 純粋な関数言語なので、制約が厳しく、書き方が一通りしかない(あるいは少ない)と思っていた点です。 golang のように、誰が書いても似たような実装になる(これが正しいかどうかは立ち入らない)のでは、と勝手に思っていました。

ただ実際は1つのことを実現するのにも複数の書き方があり、制約が多いとかは全く関係ない視点の話でした。

あとやってる中でしょっちゅう思ってたのが、競プロの問題を解いてるときに、関数型だったらパッとかけそうだなー、とか。 先日ある問題をbacktracking でとく必要があって手間取ったのですが、普段から関数型を書いてる人ならこのあたり、あとは再帰とかも、日常的に考えるんだろうなーと妄想してました。

そういえば新しい武器も一応ありました。モナドをしれたのも良かったです。モナドも単語として聞いたことがあったものの、中身は全くわかってなかった(解説記事を読んでも理解できなかった)ので、これを機に一つ腹落ちしました。なお、厳密には数学的なモナドHaskellモナドは異なるらしいです、まぁいいでしょう。

Maybe 型コンストラクタも面白いですね。何かが失敗したかもしれない状態の表現を言語レベルで(というか標準ライブラリで?ファンクターで?)サポートしているのは新感覚でした。 世の中の言語はそれぞれ何かの課題を解決しようとしていて、一長一短なんだなと改めて感じました。短は別に書いてないですが。

このあとどうするの?

ここから Haskell を使って何か実装してみたいのですが、残念ながら他に優先して学びたいことができたので、そちらをやっていきます。 きっとまた戻ってきます

おわりに

深夜の殴り書きです。お手柔らかにお願いしますmm