人間は学び始めの時に自信過剰に陥りやすい

表題の通り、人間には、学び始めの時に自信過剰に陥りやすい、という特徴があります。
一般的に、ある分野について学び始めた時は自信過剰になり、更に学ぶとその分野の知見の深遠さに気付き自信がなくなる、そしてそれ以降は徐々に自信がついていく、という経過をたどります。

これは心理学の用語で「ダニング=クルーガー効果」と呼ばれます。
知識・経験の程度と自信の高低については、以下の図が分かりやすいでしょう。


IT分野においては、IPAの高度情報処理技術者試験(ネットワークスペシャリスト試験、データベーススペシャリスト試験等の区分に分かれた試験の総称)のような難しい試験に若手の内に合格して自信過剰になる、というのが分かりやすい例でしょう。
高度情報処理技術者試験は確かに各々の分野の最高峰とされる試験であり、人によっては2~3年の経験と勉強で一部の区分に合格することができますが、若手の内に最高峰とされる試験に合格できてしまうことが一つの罠になっています。

最高峰とされているものの、実際には、この試験に合格するだけでは以下の知見を身につけることはできません。

  • 製品固有の知見
  • 最新の知見
  • 現場固有の知見やアドホックなテクニック

高度情報処理技術者試験に合格するとその分野については極めたと感じて自信過剰になってしまいがちですが、実務経験が伴っていないと上記のような知見が抜けてしまいがちなため、「各々の分野のスペシャリストになるための下地が身に付いた」というのが正しい理解です。


自信過剰に陥ると、その分野に精通している人物から実力を低く見られてしまうので、注意が必要です。
例えば、SESの面談の時に「○○はできますか」とスキルを確認する質問をされることがありますが、ここで、案件・現場の固有の事情や導入技術等の具体的な情報を確認することなく自信満々に「できます!」と答えてしまうと、自信過剰である(実力的に未熟である)と見られてしまう可能性があります。
その分野について勉強していたとしても、自分が知らない知見があることを常に考えて、謙虚になるのが重要です。


若くして立派な資格を持っているのにも関わらず人物面の理由で面談に落ちてしまった、という話を聞いたので、今回の記事を投稿しました。
私自身も、若い時に自信過剰になり、周りと上手くコミュニケーションが取れなくなり、評価を落としたことがありました。

自信が生まれるほど勉強すること自体は素晴らしいことですが、努力して身につけた知見を実務の中で上手く活かすためにも、謙虚さを忘れないようにすることが大事です。

DNSキャッシュポイズニング、カミンスキー型攻撃

この記事では、「DNSキャッシュポイズニング」と呼ばれる攻撃手法と、その発展型である「カミンスキー型攻撃」について説明します。
これは、情報処理技術者試験でも問われる内容です。特に、情報処理安全確保支援士試験を受験する際には内容を抑える必要があります。


「DNSキャッシュポイズニング」と呼ばれる攻撃手法を理解するためには、まずDNSの仕組みを理解する必要があります。
Webの世界ではサーバーにアクセスするためにアクセス先のIPアドレスを知る必要がありますが、URLで良く使われるのはドメイン名です。
ドメイン名からIPアドレスを得るためには、ドメインを管理しているDNSサーバーにアクセスする必要があります。
DNSサーバーは階層型になっており、自身で管理していないドメインについては上位のDNSサーバーにアクセスすることでIPアドレスを得る仕組みになっています。

ここで、DNSサーバーは、上位のDNSサーバーへのアクセスの頻度を減らすために、上位のDNSサーバーから得た応答結果は、一定期間、キャッシュに保持します。
再度同じ問い合わせが来た場合は、キャッシュを見て応答することになります。


ここからが「DNSキャッシュポイズニング」の説明になります。

DNSキャッシュポイズニングは、上位のDNSサーバーからの応答を攻撃者が偽装する、という攻撃手法です。
応答を偽装することで、攻撃者が意図するサーバーにアクセスさせることが可能となり、当該ドメインを当該DNSサーバーへ問い合わせた利用者に被害を与えることができます。

そして、この問い合わせ結果は、DNSサーバーのキャッシュに保持されます。
このキャッシュが残っている限り、後の利用者にも被害を与えることができます。
「DNSキャッシュポイズニング」という名の通り、DNSサーバーのキャッシュを汚染することで、攻撃が成立します。


しかし、DNSキャッシュポイズニングを仕掛けるのは現実的には困難です。
上位のDNSサーバーへの問い合わせが発生する瞬間、つまりキャッシュの有効期限が切れた瞬間を狙って攻撃しなければならないため、DNSキャッシュポイズニングを仕掛ける機会がなかなか訪れません。

ここで、情報セキュリティ研究者のカミンスキーが公開した「カミンスキー型攻撃」と呼ばれる発展型の攻撃手法が使用されることになります。
この攻撃手法では、攻撃者自身が攻撃対象のDNSサーバーに対して、ランダムで生成したドメイン名(キャッシュに保持されていないはずのドメイン名)を問い合わせることで、上位のDNSサーバーへの問い合わせを発生させます。
この攻撃を繰り返すことで、DNSキャッシュポイズニングを仕掛ける機会を増やすことができてしまいます。
この攻撃に成功してもランダムに生成されたドメインがキャッシュに保持されるだけですが、キャッシュに保持された情報を利用することで、DNSサーバーの利用者に実質的な被害を与えられる可能性があります。


