はじめに
皆さんは、CodeWarsをご存知でしょうか?
何それ? コードで戦争?
いえ、戦争はしません。問題を解くある種のゲームです
https://www.codewars.com/
Achieve mastery through challenge.
Improve your skills by training with others on real code challenges
英語全くワカラナイ私ですが、要は、問題を解けば解くほどコーディングスキルが上がるはずだよって言っていますね!
今回は、CodeWarsの良さ・使い方を伝えるのではなく、
1:CodeWarsを導入した結果、意外と社内の人に好評だったということと、
2:GAS を使って、あなたの会社にも導入してみませんか?という二本立てで進めていきます!
CodeWars自体の解説に関しては、こちらの記事を参照していただくのが良いと思いました。
【Codewars】ブラウザでコーディングの基礎からトレーニングできるサイト (ブラウザでvimが使えて32種類のプログラミング言語に対応。4000個以上の問題が投稿されています!
この記事では
1:CodeWarsを導入した結果、意外と社内の人に好評だったという話をします。
…..
とある面談にて
新人:コンコンコン..
新人:「あっ、失礼します」ガチャっ
上司:「よくきた新人君。調子は、どうだい?」
新人:「まさか、5月にヒーターを付けるなんて、札幌舐めていました。」ペロペロっ
上司:「コラ!何をしているんだ!」ペッペッ
上司:「まぁ、札幌は5月に桜が咲くからな、全てが1ヶ月遅れていると思ってくれて構わない」
新人:「は、はぁ」(納期も1ヶ月遅れにならんかな…)
上司:「早速だが、今日は「入社してから困っていることはないか」、「ウチでどんなことをしていきたいか」の2つを聞きたいんだ。本音ベースで良いぞ、歯っ歯っ歯!」
新人:「あ、よろしくお願いします。。。」
上司:「それじゃ、まずは「入社してから困っていることはないか」、だ。入社してから2週間ほどだが、もう慣れたか?」
新人:「はい。このご時世ですが、フルリモートで働いていたこともあり、問題ないと思います。海外で働いていたこともあり、海外の方とも問題なくコミュニケーション(ドイツ語・中国語・スワヒリ語)が行えています。業務に関しても、1日1万行ほど書いており、周りからも相談されるようになってきましたね」
上司:「」
新人:「」
上司:「ま、まぁ。その、なんだ。ウチもそこを評価して採用した節はあるからな。期待しているよ」
新人:「」
上司:「」
上司:「と、特に悩みは無さそうだし、次の質問に移ろうか。「ウチでどんなことをしていきたいか」だが、どうだ。何でも良いぞ、言ってみてくれ。」
新人:(んー、)
新人:(と〜くに無いんだよなぁ…)
新人:(あ、あったわ。エンジニアが多い会社だし、(設計書もだけど)、もっとコードの共有とかあっても良いと思ったんだよな。)
新人:(業務用コードだとセキュリティ的に色々言われそうやな。CodeWarsとか社内チャットツールに導入して、皆のコード見る、とかならイケそうやな。それにしよ。)
新人:「Code Wars がしたいです。」
上司:「戦争!?!?!?!?」
こうして、CodeWars を社内で使うチャットツールに導入することになった。
ココが良いよ、CodeWars
業務用コードの共有とかだと、色々ご法度がありそうだけど、CodeWarsなら同じ問題を皆で解けること。
とある日の夕暮れ
新人:「ん〜、CodeWarsを導入することになったけど、どうするのが良いかな〜」
新人:「ウチでは、ChatWork、Teams、Slack色々使ってるからな〜。とりあえず、ChatWorkで良いか」
新人:「必要そうなのは、GASとCodeWarsのAPIか」
GAS
CodeWarsAPI
新人:「CodeWarsの問題は昔解いてた良問をリスト化して、スプシに貼っとけば良いか。こんな感じに毎回1問取ってきて、その問題ごとのpathだけ貼っとけば管理楽かな。」
スプシ_CodeWars_List
(セキュリティの関係上、Githubに落としました)
新人:「だいたい、こんな感じで実装するかー。」<br>1:平日のみ出題。(gsファイル)<br>2:スプシのPickUp_Listsシートからランダムで毎日一つ、N時台に出題される。(トリガー)<br>3:一度出題された問題はスプレッドシートから削除される。(gsファイル)<br>4:スプシ上で、残りの問題数が3つ以下になると、投稿時に、残り[X]なので問題を補充してねと表示される。(gsファイル)<br>
新人:「」カタカタ..
新人:「カタカタカタ….」カタカタカタ…
新人:「ガタガタキリバ….」(クワガタ!カマキリ!バッタ!ガーった!ガタガタキリバ!ガタキリバ!!)
….
新人:「できたー!GASはトリガーアクションの指定がクリック一つで終わるから素晴らしい。」
新人:「だいたいUIは、こんな風にすれば良いかな。」
新人:「よし。あとは、上司を追加してレビューしてもらえば…」ポチィ
新人:「…やべ。ミスって全員入れてもうた。まぁええか。」
上司:「」
新人:「」
結果
ということで、いきなり全員を追加してしまい、あれよあれよの合間に皆さんに解いていただいております。
今ちょうど二ヶ月目に差し掛かっていますが、有難いことにアクティブユーザーが1〜2割ほどいたりしです。CEO(元々エンジニア)から入社1ヶ月目の人まで、様々な方に解いてもらっています。
5/25 ~ 5/31 解答数 32
6/1 ~ 6/25 解答数 65
と、約1ヶ月で100位のコードのシェア数がありました。今後はこれがキープできるように色々施策を練っていきたいですね。
ここからは良かったこと、改善点を2つずつあげていきます。
良かったこと
1:いろんな言語の回答が見れたこと。
当たり前なのですが、元々の出身が違ったりするので、JavaScriptだけじゃなく、Ruby, Rust, C##, C, Swift, Java などの解答が溢れ出てて、個人的にはとても新鮮味を感じています。
突然ですが!みなさん! 元々在籍している敏腕エンジニアが、どんな言語を触るのか把握したかったりしませんか。
CodeWarsを通じることで、
(あ、この人昔Rubyやってたんだ。バックグランド似ているかも!)
(あ、Rust勉強したくなったら、この人に聞けば良さそうだな)
(この人の書くコードすごい…)
とコードのシェアだけで多方面のことが分かったりするので、この恩恵が地味に嬉しかったりします。
(Juliaのコードとか、えぐいワンライナーとか見た時、本当に訳わかんない状態でしたが、そういうのも一興ですよね)
2:同じ問題、同じ言語でも違う解き方があること。
これがCodeWars最大のメリットだと考えています。
サイト上でも、解き終わるとベストプラクティスなコードが上位に挙げられて閲覧できるようになっています。
例えば、この問題
https://www.codewars.com/kata/54bf85e3d5b56c7a05000cf9
だと
私
codewars.js
const number = array => array.map((list, index) => `${index+1}: ${list}`)
先輩
codewars.js
const number=function(array){
return array.flatMap((char, i)=> `${i}: ${char}`)
}
// 実際には、flatMapが未対応らしくパスはしないのだが、個人的に ES2019 の flatMap を知らなかったのでとてもタメになった
ベストプラクティス
codewars.js
var number = function(array) {
return array.map(function (line, index) {
return (index + 1) + ": " + line;
});
}
と、簡単な問題でも、解き方は様々だということが分かると思います。
そして、優劣が付けられる以上、エンジニアとして「つよつよ」になるべく、ベストプラクティスのコードを覚えていったり、計算量に意識を向くようになったりもします。
CSの知識が薄い人などにこそ、CodeWarsオススメしたいです。
改善点
ここからは、改善点です。沢山ありますが、クリティカルなモノが以下2つになりました。
1:問題の選定
せっかく解くなら、実務にも役立つ、かつ、数学力が付くような問題 をできるだけ選びたいモノです。
今は私が解いたモノ、他の人が解いていたモノを拝借してスプシにペタペタ貼っていますが、めちゃめちゃ難しかったりすると、取り掛かる時間がないので、そこらへんの吟味の必要もありそうです。
問題リストがあるスプシのメンテナを増やして、メンテナが問題を随時アップデートしていく、とかだと皆で管理できてハッピーになるかな、と考えています。
2:飽きさせないようにさせる
やはり、皆さん忙しいので、取り掛かる時間がなかったりです。飽きさせないための対策を練るべきですが、人の心は読めないので、ベストプラクティスが見出せずにいます。
現状は、平日のみの出題する、に設定していますが、週3でも良いのかなーとか、実務でこのコードが役立った!等の実例の共有ができれば良いのかなーとか、考えてたりしています。
まとめ
継続が一番難しい。
さて、下の記事では、どうやって平日出題するようにGASを使って実装したか、がつらつらと書いているので、お時間がある方は是非読んでください。