<style>
/* basic design */
.reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6,
.reveal section, .reveal table, .reveal li, .reveal blockquote, .reveal th, .reveal td, .reveal p {
font-family: 'Meiryo UI', 'Source Sans Pro', Helvetica, sans-serif, 'Helvetica Neue', 'Helvetica', 'Arial', 'Hiragino Sans', 'ヒラギノ角ゴシック', YuGothic, 'Yu Gothic';
text-align: left;
line-height: 1.6;
letter-spacing: normal;
text-shadow: none;
word-wrap: break-word;
color: #444;
}
.reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 {font-weight: bold;}
.reveal h1, .reveal h2, .reveal h3 {color: #2980b9;}
.reveal th {background: #DDD;}
.reveal section img {background:none; border:none; box-shadow:none; max-width: 95%; max-height: 95%;}
.reveal blockquote {width: 90%; padding: 0.5vw 3.0vw;}
.reveal table {margin: 1.0vw auto;}
.reveal code {line-height: 1.2; background:#DDDDDD}
.reveal pre code{background:rgb(245, 245, 245); max-height: 1000px}
.reveal p, .reveal li {padding: 0vw; margin: 0vw;}
.reveal .box {margin: -0.5vw 1.5vw 2.0vw -1.5vw; padding: 0.5vw 1.5vw 0.5vw 1.5vw; background: #EEE; border-radius: 1.5vw;}
/* table design */
.reveal table {background: #f5f5f5;}
.reveal th {background: #444; color: #fff;}
.reveal td {position: relative; transition: all 300ms;}
.reveal tbody:hover td { color: transparent; text-shadow: 0 0 3px #aaa;}
.reveal tbody:hover tr:hover td {color: #444; text-shadow: 0 1px 0 #fff;}
/* blockquote design */
.reveal blockquote {
width: 90%;
padding: 0.5vw 0 0.5vw 6.0vw;
font-style: italic;
background: #f5f5f5;
}
.reveal blockquote:before{
position: absolute;
top: 0.1vw;
left: 1vw;
content: "\f10d";
font-family: FontAwesome;
color: #2980b9;
font-size: 3.0vw;
}
/* font size */
.reveal h1 {font-size: 4.0vw;}
.reveal h2 {font-size: 3.0vw;}
.reveal h3 {font-size: 2.6vw;}
.reveal h4 {font-size: 2.4vw; color: #EE6557;}
.reveal h5 {font-size: 2.2vw;}
.reveal h6 {font-size: 2.0vw;}
.reveal section, .reveal table, .reveal li, .reveal blockquote, .reveal th, .reveal p {font-size: 1.6vw;}
.reveal td {font-size: 1.2vw;}
.reveal code {font-size: 0.9vw;}
/* new color */
.red {color: #EE6557;}
.blue {color: #16A6B6;}
/* split slide */
#right {left: -18.33%; text-align: left; float: left; width: 50%; z-index: -10;}
#left {left: 31.25%; text-align: left; float: left; width: 50%; z-index: -10;}
</style>
<style>
/* specific design */
.reveal h2 {
padding: 0 0.75vw;
border-left: solid 0.3vw #2980b9;
border-bottom: solid 0.2vw #d7d7d7;
}
</style>
# 「お前に本物のコーディングってやつを教えてやるよ」
KT#031-Java、新人教育(?)
瀬村雄一
---
## 自己紹介
瀬村です。半年振りでした。
- 周りが社会人として成長してる気がして焦ります。
- 経験を積むために、研究以外にも色んな仕事に手を挙げることにしています。
- サステナブルなシステムについての研究開発
- 社内ドキュメントの整備
- SE志望者向けインターンのお手伝い
- 開発案件に向けた技術調査、サンプル作成
- 新人研修の講師 ←これの話
---
## 新人研修 - 概要
- 研修の講師をやってました。大変ですが楽しいです。
- 教えることによって勉強になることもありました
- 新入社員向けのコーディング研修
- 課題を解いて、使用を満たすプログラムを提出しよう!
- 講師のコードレビューを受けて、FBをもらおう!
- 対象は新人さん9人で、進捗状況のチェックやらレビューを瀬村+3人くらいでやってます。
- 講師多めの研修で結構手厚くフォローをしています。
---
## 新人研修 - 研修の目的
- 学んでもらいたいことは盛りだくさん。
- アルゴリズム
- 設計、データ構造
- Java の仕様
- 良いコード、保守性
- 単体テストを書く、テストケースを検討する
- 経験として得られるもの
- Java のコードを書いて、自分でテストする
- 複雑なプログラムを自力でデバッグする
- 難解な仕様に立ち向かい、クラスの設計を行う
- コードレビュー, Git, CI/CD, Slack, Eclipse, デバッガ, etc...
---
## 新人研修 - 教材
- 弊社オリジナルの教材です。
- もともとは経験者や派遣社員に対するスキルチェックを行っていた。
- なかなか良い問題ですが、2010年以前に使ってたものから変えてないので古いです。
- 3週間くらいで、超簡単1問、難問2問を解きます。
- FizzBuzz
- EclipseとかGitHub使ってみましょう
- 読みやすさ、変数名などを考える
- 1970 年からの秒数(整数)を与えられた時の、年月日時分秒を答える。
- 複雑なアルゴリズムを考える
- 双方向リストの実装(JavaでいうLinkedList)
- オブジェクト指向について考える
- 中身が空のメソッドが与えられてるので、問題文を読んでそれを埋める。
- 仕様確認のための受け入れシステムに合格したら、コードレビューが入る。
- 修正して、レビューを何回か繰り返す。
- 合格がもらえたら、発表会をやって終わり。
---
## お前の書いたコードは汚い
例えばこんなコードに指摘を入れるなら?
「整数numが与えられて3の倍数ならFizz、5の倍数ならBuzz、15の倍数ならFizzBuzz、正の整数でないならunderflow、それ以外なら数字をそのまま返す」
---
main関数は省略
```java=
public class FizzBuzz{
static String FIZZ_BUZZ = "FizzBuzz";
public static String baseball(int s)
{
int num = 3;
String str = Integer.toString(num);
// num には3が入っている。
if( s % num == 0 ){
str = "Fizz";
}
else if(s % 5 == 0 && s % num != 0){
str = "Buzz";
} else if (s % 15 == 0){
str = FIZZ_BUZZ;
}
if (s > 0){ /* 0 以下 */
return str;
}
str = "underflow";
return str;
}
}
```
---
指摘例
- l1. baseball ではなくて意味のわかるメソッド名にしましょう。
- シンプルに int fizzBuzz() でも良いよ
- 意味のわかる変数名にしよう。誤解の生まれにくいものにしようね。
- s -> num
- num -> FIZZ_MULTIPLE
- str -> result, message
- FIZZ_BUZZ -> FIZZBUZZ
- 変数は定数にしよう。定数にするときはスネークケースにする。
- ついでに、3と5も定数にしよう
- そもそも仕様通り動かない。判定の順番が違う、条件式が無駄。
- formatterを使ってください。インデントがガタガタで非常に厳しいです。
- 見てわかるコメントは要らないっす。
---
正解例(main関数は省略)
```java=
public class FizzBuzz{
public static String FIZZ_MSG = "Fizz";
public static String BUZZ_MSG = "Buzz";
public static String FIZZBUZZ_MSG = "FizzBuzz";
public static String UNDERFLOW_MSG = "underflow";
public static int FIZZ_MULTIPLE = 3;
public static int BUZZ_MULTIPLE = 5;
public static String fizzbuzz(int num) {
if (num <= 0){
return UNDERFLOW_MSG;
} else if (num % FIZZ_MULTIPLE == 0 && num % BUZZ_MULTIPLE == 0){
return FIZZBUZZ_MSG;
} else if (s % FIZZ_MULTIPLE == 0){
return FIZZ_MSG;
} else if (s % BUZZ_MULTIPLE == 0){
return BUZZ_MSG;
}
return Integer.toString(num);
}
}
```
---
## 良いコードはハートで書け
受講生に意識してほしい話
- 「とりあえず動いた」を目標にしてはいけない。
- 正しく動くプログラムを書く以上に、保守性や可読性も考えようね。
- 一応業務で使える技術を教えます的な感じで講師をやっている。
- 研修では、思いつきだけでソースコードを書かない
- 個人的には息をするように書けるようになるのが理想なんだけどね
- 「一行一行に意味を込めよう。なぜ書いたのかを説明できるように考えながら書こう」
- 結構厳しいけど、研修としてはコードを考えて書く癖をつけてもらうことに意味があるかなと思う。
---
とは言っても、
- とりあえずテストが通ったのでプルリクを出してくることがある。
- 生徒は動くコードを書くことに一旦は注力する。そこから保守性とかを気にしていく。
- 「lintが通ってないので、通してください」
- 「変数名をもう一度考えてきてください」
---
## 講師として
- 生徒には程よく優しく接することが求められます。
- まぁ、講師として厳しすぎず、時には褒めたりを忘れたりします。
- 偉そうにやってました。
- 講師なのである程度偉そうにやる必要があると思います。
- 情報系出身でバリバリやってた人はたまにいるが負けずに講師ヅラする。
- 生徒の評価をするのはしんどい
- 個人的にリモートで付きっきりなではないので、
- 「この研修で学んだことを実際の仕事に生かしてください」
- (by エアプ講師)
---
- セムラあるある「意見がふにゃふにゃしてる」
- 自身を持って、論理的に喋りましょうね
- ✕「いや~どっちの書き方もやる人はいるんだよな~」
- △「は? このほうが綺麗だろ。オレはこの書き方が好き。最強。文句は言わせん」
- ○「この書き方のメリットはこれで、あの書き方のメリットはこれだから」
- 要するに、当たり前にやっていること(コーディング)に突然理由を求められると、あれこれなんでなんだっけ、みたいになる。普通に講師として勉強になる。
- 質問されてわからんかったら、「こちらで調べてSlackで共有します」でOK
---
- (例)Java の検査例外、非検査例外について。
- 検査例外は throw を明示する必要がある
- IOException, SQLException
- コンパイラでチェックされる
- 非検査例外は throw を明示しなくて良い
- NullPointerException, ArrayIndexOutOfBoundsException
- RuntimeExceptionを継承している
---
という違いは知っていたが、実際どんなエラーが検査例外として設計すべきかは知らなかった
- 改めて調べ直し
- Error(エラー)
- プログラムが停止せざるを得ない状態
- OutOfMemoryError, StackOverflowError
- Exception(検査例外)
- ソースコードの書きようによらず避けることが出来ないもの
- 避けることが出来ないので例外処理を用意してほしい場合に投げる
- RuntimeException(非検査例外)
- ソースコードの書きようによっては避けることが出来るもの
- だからわざわざチェックする必要のない場合に投げる
---
- 副作用のあるメソッドは嬉しくない
- (Todo)
---
- static なメソッドってどういう時に使うんだよ
- 設計思想(ステートレス、シングルトン)
- (Todo)
---
## 単体テストが書きたくなるよね
- この研修を終えると嫌でも単体テストが書きたくなります。
- JUnitの書き方
- 「ホワイトボックステスト、網羅率、ブラックボックステスト、境界値分析」
- 「闇雲にテスト量産してもやーよ。テスト割けるパワーはちゃんと使いなさいよ」
- 「観点が大事よ。無駄の無いテストを行おう。」
- テストといえば、こういうコンテンツも作ったわ
- テストケースを作成しよう①②
- https://k3tunnel.com/k3t/sampleMenu.html#k3t-sample-category-anchor
---
## その他
- 講師だけじゃなくてコンテンツ更新もやりました
- 研修環境構築、環境構築手順書、問題の準備なども大変である
- 新人に知ってもらいたい技術が多すぎる話
- Git と GitHub Enterprise と CI/CD(Jenkins)使ってる
- そのへんもムズいよな。
- 僕も入社するまで使ったことなかったし覚えること多い
- まぁ、Jenkinsは新人にはテストマシーンに見えてるかも
---
## まとめ
- 講師として1ヶ月やりました
- もっと偉そうに滑らかに話すようになりたい
- 来年もやる予定かもしれません。会社を辞めたらやりません。
- 学んでもらいたいことは、盛りだくさん。初学者に教えたい技術は多い。
{"metaMigratedAt":"2023-06-17T12:39:17.625Z","metaMigratedFrom":"YAML","title":"【コーディング】お前に本物のコーディングってやつを教えてやるよ","breaks":true,"slideOptions":"{\"theme\":\"white\",\"slideNumber\":\"c/t\",\"center\":false,\"transition\":\"linear\",\"keyboard\":true,\"width\":\"75%\",\"height\":\"100%\"}","contributors":"[{\"id\":\"f19d136b-5434-44b8-b7a4-24df52387c7c\",\"add\":8290,\"del\":0}]"}