jfluteの日記 このページをアンテナに追加

2018-05-27

あれもこれもやらなきゃプレッシャーが集中力を阻害する

|

「あれもやったほうがいいよ」

「これもやったほうがいいよ」

「いろいろなことやらなきゃね」

うわーーーーー(><

...

って、気分の方いらっしゃいませんか?

定番のお悩み教室

jfluteは立場上、
様々な方のメンタリングをやらせて頂く機会が
多いのですが、これは本当に定番中に定番です。

特にここ数年 (4,5年くらい!?) は、
どんどん激しくなってきている気がします。
プログラミングの世界では技術が多様化し、
Webサービスにおけるエンジニアの役割が多様化し、
目指すキャリアも多様化しています。
世の中みんなそうかもしれません。

「いろいろなことやったほうがいいよ」

こういった声が先輩の口から、
物理的に聞こえてくることもあるでしょうし、
頭の中でその声を勝手に作り出すこともあるでしょう。

役に立たないことはない

まず、ひとつお伝えすること。
いまやってることでも...

ちゃんと追求していれば

それが役に立たないことはないよ、と。

追求した内容が直接役には立たないかもしれない。
でも、追求する過程での...

o スキルアップのための判断や行動力
o 追求したものを捉える論理性とバランス感覚
o 追求の壁を乗り越える経験

実は、追求した内容以外のスキルが
たくさん身に付いているのです。
しかも、追求したことによって、
それらを高いレベルで得られています。

野球一年だけ、サッカー一年だけ、
バスケット一年だけ、バレーボール一年だけ、
それはそれで得られるものもあるでしょうが、
高いレベルの悩みを経験できてない可能性があるのです。

あと、に追求した内容自体も
予想外役に立ったりしますよ。
何年も後に「役に立ったー」ってびっくりします。
思ったよりも、そのもの自体の価値を
理解していないもので。

こんな人は成長しない?

例えば、プログラミング言語Java,

「Javaばかりやっていたら、
全然成長しないよね」

それでは、こんな人はどうでしょう?

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
自分はJavaばっかりだ...Java人間と呼んでくれ。
今月は、ConcurrentHashMapのコードを読んで、
そのメカニズムを全部理解してみよう。
来月は、javax.crypto.Cipherを使いこなそう。
再来月は、マニアックなGeneric追求してみよう。
再再来月は、簡易なWebサーバーを自作してみよう。
再再再来月は、DIコンテナのコードを読んでみよ...
再再再再来月は、簡易なJDBCドライバーを自作し...
再再再再再来月は、O/Rマッパーのコードを読ん...
再再再再再再来月は、Webフレームワークのコード...
再再再再再再再来月は、Dukeの着ぐるみを作っ...
Javaの勉強終わんねー。
_/_/_/_/_/_/_/_/_/_/

さて、この人が Ruby のお仕事をやることに
なりました。全然使えないエンジニアでしょうか?

そりゃまあ、追求した内容自体は、
直接的には役に立たないでしょう。
ただ、その追求するパワーが Ruby に向けば、
ほんの数ヶ月で最低限の仕事では困らないくらいになって、
一年後には「ほんとにJava人間だったの?」って、
そうなる可能性は十分あります。

そういう方、たくさんたくさん見てきました。

追求は縦割りではない

また、追求というものは、
一つのものに固執するのが追求ではありません。
というか、「一つのものってなに?」って疑問も。

「Webサービスを一人で作れるようになりたい」

そういう追求であれば、
Javaをある程度、RDBはもちろん、
インフラも学んで、Swiftもちょこっとやって、
デザインも少し、利用規約など法的なことも...

一人のWebサービスの開発という、
一つのことを追求するわけです。

結局、どういう自分になりたいか?
どういう自分がいま求められているか?
それが "一つのもの" と言えるかもです。

一つの世界の中に色々なものもあります。
どの粒度に自分が立っているのか?
どの視点に自分を置きたいのか?

目の前の道具の表面だけで、
"一つに固執" とか "色々なもの" とか
議論してはいけないのでしょう。

...

もし、自分がどうなりたいのか?
まだよくわかってないようであれば、
気にせず目の前のことを追求しましょう。

誰が成長しないのか?

立ち止まってる人です。

一つのことばかりやってるとか、
色々なことをやっているとか、
あまり関係ありません。

種類数がいくつだろうが、
立ち止まってボーッと生きていたら同じです。

色々なことをやっている人はキラキラ見えます。
でも実はあたふたしてるだけかもしれません。

あれもこれもというプレッシャーで、
いま追求すべきものに集中できないこと

それが、成長を止めます。

...

「確実に自分が安心して成長できると
証明されたものじゃないと行動できない...」

このように考える人もいるかもしれません。
残念ながら証明できる人は地上には存在しないので、
その心の足かせを解くメンタリングが必要でしょう。

...

さあ、

「ボーっと生きてんじゃねえよ!」

と叱られないように。

集中力が自分を助ける

さて、この悩みは、
jflute自身も例外ではありません。
いまでもそのプレッシャーに襲われます。

DBFluteばかりやってきました。
JDBCにはめちゃ詳しくなってきたけど、
でも全然実務じゃ役に立たない。
働きながらもプライベートはDBFluteばかり、
知識は非常に偏ります。

それはコンプレックスありました。
いまもあるっちゃあります。
もともと初心者からの社会人でしたしね。

でも、ひとつ言えるのは...

集中力は切らさなかった

ということでしょうか。

...

こんなことがありました。

jfluteがフォロー先のオフィスにいて、
とあるWebデザイナーの方から相談を受けました。
珍しいので、ちょっとびっくりしながら、
jflute「何でしょう?」
デザイナーIEでこのデザインが...CSSで...」
jflute (知らねー><)

まあ、色々と技術的な相談を受けるという立場で、
「なんかすごい人いる」という話だけ伝わってたようで。
まあ、業務上のスコープが正式に違うので、
「ちょっと専門外で...」って言えなくはないのですが、
「なーんだ」って思われるのもなんか怖くて(><、
話を聞いてしまいました。

わりと複雑な話になっていて、
その方も解決の焦点が定まってなかったので、
ヒアリングもして、質問の分析と問題の分析をして、
いま何を調べてどうアプローチすれば、
その答えに辿り着きやすいか?
そこをまとめてアドバイスをさせて頂きました。

そこで話は終わって、その後しばらくすると...
「jfluteさんの通り調べたら解決しましたー。
助かりました、ありがとうございます!」

jflute (ふおぉぉぉぉぉー、あぶねー)

これは少し極端な例でしたが、
こういったことが実はたくさんあります。
プログラミングの世界の中だって、
様々なレイヤがありますから。

技術のアドバイスをしているんじゃなくて、
問題分析と問題解決のアドバイスをしている、
ということなのかもしれません。

でも、jfluteは別に、
コンサルタントだったわけじゃありません。
それができるのは、集中力を切らさず、
DBFluteの問題ばかりひたすら解決する中で、
そのイベントで考えたプロセス抽象化し、
汎用的な問題分析や問題解決セオリーを意識し始めて、
それをずっと積み重ねてきたから、と言えるかもです。

そういったスキルが昔よりもアップしたことで、
別の技術を習得するときに、
昔よりも効率良く吸収できてると実感します。

また、追求するというパワー自体を衰えさせなかったことで、
追求すべきものが変わってもすぐに追求できるのだろうと。

# でも、ドキドキするから、
# あんまりぼくの知らないこと
# 聞き過ぎないでください笑。

だから、だいじょうぶだよ

なにか積み重ねてるなら、あんまり心配ないですよ。
積み重なってるかどうかに気付いてないのであれば、
それは一緒に見つけましょう。

...

こんなブログも書いてましたね:

// まず何より、目の前の道具を使いこなしてください
http://d.hatena.ne.jp/jflute/20180223/mastercurrent

// プログラマー多様化の時代に教える難しさ
http://d.hatena.ne.jp/jflute/20140909/diversity

f:id:jflute:20171204213156j:image

にゃんだむにゃんだむ 2018/05/27 19:44 JDCGはお疲れ様でした!
イベントは行けなかったのですがjfruteさん登壇を前日に知りすごく悔しかったです(笑)

今日のエントリーもすごく参考になりました。今、色々なところからあれもこれも勉強したほうがいいと言われ優先順位が全て優先!→何から手をつければいいんだ〜💫状態になっていたので
今回のエントリーを読んで、目的を持って一つ一つ掘り下げて進んでいけばやがて実を結ぶんだという勇気を貰いました。
DBflute自体を使えるほど自分のスキルが追い付いていないのが悔しいですが、年内には触れるようになります(>_<)

jflutejflute 2018/05/27 20:15 にゃんだむさん、嬉しいコメントありがとうございます!(^^。
登壇のお知らせが直前で申し訳ありませんでした。またの機会にぜひ!

> 優先順位が全て優先!
そうなってしまいますよね。今回のエントリーが少しでもお役に立てば幸いです。

> DBflute...年内には触れるようになります(>_<)
ありがとうございます!応援してます、がんばってくださいー。

2018-05-20

DBFlute Intro-0.2.1 Released

|

DBFlute Introのリリースです。

Decomment (でこめんと) の改善、
そして、Hacomment (はこめんと) の登場です!
(今回の機能は、DBFlute-1.1.8 と
組み合わせることで利用できます)
 => DBFlute-1.1.8 Released

そもそも Decomment (でこめんと) とは?
という方はこちらのページを:
 => Decomment (でこめんと) on Intro

DB変更による置き去り回避

Decommentでコメント登録後に、
DB変更でテーブル名やカラム名が変わると、
そのDecommentが置き去りにされてしまいました。

Introの新しいバージョンでは、
それを検知してマッピングできるようにしました!
(かぼマッピング)
 => テーブル名が変更されるとどうなる?

もし、その状況が発生した時は、
SchemaHTMLの上部の目立つところに、
マッピングのためのリストボックスたちが表示されます。

これで安心して利用することができますので、
どんどんDecommentしていきましょう。

gitブランチ名を活用

Decommentで、コンフリクトしたとき、
gitのブランチ名を表示するようにしました。
こうすると、何と何でバッティングしたのか、
よりわかりやすくなるはずです。

もちろん、gitが入ってない環境であれば、
その処理は無視されて正常に動作します。

# こちら、昨年の DBFluteフェス2017 での、
# コミッターの "でこちゃん" の発表の時に出た、
# ユーザーの方からの発想です。
# しっかり約束守りましたね!(^^

HistoryHTMLでもコメントを

さて、こちら新機能!

HistoryHTMLでもコメントを
登録できるようになりました。

Hacomment (はこめんと) と呼びます。
 => Hacomment (はこめんと) on Intro

HistoryHTMLは、DBFluteが自動で作成する、
DB変更履歴ドキュメントですが...

"この日のDB変更は、どういう理由のものだっけ?"
"この日のDB変更は、スプリントいくつ?"

などなど、もっと業務的な情報も、
HistoryHTMLに置いておきたいものです。
そこで、Hacomment機能を使うと、
HistoryHTML経由でどんどんコメントを
残しておくことができます。

こちらも、Decommentと同様に、
gitコンフリクトが起きないような仕組みなので、
トピックブランチでもどこでも、
気軽にコメントしていくことができます。

使い方も、要領はDecommentと同じです。
DBFlute Intro経由でHistoryHTMLを開き、
それぞれの "Diffのタイトル" 付近で、
クリックしてみてください。

ぜひ、HistoryHTMLにもコメント書いていきましょう!

Introのアップグレード方法

DBFlute Intro は、
Manageタスクで 88 (intro) を選択すると、
自動的に最新版がダウンロードされます。

すでにダウンロード済でも、
ローカルにあるのが古いバージョンであれば、
自動的に判別して上書きしますので、
アップグレードは非常に簡単です。

ただ、手動でダウンロードして利用している場合は、
新しいバージョンも手動でダウンロードして、
差し替える必要があります。
(そこも自動でアップグレードできるように、
どうにかしたいですねぇ...)

Introコミッターたち!

今回の DBFlute Intro の実装は、
jfluteはほとんどやっておらず...

DBFlute Introコミッターの若者たち、
"チームいんとろんずおん" が、
リリース作業まで自分たちでやり遂げました。

jfluteは、プロダクトオーナー的な立ち位置で、
機能デザインなどのアドバイスやテストなど、
ファシリテーションに徹しました。

これだけの機能を自力でリリースできる、
ってすごいことですよ。
紛れもないオープンソースプログラマーたちです。

かぼす、でこちゃん、はきば、ありがとう!

f:id:jflute:20180507175246j:image

2018-05-19

DBFlute-1.1.8 Released

|

Java8対応のDBFluteのリリース。
DBFlute-1.1.8 です。

Change Log | DBFlute
(1.1.8からの移行の注意点は特になし)

今回は、Alto DBFlute周りが、
大きく改善されています!

SchemaHTML

テーブル作成日、カラム作成日が、
表示されるようになりました!
 => SchemaHTMLのExample

もともと HistoryHTML を見ればわかることでしたが、
やはり、SchemaHTML上でパッとわかったほうが、
活用されることも多いでしょう。

直接的に役立つ情報ではありませんが、
"このカラム...後から追加されたんだ、なるほどだから..."
って、何かDBに関して迷うことがあったときに、
役立つかもしれません。

...

さて、Decommentの大きな改善に関しては、
DBFlute Introリリースブログでお知らせします。

その他、小さな修正です。
DBコメントにHTMLエスケープ文字(<)が入ってると、
HTMLタグに展開されて表示されていたのを修正しました。

HistoryHTML

まず、デザインを修正!少しだけ見やすくなった...はず。

そして、DB変更の "作者" と "gitブランチ名" が、
表示されるようになりました!
 => HistoryHTMLのExample

作者は、Systemプロパティのuser.nameより、
gitブランチ名は、gitコマンドから。
(もちろん、gitを使ってない環境なら素通りです)

DB変更の履歴はどんどん積み上がってきますが、
"誰が、どのブランチで?" ってのがわかると、
迷ってることが解決しやすいかもしれません。
(ブランチ名がチケット名になっていれば、
実質的にチケット番号になりますし)

また、HistoryHTMLの自動生成スピードが上がっています。
今まで、Historyがたくさん積み上がると、
Docタスク自体が何秒もかかってしまっていたのですが、
大量Historyに関するパフォーマンス劣化は、
ほとんどなくなりました。
もし、"Docタスクで30秒くらいかかる" とか、
感じている方いらっしゃいましたら、
ぜひ 1.1.8 にアップしてみてください。

内部的には...
古くからあった MapListString の代わりに、
新しく作った DfMapStyle を使っています。
今後、他の "mapスタイル" のファイルの読み込みでも、
DfMapStyle の方を使っていく予定です。

...

さて、大きな新機能、Hacommentに関しては、
DBFlute Introリリースブログでお知らせします。

その他、小さな修正:
o DBコメントにHTMLエスケープ文字(<)が入ってると、
HTMLタグに展開されて表示されていたのを修正

SchemaPolicyCheck

まず、SchemaPolicyCheckって何?
のために、概念ドキュメント作りました!
 => DB設計のチェックスタイル (SchemaPolicyCheck)

そして、今回の改善の目玉は...

運用途中からでもチェック書けやすくなった!

に尽きます。

既存テーブルでチェックかかりまくってしまう問題、
これで新しいテーブルもチェックが外れちゃう...
というジレンマありました。
ですが、こんな条件が書けるようになりました。
# 2018/05/19より未来に追加されたテーブルは、
# FK制約名は FK_[テーブル名] で始まること
; if firstDate is after:2018/05/19 then fkName is prefix:FK_$$table$$
ドキュメントでも紹介しています。
 => 運用途中からの導入

とある日付から未来に追加されたテーブルやカラムだけ、
...なチェックをする、ということが可能に。
既存テーブルは置いておいて、これからはこうしていこう!
ということができるので、もっと気軽に適用できます。

それに伴って、
いままで theme だけでしか指定できなかったチェックが、
statement でも表現できるように改善が行われています。

o hasAlias, hasCommentなどが statement でも
o same...IfSame... が statement でも

その他、細かい改善が行われています。

o ドットつなぎの tableColumnName が利用できるように
o if columnName is $$table$$_ID と表現できるように
o if alias is $$tableAlias$$ID と表現できるように
o then columnName is $$table$$_ID と表現できるように
o then alias is $$tableAlias$$ID と表現できるように

ぜひ、SchemaPolicyCheckで、
良いDB設計ライフをお過ごしください()^^。

ConventionalTakeAssert

ReplaceSchemaで、
テストデータが一件も入ってなかったら落ちる...
という ConventionalTakeAssert ですが、
こちらもやはり、運用途中から適用が難航していました。
すでにテストデータのないテーブルがたくさん!

ということで、ここでも firstDate が使えるようになり、
; onlyFirstDateAfterTargetDate = 2018/05/19
とすると、その日付以降に追加されたテーブルだけ、
チェック対象とすることができます。
    # /- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    # o conventionalTakeAssertMap: (NotRequired - Default map:{})
    #  Does it assert data by conventional rule in take-finally
    #  For example, you can check empty table (no-data).
    #
    ; conventionalTakeAssertMap = map:{
        ; emptyTableMap = map:{
            ; isFailure = true
            ; workableRepsEnvTypeList = list:{ut}
            ; tableExceptList = list:{}
            ; tableTargetList = list:{}
            ; onlyFirstDateAfterTargetDate = 2018/05/19
        }
    }
    # - - - - - - - - - -/
テストデータ、しっかり入れていきましょう!

simpleDtoDefinitionMap

SimpleDtoを自動生成する機能があります。
 => (転送用の)シンプルなDTO

ここで、テーブルや外だしSQLごとに、
自動生成の除外や対象を指定できるようになりました。

o tableExceptList/tableTargetList
o sql2entityExceptList/sql2entityTargetList

DBFluteユーザの集いメーリングリストで、
要望を頂きました。
 => SimpleDtoの生成範囲に関して | DBFluteユーザの集い

SimpleDtoのご利用ありがとうございます!
(マニアックな機能ですけど、使われているもんですね^^)

Spring + HikariCP

SpringFramework + DBFlute で、
HikariCP を利用する時に、
自動でトランザクション制御が行われるようにしました。

今まで、commons-DBCP と Tomcat-DBCP だけが、
自動制御の対象だったので、他のDBCPを使う時は、
"一手間だけ" 必要でした。
今回、その一手間を省けるDBCPが増えました。

こちらは、ユーザーの方のフィードバックで、
コードレベルで指摘をしてくださいましたので、
本当に助かります。
taktosさん、ありがとうございます!
(ついでに!? commons-DBCP2 も対象になっています)
 => HikariCPへの対応依頼 | DBFluteユーザの集い

ただ、そもそもの構造を変えて、
どんなDBCPだろうが自動制御できないか!?
まだ議論が続いています。
TransactionAwareDataSourceProxy を、
うまく組み込めたらいいですが...

ついでに、DBFluteのSpringページが、
だいぶ古くなっていたので刷新しました。
 => Spring Frameworkの取扱い

LastaDoc

LastaFluteの自動生成ドキュメントLastaDoc,
 => Actionのドキュメント自動生成 (LastaDoc)

のデザインを微調整しました。
(少し見やすくなったはずです)

また、lastafluteMap.dfprop にて、
LastaDocの表示内容を少しだけ
微調整できるようにしました。
とりあえず、Action一覧のdescriptionを
非表示にできるように。

LastaDocを、オフィシャルドキュメント的に使う想定で、
その辺を調整したいという要望がありました。

オープンソース全文検索サーバー Fess にて、
LastaDoc が大いに活用されているようです。
 => Fess の LastaDoc

LastaFluteの特徴の一つですね(^^

Oracle, BLOB in プロシージャ

Oracle で、ストアドプロシージャの引数で、
BLOB型を使っている場合に、
大きなサイズのbyte配列を指定すると、
エラーになってしまう問題を修正しました。

なんと、そういう場面でもDBFlute使われてるんですね(^^。
フィードバックをくれた awaawa さん、ありがとうです。

また、今後そういった場面が他の箇所でもあるかもしれないので、
プラグインのvalueTypeとして、
"bytesBlobType" を利用できるようにしました。
いざとなったら、これを指定すれば、
何かBLOB周りで発生した問題を回避できるかもしれません。

その他、細かい修正

o 組み込んでいる H2 database を 1.4.197 にアップ

o Runtime の DfStringUtil.count() のパフォーマンス改善

o DBコメントに、バックスラッシュが入っていると、
自動生成されたクラスがコンパイルエラーにならないように

ユーザーがいるからリリースできる

様々なユーザーの方の協力のもと、
リリースできたバージョンと言えるでしょう。

本当に、ありがとうございます。

古いドキュメントを少しずつ改善していこうかなと
思っています。これからもよろしくお願いします。

f:id:jflute:20180511161644j:image

2018-04-01

DBFlute-1.1.7 Released

|

Java8対応のDBFluteのリリース。
DBFlute-1.1.7 です。

Change Log | DBFlute
(1.1.6からの移行の注意点は特になし)

今回は、dfprop で新しいプロパティ多く追加されています。
でも、それらどれも非常にマニアックではありますが...

# DBFlute Runtime, DBFlute Engine
# 両方ともアップグレードしないと、
# 自動生成クラスでコンパイルエラーになりますので、
# 両方のアップグレードお忘れなく。

repsAsDataManagerMap

replaceSchemaMap.dfpropにて指定できます。
ReplaceSchemaをデータ登録としてだけ使うことができます。
例えば、Flywayと連携する時に使えるかもしれません。
# flyway creates schema by own-managed DDL so replace-schema becomes data manager
; repsAsDataManagerMap = map:{
    ; isUseRepsAsDataManager = true
}
でも、Flywayを使う時に、
必ず使うかというとそうではないと思います。
ローカル環境ではフルのReplaceSchemaで、
サーバー環境ではFlywayを使う、という風な住み分けに
なっていればこの機能は不要です。

ローカルでもFlywayを使うけど、
テストデータはReplaceSchemaを使いたい、
というような時に利用します。

databaseSubType

basicInfoMap.dfpropにて指定できます。
例えば、SQLServerを使うにしても LocalDB だと、
またちょっと動きを変える必要が出てきたりします。

具体的には...
ストアドプロシージャーやVIEWのdrop文で、
データベース名の修飾を付けるとエラーになるとか。
(将来変わるかもしれませんが)

そんなとき、subTypeOnDatabase に、
localdb と指定しておくと、
LocalDB用の挙動になってくれます。
    ; database = sqlserver
    ; subTypeOnDatabase = localdb
対応はまだちょっとだけですが、
将来的に色々と「同じDBでも種別によって違う」が
増えてきた時に、このプロパティを利用していきます。

take-finally.sh

ReplaceSchema の take-finally にて、
スクリプトが利用できるようになりました。

大量データ登録など、
DBMSネイティヴコマンドを利用したい時に使えます。
Windowsなら.bat, Mac/Linuxなら.shです。

// TakeFinallyで外部スクリプト
http://dbflute.seasar.org/ja/manual/function/generator/task/replaceschema/takefinally.html#outsidescript

conventionalTakeAssertMap

replaceSchemaMap.dfpropにて指定できます。

例えば、ReplaceSchemaにて...

"テストデータが一件もないテーブルがあったら落ちる"

というチェックをかけることができます。

テストデータなしで新しいテーブルが
どんどん追加されるのを防ぐことができます。
(最低でも一件はデータを作ってテーブル追加)
    # /- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    # o conventionalTakeAssertMap: (NotRequired - Default map:{})
    #  Does it assert data by conventional rule in take-finally
    #  For example, you can check empty table (no-data).
    #
    ; conventionalTakeAssertMap = map:{
        ; emptyTableMap = map:{
            ; isFailure = true
            ; workableRepsEnvTypeList = list:{ut}
            ; tableExceptList = list:{}
            ; tableTargetList = list:{}
        }
    }
    # - - - - - - - - - -/
tableExceptList で除外もできるので、
既存テーブルを指定して、途中から運用するというのもできます。
また、一時テーブルで0件じゃないといけないものも指定できます。

deprecatedSelectByPKUQMap

littleAdjustmentMap.dfpropにて指定できます。
selectByPK(), selectByUniqueOf() を、
非推奨にするオプションです。

あんまりやらないと思いますが、
SpecifyColumn を必須にしている現場だと、
自動的に全カラムspecify()になってしまう
selectByPK()が困るということで、
このようなオプションが設けられました。

deprecatedSpecifyBatchColumnMap

littleAdjustmentMap.dfpropにて指定できます。

deprecatedSelectByPKUQMapと同様で、
SpecifyColumn を必須にしている現場だと、
specify().everyColumn()されたら意味ないので、
このようなオプションが設けられました。

細かい改善していってます

他にも細かいのありますが、
DBFluteもまだまだこういった細かい改善が
求められています。

昨年はあまりリリースできませんでしたが、
今年はちょくちょく改善をリリースしていきたいと思います。

2018-03-18

「ニュアンス」と「エンジニアの心得」という新卒研修のお仕事

|

昨年、2017年に、とっても意外で、
とっても嬉しかったことと言えば、
jfluteとしては、こちらですね。

「”価値あるサービスを生み出すエンジニア”になるために」
新卒エンジニア研修を全公開!
| REACH ONE ビズリーチのイマとこれから

新卒が成長して新卒研修を

入ってくる新卒スキルの前提や、
会社としての状況の変化から、
新卒研修自体の形が変わってきて、
講義形式から実践形式に変わってきました。

というか、もともとそういうのもやりたいね、
でもフォローできる体制がなかなか整わない、
というところでしたが...

新卒研修を受けた新卒が成長して、
自主的に新卒研修の運用をしていく

これが年々しっかりと積み重ねられて、
jfluteも驚くくらい自己組織化されていました。
(素晴らしい...)

ということで、
「そろそろ俺もあまり出番ないかな」
と感慨と寂しさの狭間にいたのですが...

「jfluteさんの話は新卒に聞いて欲しい」

と、言ってくれて、(わりと)急遽、
週一でお話することになりました(^^。

ニュアンスの技術話

実践に寄った分を補完するように、
もう少し高度な技術のお話、
現場ニュアンスを含んだお話、
をさせて頂きました。

具体的には...

o DB設計の実践とjfluteレビュー
o 例外ハンドリング徹底(例外の翻訳)
o オブジェクト指向の補足
o Lambda式、Stream API, Optional 
o map()とflatMap()の違い
o DIコンテナとは?
o フレームワークとは?
o オープンソースとは?
o レビューしやすいコードとは?
o 素早い操作をするためには?

基本的には、新卒研修担当の方からの要望ですが、
その場で新卒たちの理解度見てのアドリブもあり。

これらを「現場では...」とか、
「こういう解釈の人もいるし、こういう...」とか、
「歴史的にはこうなってからこうなった...」とか、
様々なニュアンスと一緒に理解していくのが、
jflute流です。そこ大切に思ってくれるのは嬉しい。

また、できるだけ、
「ソースコードを読む意識が付くような説明」
を心掛けています。
何かと「ctrl+クリック」して奥のコードを読んで、
「だからこうなっているんだよ」的な感じで。
JavaAPIだろうが、ライブラリだろうが、
ちょこっとコードを覗いて確認をするのが当たり前、
という風なのが少しでも伝わればと。

個人的には、オープンソースってなに?ってのを、
この段階からしっかり知ってもらうことも大切だなと。
まあ、オープンソースプログラマーですから、
オープンソースのお話いくらでもしますよ^^。

エンジニアの心得「よもやま話」

「よもやま話」と呼んでいて、
一日の最後に、ひとつお話をします。

jfluteの日記からピックアップして、
ブログを紹介するわけですが、
jflute本人から色々なエピソードなどを交えて、
ニュアンスとともに心得を伝えていきます。

これは数年前からお約束のようにやっていて、
ぶっちゃけ勝手に(!?)やっていたわけですが、
これをぜひ「新卒には聞かせたい」と、
前の新卒たちが言ってくれたわけです。
そんな風に思ってくれていたなんて、
涙出るほど嬉しいことですね。

さて、2017年は何をやったかな?
記録を見ないと思い出せないので見てみると...

// 答えよりも答えを導くプロセスhttp://d.hatena.ne.jp/jflute/20110530/1306729010

// エラーメッセージ読め読め大合唱
http://d.hatena.ne.jp/jflute/20130522/errorsinging

// ドキュメントを無料(タダ)だと思っている?
http://d.hatena.ne.jp/jflute/20170402/documentfree

// SIとスタートアップの違いを知ろう
http://d.hatena.ne.jp/jflute/20151007/sista

// 技術的負債の返済プロジェクトが失敗する 11 のワケ
http://d.hatena.ne.jp/jflute/20170211/deptagain

// 独学のきっかけ、技術欲、問題解決欲、自己成長欲
http://d.hatena.ne.jp/jflute/20160210/selfgrowth

// 質問のコツその一: なんでその質問してるのか?も伝えよう
http://d.hatena.ne.jp/jflute/20170611/askingway1

// 90パーセント終わりました、って何パーセント?
http://d.hatena.ne.jp/jflute/20110702/whatninety

// プログラマーに求められるデザイン脳
http://d.hatena.ne.jp/jflute/20170623/desigraming

// 既存コードの甘い匂い (悪意なきチグハグコードの誕生)
http://d.hatena.ne.jp/jflute/20160203/existingcode

// 成長するかしないかは選べる
http://d.hatena.ne.jp/jflute/20160316/selectgrowth

// こうはい extends せんぱい
http://d.hatena.ne.jp/jflute/20131124/extendsmaster

// サービス開発者は、それ必要?いつ必要?スキルが求められる
http://d.hatena.ne.jp/jflute/20170708/servicepriority

// レスポンスのある人は信頼される
http://d.hatena.ne.jp/jflute/20170828/responsetrusted

結構ありました笑。
一日一回だけでなく午前終わりで時間が空いたとき
とかにもやっていたようです。

でも、これでも取捨選択しています。
その前の年からしたらしゃべる機会が少ないので、
毎日の恒例みたいな感じにはできないので厳選しました。

でも、また新しくブログ書いてあるから、
厳選も変わってくるかもしれませんね。

一生懸命やっていれば驚けるよ

あと、DBFluteハンズオンも入ってます。
最初のさわりだけでも全員で。
厳密には、配属次第でDBFlute使わない人も
多くなってきているのですが...
(そもそもJavaじゃないって人もいるし)

o DBFlute自体から学べる思想やノウハウ
o ハンズオン自体から学べる技術力

これを買ってくれたようです。
そのように作ってきたつもりですから、
よりいっそう嬉しい驚きです。

...

また、新卒研修を受けた方々から、
DBFluteオープンソース活動を
手伝ってくれる人たちも出てきてくれたこと、
これまた予想外の嬉しい...

...

まだあるよー。
「考え方もオープンにしたい」ってことで、
整理整頓も兼ねてブログしっかり書いてきたら、
こんな風に自分の仕事に役立つなんて!
書いてるときは、思いませんよそんなこと。

...
...
...

「新卒研修、頑張ってきて良かったんだなぁ」

ちょっと個人的な感傷ですが、
そういう風に言えるって幸せだなと。
なんか本当良かったなぁって。

一方で、昨年は伝えるチャンスが少なかったですから、
どれだけ響かせられるかって非常に不安で怖かったです。
チャレンジャーのつもりで集中していたと思います。
それで新卒自身に紹介記事のようなこと書いてもらえて、
ああ、良かったぁってホッとしてます笑。

今後も色々な変化があると思いますから、
こういうのいつまでできるかわかりませんが、
いつでもチャレンジャーの気持ちは
忘れないようにしたいなと。

...

何ごともそうですね。
最近ひしひしと感じます。

一生懸命やっていれば予想もしない形で、
積み重ねが嬉しさになって跳ね返ってくるよ

その驚きを楽しみに、
目の前のことに集中したら、
いいんじゃないでしょうか?

f:id:jflute:20180101154931j:image