キャリアの転機が来た

この記事について

バックエンドエンジニアから情シスになった際のキャリアに対する個人的な見解

仕事歴について

実は今は開発現場第一線の仕事をしていない。 2017年からバックエンドエンジニアをしていたが、結婚を機に台湾に移住。 リモートで日本企業のバックエンドエンジニアを続けていたが、今年4月に台湾の日系企業に就職。 これまでのIT技術の知識を活かして社内のDX化を進める情シスの仕事についた。

開発者キャリア中断の怖さとやりたいこと

結論から言うとやりたいと思っていた仕事に近い仕事の機会が運良く舞い降りてきたので、そのチャンスに乗った。

大学のバイト時代からバックエンドエンジニアの仕事をしていたので、開発者のキャリアを途切れさせてしまって良いのか非常に悩んだ。 バックエンドエンジニア、フルスタックエンジニアの仕事は第一線を離れてしまうと取り戻すのが大変だと思うからだ。自分のキャリアをリスクに曝してしまう。

ただ、昔から異国のエンジニア(オフショア)と自国の開発現場をつなぐブリッジエンジニアをやってみたいという願望があった。自分は英語と中国語はそれなりに自信があるので、その能力を使って仕事をしたいという考えが実はかなり昔からあった。 現職の仕事はブリッジエンジニアではないので開発現場に直接参画することはない。 だが、主な業務内容の社内のDX化、マーケティング、社内ツール開発であり現地スタッフとのコミュニケーションは毎日のように発生する。 正直未経験の内容も多く面食らうことも多いが、なかなか珍しい経験ができているのではと思う。

開発者のキャリアとしては、開発職に就いた場合と比べて技術力成長の観点からは微妙なのは否めない。 しかしここでしかできない経験ができているのも事実だ。またいろんな発見があるので面白い。 それと実は上司が自己研鑽に積極的なので、書籍を買ったり講座を受講したりとかの経費は出してもらえている。とてもありがたい。 このお金で実はプログラミングの講座受講をさせていただいている。 結果的に充実していると思う。

気づいたこと

台湾で就職という珍しいパターンのキャリアだが、そうでなくとも同じだと思う。 やりたいことをやる機会があったのでその機会を選んだ。 その選択ができたのは万が一自分に合わなかった場合(退職)に備えた生活費貯金と、まあダメならまた仕事探せばいっかという気持ちがあったからだ。 挑戦するための準備をしておいてよかった。挑戦すらしていなかったら後悔していたかもしれない。 やっぱり挑戦する準備と勇気は必要だ。

これから

現職の企業はアナログ作業な面が多く、業務効率化の余地がまだまだたくさん。自己研鑽をさせていただきつつ、仕事をこなしていく毎日だ。 いつまでこの仕事をしていくのかは正直分からないが、開発者としても情シスとしても経験値は積め、必要とされているのでまだまだ続けていく。 やれることの幅が増えた!

結論

キャリアに変化をもたらすのはとっても悩むし、勇気が必要。でもそのための最低限の準備をしておけば負担を減らせるかも。 開発者キャリアの王道からは外れたものの、他の人にはない経験もできているしプラスになっているだろう(?)

さいごに

読んでくださってありがとうございました。読者の皆様はキャリアの転機を経験されましたか?どんな内容でどんな気持ちでしたか?ぜひコメントで共有ください!

DynamoDB DocumentClientで 'The provided key element does not match the schema' エラーが出る

Node.jsでDocumentClientを使ってテーブルから指定したPK・SKの組み合わせのレコードを削除するスクリプトを書いた。 しかし The provided key element does not match the schema 例外が上がってうまく動かない。

const AWS = require('aws-sdk');
const documentClient = new AWS.DynamoDB.DocumentClient();

const deleteUser = async (email, user_id) => {
  console.log('deleting user');
  var params = {
    TableName: 'UserData',
    Key: {
      email: email,
      user_id: user_id
    }
  };
  await documentClient.delete(params).promise();
};

deleteUser('someone@example.com', 100);

なぜか。

色々試したが、原因はスキーマが合っていなかったからだった。 ソートキーの user_id はString型だった... なので、以下のように修正した。

+      user_id: (String)user_id
-      user_id: user_id

テーブルのスキームに合わせてキャストしてあげないとAWS SDKが文字列型にいい感じに変換してくれてしまうので、 予期しない動きをするのである。

動的型付けのNode.jsやPHPに慣れていると、見落としがちだ。

DynamoDBテーブル設計 パーティションキーとソートキー

はじめに

AWSのフルマネージドNoSQLサービス、DynamoDBのテーブル設計をする機会があった。 以前に右も左も分からない状態で設計をしたことがあったが、学びがあったので自分用にメモ。

パーティションキー (PK)

RDBでいうところのプライマリキーである。ソートキーが異なれば重複可👌

パーティションキーごとに、物理的な保存場所が異なる。 DynamoDBはキャパシティーユニットに応じてスケーリングできる。

この時、パーティションキーの値がなるべく分散するように設計する。 特定のキーにアクセスが集中すると、スケーリングしても速度が上がらず結果的に性能不足になってしまうからだ。

したがって、日付などの分散しにくい値はよくない。 なるべく分散する値を選んで設計しよう。

ソートキー (SK)

パーティションキーで指定した値を取り出す際の順序が決まるキー。 これ単体で検索(クエリ)することはできず、パーティションキーと組み合わせて検索する。

その名の通り順番を決めるキーなので、UNIXタイムスタンプなどそーとしたい要素を指定すると良いだろう。

