tomoima525's blog

Androidとか技術とかその他気になったことを書いているブログ。世界の秘密はカレーの中にある!サンフランシスコから発信中。

スタートアップでソフトウェアエンジニアとして10年たって大事にしていることリスト

今から10年前の2014年4月に、いわゆるIT系大企業のDBエンジニアを辞めてメルカリでソフトウェアエンジニアとして働き始め、そこから紆余曲折を経て10年たった。
当時の予定通り、まだ現役でコードを書いている。海外に拠点は移り、色んな国の人たちと仕事をするようになり、役割もテックリード、マネジャー、CTOと変わってきた。ソフトウェア開発について考え方もさまざまな変遷を経ているが、少しずつ培ってきた、大事にしていることをあげてみる。

ソフトウェア/アーキテクチャ/コード

  • ソフトウェアは他者の価値(i.e. 課題を解決する/コストをカットする)を生み出してなんぼ。コードが綺麗でも売上は立たない。
  • アーキテクチャプログラミング言語のトレンドは変化する。追いかけるよりも、その時々のチームやプロダクトに合った設計やプログラムを選択する。
  • 遊び心は大事。チームやプロダクトにそれほど合ってなくても新しいパラダイムプログラミング言語を試してみる方が楽しい。
  • 抽象化はよくよく設計しないと負債化しやすい。設計に十分な時間がとれるか? 3ヶ月後に読み直して不自由なく使えそうか? 依存するライブラリやフレームワークは大きく変わることはないか? ひとつでもNOならやめておけ。
  • 賢いコード/設計よりもみんながわかりやすいコード/設計。
  • 誰しもスキルセットは異なる。チームへのデザインや原理原則の啓蒙活動は大事。
  • 誰しもスキルセットは異なる(2回目)。自分自身も学び、考えをアップデートする。
  • LOGAF(https://blog.danlew.net/2020/04/15/the-logaf-scale/)ルールを周知する。自分はLintは気にしないが、パフォーマンスと理解しやすさは大切にすると伝える。
  • YAGNIとKISS、次にDRY

行動

  • とにかく手順書や作業メモを残せ。人とのやりとりは議事録を書け。これらはいつも自分や誰かを助ける。
  • ベストプラクティスや世の中の人の知見に頼れ。大体の問題は誰かが取り組んでいる。
  • 盲目的にベストプラクティスや世の中の人の知見に頼るな。頭を使ってどう自分の課題に活かせるか考えろ。
  • エラーは隅々まで読め。
  • 難解なバグは寝るか散歩か風呂に入ってから見直せ。
  • コミュニケーションにコストをかけろ。大体のことは一度で30%も伝わらない。何度でもメッセージを伝える。
  • 大きなことをするには人を巻き込む。人を巻き込むには、誰よりも説明ができる必要がある。何度でもメッセージを伝える。
  • 新しいことにチャレンジするときは素振りをしまくれ。頭と手を動かせ。ハマった数だけうまくいく。
  • 好奇心が原動力。読んだり話を聞いてわかったつもりにならない。手を動かせ。
  • 元気よく返事。

なんか、もっとある気がするけど、ぱっと思いつくくらいだから、これらは骨身に刻まれているんだと思う。さて、次の10年ではどんなアップデートがあるかな...?

あなたのしらない米国所得申告システム

確定申告の時期なので、米国の一風変わった(?)所得申告システム(Information Return)と連携するアプリケーションを開発した話について書こうと思う。

  • 米国の所得申告
  • 所得申告システム、FIRE
  • 不思議なファイルフォーマット
  • みよ、これがメジャーの仕様書だ
  • レスポンス(多分速達のほうが早い)
  • 初心者には厳しすぎるテスト環境
  • FIREへの申告自動化ツールを開発する
  • おわりに
続きを読む

シリコンバレーで起業したCTOの一日

「今って一日どう過ごしてるんですか?」「小さい子供いながら起業って大変じゃないですか?」 ってたまに聞かれるので、平日の朝から晩までの様子を書いてみる。
答えから言うと、”気を張らずロングランでやっていく”スタンスをとることでなんとかなる(なんとかしている?)んじゃないかなと思う。この記事が起業やら外国で働くことを検討している人の参考になれば幸いです。

  • こんな人でこんなことをしている
  • 朝~午前
    • オフィス
    • 仕事
  • 昼 ~ 午後
    • リモートチーム
  • 日々思うこと
続きを読む

プロンプトエンジニアリングってソフトウェア開発?と感じるあなたへ ~ LLM開発とソフトウェア開発の違いの話

この記事はLLM開発におけるプロンプトエンジニアリングに違和感がある人に向けた、捉え方を変えてみたら少し印象が変わるかも、という提案をするものです。

かくいう自分もなんだか普通のソフトウェア開発とは異なると感じていました。この違和感の言語化を試みると、すべてはブラックボックス化したインプットとアウトプットに集約される気がします。

  • コンテキスト量が増えると回答の取りこぼしが発生する
  • 突然"ない答え"を作り始める
  • "一呼吸しましょう"など謎のおまじないが回答率を上げる

などなど。プロンプトを調整し、期待した結果が得られるかお伺いをたてる開発プロセスは、トライアンドエラーするしかないといった具合です。*1

そんな折に、たまたま聴いたのがStack Overflow podcastのこのエピソードでした。

open.spotify.com

ゲストのKatanforoosh氏は元々機械学習の研究者で、現在はスタンフォード大学Deep Learning講座を受け持っています。その彼に対してホストから投げかけられた、 ”CSの学生がAIや機械学習開発を始めるために何に取り組めば良いか?” という質問への答えの中で、彼はこう述べました。

“AI開発とソフトウェア開発の根本的な違いは、Less predictable(予測がつきにくい)ということです。多くのソフトウェア開発はアイデアからリリースまでの見通しが立てやすいです。AIはモデルがいつ機能するか予測を立てるのが難しいです”

これを聴いたとき、自分はハタと手を打ちました。なるほど、LLMのような汎用的なモデルの登場によって、ソフトウェア開発にパラダイムシフトが起きたのだと。

機械学習モデルのプロジェクトでは、効果的に機能するまでモデルの改善を行うプロセスがプロジェクトに組み込まれています。これまでの機械学習を使ったプロダクト開発では最終的なモデルを利用するだけなので、ある種決定論的にアウトプットが得られました。
しかし、インプットでアウトプットの精度を向上できるLLMのような汎用モデルが登場したことにより、機械学習のチューニングがソフトウェア開発にシフトし、開発段階での改善プロセスが必要になったのです。

そのような開発では結果評価とフィードバックの仕組みが重要になります。最近自分の取り組んでいるAI開発プロジェクトでは、どのように結果評価を行うかの検討を始めました。現状LLM開発についてはいくつかのツールや考え方があるようです。

Langsmith

docs.smith.langchain.com

  • 実装したプロンプトのテストや評価、ログの分析を包括的に行うサービス
  • LangchainがサポートするLLMとの統合

AWS Bedrock

docs.aws.amazon.com

  • AWS BedrockによるAI開発で、結果の評価を行う手法やテストのためのデータセットが提供されている

Open AI Production best practices

https://platform.openai.com/docs/guides/production-best-practices

  • Open AIによる、AIを本番利用するためのMLOps戦略やコスト・マネジメントについて整理されたガイド

そんなわけで、最近自分はもうちょっと本腰入れてLLMOps(というのかな?)やプロンプトエンジニアリングについて学んでみようと思っています。面白いアイデアや実装ができたら、またシェアします。

*1:もちろん安定した結果を得るためにRAGを含めたさまざまな手法はあります

免税に使う在留証明書手続きには罠がある

数ヶ月ほど前に日本に旅行したときに免税のための在留証明書を発行したのですが、面倒だったのでメモ。

要点

  • “2年前から在留していた”ということを証明する書類を持っていく
  • 手続きはなるべく窓口でやる
  • ラップトップPCを持っていく

です。ちなみにこの手続きは日本国籍を要していて、かつ住民登録がない人が前提です。

続きを読む

TypeScript の AWS Lambda function を2000倍見栄え良くする

AWS Lambda Advent Calendar 13日目の記事です。

qiita.com

今回は AWS Lambda function で TypeScript の 関数を書くときにコンソール上で2000倍(※当社比)見栄え良くする方法を書きます。

ちなみにここでの"見栄えの良さ"はAWS コンソール上での読みさすさのことです! 副次的な効果として、最初のロード時のコードサイズが限界まで小さくなるので、パフォーマンスも良くなるかもしれません。(未検証)

なお、これはAWS CDKを使うことが前提となっています。

  • 通常の場合
  • 見栄え良く書くステップ1 - Lambda Layer
  • 見栄え良く書くステップ2 - ESM
  • 小ネタ: ESMに対応してないライブラリについて
  • まとめ
続きを読む

LLM開発のいろはをおさらいする~手法からツール、開発ノウハウまで

最近PoCやサービス開発を通じて、どっぷりLLMの開発をしています。この記事では最近の大規模言語モデル(LLM)を使ったアプリケーション開発の種類や手法、ツール群について一通りまとめました。よくあるチャットボットからReActといった最先端のものまで、この記事を読めばエンジニアだけでなく非エンジニアの方でも概要をつかめるよう書きました!それではどうぞ。

  • そもそもLLMとはなんぞや
  • LLMアプリケーションとは
    • アプリケーションは内部的に何をやっているのか
  • LLMで開発できるもの
    • やりとりを記録する
    • 手順を考えさせる
    • いくつか例をだしてアウトプットを学ばせる
    • 外部データから答えを取得する
    • 大量のデータから答えを得る
    • 手順を考えさせ、外部のデータを必要なら利用する
    • LLM自体をチューニングする
  • 開発ツール
  • LLMアプリケーション開発の難しいことと対策
    • エラーハンドリング
    • 処理できるトークンのリミット
    • レスポンスタイム
  • 勉強のためのリンク集
  • まとめ
続きを読む