カミンスキー型攻撃を含むDNSキャッシュポイズニングの対策としては、DNSサーバー側に以下の手段を講じることが有効です。

・DNSサーバーが問い合わせを受け付ける範囲の限定する

自ネットワーク以外からの問い合わせを拒否することで、外部の攻撃者からの攻撃されることを防ぐ。

・ソースポートランダマイゼーションを行う

上位DNSサーバーへの問い合わせには、通常はTCP/UDPの53番ポートが使われる。
このポート番号をランダムなものに変更することで、攻撃が成立する可能性を減らすことができる。

・DNSSECを導入する

DNSSECとは、DNSサーバからの応答が正当かを確認する方式を定めた規格である。
これを導入することで、応答の偽装を困難にする。


社内の業務で多忙だったため、日が開いてしまいました。

今回の記事は、社内の勉強会で発表された内容をブログの記事としたものです。
(前回の記事の後書きで紹介した「関数インデックス」も、社内の勉強会で発表されたものでした)

社内外で知識を共有するのは良い習慣なので、これからも続けていきたいと思います!

RDBMSのインデックスの概略的なまとめ

5年前に、RDBMSのインデックスについて、個人的に簡単にまとめていましたので、そのまとめを展開します。

今回の記事では、情報処理技術者試験の出題範囲内で、要点を箇条書きしています。
実務で使うには+αの知識(主にRDBMS固有の知識)が必要になりますが、情報処理技術者試験の知識はその+αの知識を身に付ける上での土台になります。


【インデックス全般の知識】

  • インデックスは、テーブルの検索を高速化する目的で用いる。
  • インデックスは、検索条件として指定するカラムに対して設定する。
  • テーブルのレコード数が少ない場合は、インデックスの効力が落ちる。(インデックスを使わずに順番に走査した方が早い場合もある)
  • インデックスには、レコードの挿入や更新や削除が遅くなるデメリットがある。(それらの操作を行う度にインデックスの再構成が発生するため)

【インデックスの種類と特徴】

①B+木インデックス

  • RDBMSで一般的に用いられるインデックスである。(情報処理技術者試験で「インデックス」と出たら、指定がない限りこのインデックスだと思って良い)
  • 検索キー値を用いて二分検索を行うインデックスである。
  • BETWEEN句等の範囲検索で後述のビットマップインデックスより優れる。
  • ORDER BY等のソートが必要な場合に優れる。
  • NULL検索やNOT検索では効果を発揮できない。
  • 少ない件数に絞り込めるカラムに設定すると効果が高い。例えば、一意な値が格納されるカラムに設定すると、1件のみに絞ることができ、効果が高い。逆に、二値しか持たない「性別」のようなカラムに設定しても効果は低い。
  • 検索値が等しく分布している時に効果が高い。

効果が高い例

カラムの値件数
a200
b200
c200
d200
e200
f200

効果が低い例

カラムの値件数
a1200
b200
c0
d0
e0
f0

②ビットマップインデックス

  • 検索キー値が持ち得る値をビットで保持し、それをレコード毎に保持する。
  • AND/OR条件のみの検索ではB+木インデックスより効果が高い。
  • NOT検索ではB+木インデックスより効果が高い。
  • 持ち得る値が少ないカラムに設定するとB+木インデックスより効果が高い。(例えばカラム「性別」等)

③ハッシュインデックス

  • 検索キー値をハッシュ化したものをインデックスとして用いる。(ハッシュ化…特定のアルゴリズムにより不可逆の固定長の値にすること)
  • 一意な値を検索するのに向いている。
  • データ量が増えても検索にかかる時間が変わらないと言われている。(正確には、データ量が増えるとハッシュ値の衝突が増え、時間が微増する)
  • BETWEEN句等の範囲検索には適用できない。
  • ORDER BY等のソートが必要な場合には適用できない。
  • ワイルドカードを用いて検索する場合はB+木インデックスの方が良い。

繰り返しになりますが、今回のまとめは一般論であり、RDBMS固有の知識は別途必要です。
また、今回のまとめは5年前のものなので、現在のトレンドを捉えたものではありません。

例えば、私が実務を通して知った範囲で言うと、現在では「関数インデックス」と呼ばれるインデックスを備えたRDBMSが増えています。
これは、カラムを関数で計算した結果、例えばカラム1とカラム2の合計値をインデックスとして持たせることができる、というものです。
MySQLでは、バージョン8.0.13(リリース日:2018/10/22)から導入されました。
https://blogs.oracle.com/mysql-jp/post/functional-indexes-in-mysql-jp

私も、基礎を大事にしつつも、知識のアップデートを怠らないようにしていきたいと思います。

問題は分割して考えるべき