結論

  • PK
    • 物理的に保存する場所を定義
    • なるべく分散する値
  • SK
    • PKと組み合わせて検索
    • ソートしたい要素
    • 任意

おまけ

以前はRDBしか使ったことがなかったのでたくさんのカラムを持つテーブル設計をしてしまったが、NoSQLではある程度まとめてObjectやArrayとしてカラムに記録する設計も大アリのようである。

ServerlessでTypeScriptにHello World

いつもNode.jsでServerless Frameworkを使っているが、ちょっと変わったこともしたいのでTypeScriptでServerless Frameworkを使ってみる。

TypeScriptには、 aws-nodejs-typescript というテンプレートがフレームワークに用意があるとのこと。

> sls create -t aws-nodejs-typescript

ぽちー。

> ls
README.md           package-lock.json   serverless.ts       tsconfig.json       webpack.config.js
node_modules        package.json        src                 tsconfig.paths.json

なんかいっぱい出てきた。

READMEを読むと、 npx sls invoke local -f hello で起動しろと書かれている。

> npx sls invoke local -f hello

そのままだとevents変数が定義されていないので怒られる。 なので参照している部分を削除した。

{
    "statusCode": 200,
    "body": "{\"message\":\"Hello serverless\",\"event\":\"\"}"
}

おおー。

【メモ】現場で使うServerlessコマンド

package(--noDeploy)

sls package

デプロイパッケージとCloudFormationテンプレートのみを生成する。 serverless.yml が正しく書けているかをチェックするのに便利。

# 非推奨
sls deploy --noDeploy

--noDeployオプションは同じ効果Deprecated扱いになったため非推奨。

invoke

invoke local

sls invoke local -f someFunction

読んで字のごとく、自機でコードを実行する。 event・context変数などいい感じにやってくれるので便利

invoke (on Cloud)

sls invoke -f someFunction

こちらはデプロイしたコードを実行するコマンド。

deploy

sls deploy

書いたコードを、serverless.ymlファイルの定義に沿ってデプロイしてくれる。

remove

sls remove

デプロイしたアプリケーションをごっそりと消す。 要注意。

【Node.js】Promiseのresolve/reject では処理は終了しない

【Node.js】Promiseのresolve/reject では処理は抜けない

ハマったことなので、メモ。

タイトルの通りで、return文的な挙動をする認識で書いたら、思ったように動かなくてハマった。 resolve・rejectでPromiseを解決したら、もうそれより後の行は実行されないと思っていた。

var someFunc = () => {
  return new Promise((resolve, reject) => {
    reject();

    console.log("この行は実行されないでしょう...");  // ←実行される
  });
}


async function main() {
  var e = await someFunc()
  .then( res => console.log("OK"))
  .catch(e => console.log(e));
}

main();

だが実際は違い、resolve() reject()しても続きの行は実行されて、意図しない動作をしてしまった。 return文 / throw文的な使い方をしていたので実行されないと思っていた。

promise resolve reject 後の処理 でググったら最初に出てきたが、初心者は引っかかるポイントなのだろうか。🤔

qiita.com

いろんな言語をCLI引数でちょこっと実行する

CLIの引数でコードを実行

php コマンドには便利な引数があって、 php -r '何かしらのPHP処理' とシェルから実行すると、その引数に渡したコードの文字列がPHPコードとして実行される。 インタラクティブシェルを起動しないでもコマンドラインからそのまま実行できて、ちょっとした真偽値のチェックや関数の動きを見たい時に大変便利である。

特にNode.jsやRubyについてはこれまでメインで使ってきたPHPと比べ、知らない書き方をすることも多いのでちょっと動かしたいことはよくある。

この記事ではPHP、Node.js、Rubyでそれぞれどう実行したら良いのかをまとめる。

PHP

マニュアルより引用

php [options] -r code [[--] args...]

例:

$ php -r 'echo "Hello world\n";'
Hello world

> php -r '$a = ["PHP", "Node.js"]; var_dump($a);'
array(2) {
  [0]=>
  string(3) "PHP"
  [1]=>
  string(7) "Node.js"
}

Node.js

マニュアルより引用

node [options] [v8-options] [-e string | script.js | -] [--] [arguments ...]

要するに、 node -e 'nodejsの処理' としてあげれば良い。

例:

$ node -e 'console.log(process.version)'
v12.13.1

$ node -e 'console.trace("Hello world")'
Trace: Hello world
    at [eval]:1:9
    at Script.runInThisContext (vm.js:116:20)
    at Object.runInThisContext (vm.js:306:38)
    at Object.<anonymous> ([eval]-wrapper:9:26)
    at Module._compile (internal/modules/cjs/loader.js:959:30)
    at evalScript (internal/process/execution.js:80:25)
    at internal/main/eval_string.js:23:3

Ruby

マニュアルより引用

 ruby [--copyright] [--version] [-SUacdlnpswvy] [-0[octal]] [-C directory] [-E external[:internal]] [-F[pattern]] [-I directory] [-K[c]] [-T[level]] [-W[level]] [-e command]

Node.jsと同じく、 -e 'Rubyの処理' で実行できる。

例:

$ ruby -e 'unless(false) then puts "Hello world" end'
Hello world

$ ruby -e 'p nil == 1'
false

Rubyは他の言語と違って別の行で then やら end やらを書くことが多いのでちょいと戸惑った。

Rails Runner

RubyRailsを使う他にも、Runner を使う方法がある。 取引先の上長の方に教えてもらった。感謝感激。

$ bundle exec rails r 'puts "Hello world"'
Hello world

さいごに

以上である。

ちょっとしたテクニックではあるが、だれかの参考になったら嬉しい。