一般的に、何かの問題を解決したい場合は、解決する道筋を考えて、問題を分割しようとするべきです。
そうすることで、

  • やるべきことが明確になる
  • わからない所が出てきた時に調べやすくなる
  • 作業分担ができるようになる

といったメリットがあります。

これは、プログラミングにも言えることです。
初学者の場合、何かのプログラムを作る時に「何から手をつけたら良いのかわからない」という状態になることがあります。
この状態になった時は、どのように処理を組み合わせれば作りたいものを作れそうか、日本語で良いので列挙することが重要です。
そうすることで、思考を整理できますし、熟練者に質問もしやすくなります。


例として
「Windows端末で、ワンタッチでファイル内の”a”の文字を”b”に置換する」
という問題を考えてみます。

まずは、以下のような2つの問題に分割することができます。

  • どのプログラミング言語で実装するか
  • どのようなロジックで実装するか

「どのプログラミング言語で実装するか」という問題に関しては、今回は手軽さ・性能の高さ・汎用性の高さのバランスが良いC#で実装することにします。

「どのようなロジックで実装するか」という問題については、更に以下の3つの問題に分割することができます。

  • C#のプログラムをワンタッチで実行する
  • ファイルの入出力を行う
  • “a”の文字を”b”に置換する

「C#のプログラムをワンタッチで実行する」については、「Hello World!」と呼ばれる文字を出力するだけの最も簡単なプログラムを実行してみるのが良いです。
今回は、以下のように、batファイルから実行する方法を採用します。これにより、batファイルをダブルクリックするだけでC#のプログラムを動かすことができるようになります。

・フォルダ構成

・execute.bat

・replace.cs

・実行結果

コンソールが立ち上がり、”Hello World!”と出力される。


「ファイルの入出力を行う」については、ファイルを入力して1バイトずつ読み込んでそのまま出力するだけのプログラムを作るのが良いです。
先に作ったプログラムを少し改変してみます。

・フォルダ構成

・replace.cs

・input.txt

・実行結果

filesフォルダの下にoutput.txtが生成され、中身はinput.txtと同じになる。


あとは、読み込んだ文字について「”a”の文字を”b”に置換する」処理を追加すれば、今回の問題は解決します。
先ほどのプログラムを改変してみます。

・replace.cs

・実行結果

filesフォルダの下にoutput.txtが生成され、中身は以下の通りになる。


今回は、新人研修の度に毎回教えていることを記事にしました。
新人研修の時はJavaのプログラムの課題を題材にしていますが、題材を問わず同じことが言えます。

問題を分割して考えられるようになるだけでも仕事を進めやすくなるので、今まで意識できていなかったという方には改めて意識することをお勧めします。

ラポール形成とは

ラポール形成とは、相手との信頼関係を築くことで、コミュニケーションを円滑に進められるようにするためのテクニックです。
元々カウンセリングのテクニックですが、ビジネスにも応用可能です。


自分の立場からの意見を通したり、アドバイスにより相手の行動を変えて欲しいと思っていたりする場合、正論や成功体験を一方的に語るだけでは反感を買うだけとなり、聞き入れてもらえません。
そこで、相手の話を聞き、相手の立場に理解し共感することで、心理的な信頼関係を最初に築くことが重要になります。

まずは、相手を尊重し、相手の言うことに耳を傾けることが重要になります。
その際、相手の言うことを否定せずに、相手を理解しようとすると良いです。
(たとえ、自分の立場や信条、価値観、といったものに相いれない話だとしても、一旦理解することに努めて下さい)
社内外や家族の人間関係のような、プライベートな話までしてくれるようになるのが理想的です。

自分の意見を発したりアドバイスをしたりするのは、このようにして信頼関係を得てからです。
信頼関係を得てからであれば話を聞き入れてもらいやすくなりますし、相手の立場や心理状態に合わせた形でより適切に意見やアドバイスができるようになるという副次的なメリットもあります。


例えば、TOEIC高得点を取りたがっている新人エンジニアに対して、自分は基本情報処理技術者試験を優先して欲しいと思っているとします。
ここで、頭ごなしに基本情報処理技術者試験を優先するように言うのはNGです。

その代わり、まずはなぜTOEIC高得点を取りたがるのかを聞く必要があります。
そうすると、「今は海外のエンジニアと仕事するのが当たり前なのでTOEICを勉強したい」のような回答が返ってきます。
その気持ちを尊重した上で、「国内で実績を重ねないと海外でも相手されにくい。まずは基本情報処理技術者試験でエンジニアとしての基礎を固めて、国内で実績を重ねてから、海外のことを考えた方が良い」のような形でキャリアパスを提示しながら基本情報処理技術者試験を勧めると、聞き入れてもらえる確率が高くなります。


以前に「IT業界におけるメンタルヘルス対策」という記事を書きましたが、その時に「ラポール形成」については別の記事に書こう、と決めていました。
そう決めたままで今まで投稿していなかったのを思い出したので、投稿しました。

専門的な知識無しにビジネスの場で応用できるテクニックですので、覚えておいて損はないでしょう。