ひよっこSEの備忘録

20卒の未経験エンジニアの日々の備忘録です。

【参照系】Javaをデータベースに接続する

研修の復習です。突っ込み・修正大歓迎です。

 

データベースについてはこちら

nekomurasan.hatenablog.com

***

 

JDBC

Java Database Connectivity

JavaのプログラムをRDBへ接続する専用のAPIです。

複数のDBMSの差異をなくし、1つに集約します。

 

DBへ接続

細かく手順で区切って書き残しておきます。

今回は参照系の場合です。

 

接続の流れとしては、

  1. データベースへの接続
  2. SQL文を実行後、結果を取得するためのステートメントを作る
  3. データベースから返ってきた結果を格納する

となります。

SQLへ接続

まずはSQLへ接続をします。

データベース操作用のJDBCを利用し、接続したいDBのURL,USER,PASSWORDを入力して接続します。(接続の認証が不要な場合、userとpassは要りません。)

JDBC URLは、データベース接続先を指定する文字列です。文字列は、各DBMSによって違います。(ex.MySQLの場合 jdbc:mysql://サーバ名/DB名)

Connection con = DriverManager.getConnection(JDBC url, user,password); 

Connection:DBMSへの接続・切断時に利用します。

DriverManager:DBMSへの接続準備に利用します。

getConnection:指定されたDBへの接続を試みます。このメソッドにはthrows宣言に例外が指定されていますので、最後にcatchで受け取る必要があります。(SQLException)

 

ここでは、データベースに接続するためのConnectionオブジェクトを作成しています。接続準備に必要なDriverManagerクラスの.getConnection()メソッドを用いて指定した接続先へ接続をします。

ステートメントの作成

ステートメントは、データベースと情報をやり取りするのに必要な土台のようなものです。

土台を作ることで、SQL文をデータベースに送ったり、そこから返ってきたものを受け取ることができます。

 

PreparedStatement pstmt = con.prepareStatement(sql);){

 

statementオブジェクトとPreparedStatementオブジェクトの違い

statement:実行時に解析を行います。

preparedStatement:実行時ではなく、オブジェクトの生成時に解析を行います。そのためstatementより高速に作動します。

実行結果を格納

ResultSet res = pstmt.executeQuery();

先ほど作成した土台を使ってexecuteQuery()メソッドを実行すると、データベースから結果が返ってくる場合にResultSetのインターフェースとしてresに格納されます。

 

ここまでで、データベースから指定した情報を取り出すことができました。

ここから、その情報が入っているresを使って処理をしていきます。

 

DBを使った処理

while(res.next()){
System.out.println(res.getXXX("任意の変数"));
}

データベース内の、任意の変数の値を全て表示します。

ResultSetオブジェクト(res)を使用して値の取得をしています。

resのみだと最初の行の前にカーソルが指している状態なのでnext()メソッドを使い次行へ移動させます。

変数のデータ型に合わせた型をXXXに入力することで、.getXXX()メソッドで欲しいフィールド値を取り出すことができます。

(ex.名前の場合はgetString("name")等)

例外をcatchする

} catch (SQLException e) {
System.out.println("異常が発生しました");
}

.getConnection()は上で書いたとおり例外が指定されているので、try文後にcatchします。

 

リソース付きtry文

以前書いた例外の記事では、tryの後すぐに{}があったと思います。

しかし今回出てきているtry文は、{}の前に(Connection con...)が続いています。

try後に()で変数宣言ができるのは、変数宣言時にAutoCloseableが継承されているインターフェースが使われているからです。リソース付きtry文(try-with-resources statement)と呼びます。

今回し用したインターフェースはConnectionです。

AutoCloseable: try-with-resources statementが閉じられるとき、自動的にclose()を呼ぶ

これは、変数(リソース)の型がAutoCloseableを継承しているインターフェースの場合のみ使えます。これを継承していることで、自動的にclose()が呼ばれます。

継承されていないインターフェースを実装した場合は、コンパイラエラーとなります。

 

コード一覧 

数行割愛しています。

//フィールド宣言
String url = "任意のurl名";
String user = "任意のユーザ名";

String password = "任意のパスワード";
String sql = "select * from testrecord;

//データベースへ接続
try(Connection con = DriverManager.getConnection(url, user,password);
PreparedStatement pstmt = con.prepareStatement(sql);){
//SQLステートメントの実行
ResultSet res = pstmt.executeQuery();
//結果の取得
while(res.next()){
System.out.println(res.getXXX("任意の変数"));
}

} catch (SQLException e) {
System.out.println("異常が発生しました");
}

 

【MySQL向け】SQLの基礎

今はMySQLよりMariaDBのが使われる?とか研修で聞きましたが、私は研修でMySQLを使ったのでMySQL目線のお話です。

 

データベースについては前記事をどうぞ。

nekomurasan.hatenablog.com

 

***

 

 

SQLとは

構造化問合せ言語(Structured Query Language)

RDBMSのデータを定義・操作・制御するための言語です。

データベースはそのままだと操作ができないので、それを解決するためのものです。

国際標準化されており、様々なデータベースで利用することができます。

Java等のプログラミング言語とは違った役割を持ち、データベースのみに使われるものです。

SQLの命令文には、DDL,DML,DCLの3種類があります。

 

SQLを用いてデータの操作ができるRDBMSは、MySQLMariaDBPostgreSQL等あります。

 

DDL

データ定義言語(Data Definition Language)

データベースのテーブルの作成・削除など、テーブルを扱うことを目的とした命令文です。 

 代表的な命令文として、

CREATE:テーブルやデータベース等を作成

create user 任意のユーザ名 identified by '任意のパスワード'; --ユーザの作成

create database 任意のデータベース名; --データベースの作成

create table 任意のテーブル名; --テーブルの作成

DROP:テーブルやデータベース等を削除

drop table 任意のテーブル名; --テーブルの削除

ALTER:フィールドやテーブル等の内容の変更

alter table 任意のテーブル名 add 列名 型; --任意のテーブル名の列名に型を追加

alter table 任意のテーブル名 drop 列名; --任意のテーブル名の列名を削除

があります。

 

DML

データ操作言語(Data Manipulation Language)

データの追加や削除など、データを扱うことを目的とした命令文です。

代表的な命令文として、

SELECT:レコードの取得

select 列名 from テーブル名; --テーブル名から列名を取得する

select * from テーブル名; --テーブル名から全件取得する

UPDATE:レコードの更新

update テーブル名 set 列名1=値1,列名2=値2...; --テーブル名の列名を値に更新する

update テーブル名 set 列名1=900 where 列名2='2020-04-30'; --テーブル名の列名2の2020-04-30の列名1を900に更新する

DELETE:レコードの削除

delete from テーブル名; --テーブル名の情報を削除する

!whereで列指定をしないと情報全件消されてしまいます。

INSERT:レコードの挿入

insert into テーブル名 (列名1,...)values(値1,...); --テーブル名の列名1...に値1...を追加する

insert into テーブル名 values(値1,値2,...); --テーブル名の全列に値1,値2,...を追加する(値の記述は、テーブルの列と同じ順番にする必要がある)

があります。

 

DCL

データ制御言語(Data Control Language)

 DDL,DMLの利用を制限する、制御を目的としたSQL命令文です。

権限の付与やトランザクション処理の決定・キャンセルを行います。

(DBMSによって、権限の付与・トランザクション処理の分類がDDLに分類されているものもあります)

代表的な命令文として、

GRANT:権限の付与

grant allprivileges on 任意のテーブル .* to 任意のユーザ名; --任意のユーザに全ての権限を付与する

REVOKE:権限の剥奪

grant allprivileges on 任意のテーブル .* from 任意のユーザ名; --任意のユーザから全ての権限を剥奪する

 があります。

上記の2つは、データベースの全権を管理するデータベース管理者(DBA)の立場の人だけが使う命令となります。

 

データベースの基礎

 

データベース

省略されてDBと言われることもあります。

一箇所にまとめられて蓄積・管理されているデータの集合体で、作成・管理には一定の形式が設けられています。また、複数で利用・共有すること、検索・加工することも条件にあります。

一般的にはコンピュータ上のものをデータベースと言いますが、紙媒体の電話帳やタウンページもれっきとしたデータベースです。

ファイルシステム上での整合性を解決しています。

ファイルシステムとの違い

データベースが登場するまで多く使われていました。

データベースは数値や文字まで解体された個々の要素を蓄積するのに対して、 ファイルシステムは〇〇のデータという加工済みのファイルとして保存されます。

プログラミング等でデータを使用する際は、ファイルシステムだとファイルのある場所、メモリのどこにあるかの情報が必要となります。

データベースの場合は、格納されているところからデータベース側が取り出してくれるので、場所の情報が不要になります。

DBMS

データベース管理システム(Database Management System)

データベースを管理するためのシステムです。 管理するだけなので、DBMSで何か動かそうとすることはできません。

操作をするにはSQL言語が必要となります。

DBMSの利点
  • 複数のデータを一元管理できる

一箇所にまとめて管理をしておくことで、データがどこにあるのか探す必要がなくなります。

データの位置を意識する必要がなく、命令で欲しいデータを取り出すことが可能です。

  • 複数人で使える

複数のユーザが同時にデータを利用したい場合、データベース側が制御してくれます。(ファイルシステムでは解決できなかった整合性の解決)

  • バックアップ機能

手動でバックアップを取る必要がなく、自動で定期的にバックアップをとることが可能です。

データベースの種類

階層型データベース

会社の組織図や家系図のように、幹から枝が生えている(ツリー構造)イメージです。

親データと子データで1対多数の関係になります。

大型のコンピュータで使用されてきており、大量のデータを高速で処理することができます。(検索する際にルートが1つに限られるため)

データの変更がしにくい、データが重複することがあることがデメリットです。

ネットワーク型データベース

 階層型では実現が難しい、多数対多数の関係を構築できます。ツリー構造よりは網目状のイメージです。

後述するRDBに代替されるようになりました。

ビッグデータ

従来のデータベース群では管理が難しい、巨大なデータ群です。

日々生産されるリアルタイムな情報を指すことが多いです。

NoSQL

SQLを用いないDBMSです。

RDBで必要なテーブル等を用意する必要がなく、あらかじめ用意されている関数のみで操作ができます。

リレーショナルデータベース(RDB)

RDBを管理するソフトウェアをRDBMSと言います。

Oracle,MySQL,SQLserver等、様々なベンダーの製品があります。

 

RDBの特徴として、データを表の形で構成をします。表をテーブルと言います。

複数のデータを表と表の関係を用いて管理しています。

表の縦をフィールド、横をレコードと言います。

あらかじめ用意する基礎のデータをマスタテーブル、日々蓄積されるデータをトランザクションテーブルと言います。

 

レコードを取り出す際には、そのレコードを取り出すのに必要なフィールドを指定します。この時に指定されたフィールドをキーと言います。

キーは他に、社員番号や個人番号のような重複することのない一意(ユニークとも言います)を特定することのできる特別なキーがあり、主キー(Primary key)と言います。

主キーがNULL、空の扱いになることはありません。

複数のフィールドを主キーのように使う時には複合キーと言います。

 

テーブルが複数ある際には、外部キーを使い他のテーブルと結びつけることもできます。

これをリレーションシップと言います。

データベースでは複数のテーブルを使用することが一般的となります。

クラスとインスタンス

研修で学んだ基礎的なことのまとめです。

修正点がありましたら教えていただけますと幸いです。

 

***

 

 

クラス

プログラミングを実行するのに必要な処理がまとめられたオブジェクトです。

クラスの中にメソッドを書き、メソッドの中に処理を記述します。

何のデータが含まれているクラスなのか、見てわかる名前が良いとされています。

メソッド

クラス内の処理のことを指します。

メソッドはクラスの中にのみ記述することが可能です。

プログラム中で呼び出すことができます。

メソッド名();   //同じクラス内から呼ぶとき

メソッドについている()の中には引数を入れることができます。

名称に決まりはありませんが、クラスと同様見てなんとなく理解ができる名前が望ましいのではないでしょうか。

オーバーロード

引数が異なれば、複数の定義ができます。 

 

フィールド

クラス内のデータのことを指します。フィールド≒プロパティ

フィールド宣言

String name = nekomura

型と変数名を使い、変数を定義します。

ローカル変数とフィールド変数

ローカル変数はメソッド内で定義されたもので、そのメソッドを抜けるとなくなります。

一方フィールド変数は、クラス内に直接書かれている変数で、そのクラス内だったらどこからでも参照可能です。

public class Sample {

    public void main(String[] args){

        int add = 10;                  //フィールド変数

    public void Product(){   

        int a = 2;                         //ローカル変数なのでこのメソッド限定

    }

    System.out.println(add);  //フィールド変数なのでどこからでも呼び出し可能

 

インスタンス

クラスをもとに生み出されたオブジェクトです。

 

インスタンス

 クラスからオブジェクトを作成することをインスタンス化と言います。

クラス名 任意の変数名 = new クラス名(); //デフォルトコンストラク

インスタンス化をすることで、任意の変数名の新しいオブジェクトが作成されます。

このとき変数のフィールドは初期化され、値がない状態です。 

 

コンストラク

インスタンス化した際に作動するメソッドです。

メンバ変数の初期化が行われます。戻り値は表記しません。

public クラス名(){  //引数なしのコンストラク

  初期化処理

}

public クラス名(String str){  //引数ありのコンストラク

  初期化処理

}

 

 

カプセル化

オブジェクト指向の特徴の一つです。

 

オブジェクト指向の特徴については後日別記事にまとめ、リンクをここに載せる予定です。

それまでの簡易的な説明↓

 

オブジェクトの属性を隠し、操作のみ公開された状態です。

属性を隠すというのは、外部から参照できないようにすることです。

オブジェクト指向では、private修飾子をつけてカプセル化をするのが通常です。

 

アクセサ

アクセサメソッド

カプセル化された変数を外部からアクセスするために使用するメソッドです。

アクセサメソッドを経由して直接参照させないようにすることができます。

 

原則、アクセサは必ず用意します。

publicを使っている等の参照できる場合は用意しないこともあります。

また、外部から参照させたくない場合にも用意しないことがあります。

getter

アクセサメソッドの一つです。

外部から変数の読み取り・参照に使われます。 

setフィールド名()

このメソッドを使いアクセスします。 

setter

 アクセサメソッドの一つです。

外部から変数を書き込み・設定するのに使われます。

getフィールド名()

 このメソッドを使いアクセスします。

【サポート側視点】保育科文系が内定3つもらって就活を終えた話

nekomurasan.hatenablog.com

 

の裏話。

 

こんばんは。(勝手に夜型だと決めつける)ねこむらさんの学生時代の先輩のリサトです。

就活の最初から内定までアドバイスした私が、この記事に返事をしながら、彼女の就活を振り返っていきたいと思います。まだ読んでいない人はこちらの記事を参照してください。(二度読むことを前提として、少しだけ加筆・修正・省略したところがあります)。


***

 

※ねこむらさんを一文で紹介:私は都内の某女子大の保育系学部を卒業、

今は毎日リモートでJavaの研修を受けている22歳のSE一年目(新卒)。

 

なぜ保育系学部に入ったか

私の母校は保育士資格・幼稚園教諭一種免許を取ることが原則とされていました。同級生の方々の殆どは保育系の仕事に就いていたと思います。しかし冒頭で述べた通り、私は保育の道ではなく一般企業へ就職し、SE職に就きました。

そもそも私は保育士・幼稚園教諭を志望する気持ちがあまりなく、高校時代は「何か勉強しなきゃいけないなら興味のある子どものことがいいな」くらいの気持ちで受験する学部を決めていました。

パッとしない文系大学を出るくらいなら、ごまかしのききそうな女子大かつ資格がついてくるところの方が就職するときの幅も広くなるかなとも思ったり

大学に入ってからは周囲に保育系に就職するつもりがないことを告げたり、大学4年の就活時期に行われる幼稚園教諭実習を避けるために1年の終わりから3年直前まで教授を説得したりしていました。

就活準備

業種選び

上記のように保育系に入ったにもかかわらずそれ以外を志望していた私ですが、業種選びにはさほど時間がかかりませんでした。

  • 営業は嫌(性格的に向いていない)
  • 接客も嫌(バイトで懲りた)
  • 全国転勤有りも嫌
  • 一般職は給料が低くて嫌
  • 保育ももちろん嫌

嫌がりすぎじゃないですかね、私。

リサトはここが1つ目の勝因だと考えています。

ねこむらさんは、自分がやりたくないことを見つけて、業種を絞るのがとにかく早かったです。

 

そのおかげで後述の志望動機も明快なものになり、しかも量産することができました。これで書類の通過率が高まりました。書類の通過率が高いということは、面接がまわってくるということです。面接がまわってくるということは……ここからは少し後でお話しましょう。

 

ともかく上記のことをずっと思っていた私は、消去法なのか積極法なのか、IT企業・SEが真っ先に上がりました。

父親がエンジニアをしていたというのも大きな理由だと思います。

ここでもちょっとストップ。ねこむらさんのお父さんは家でも仕事をするエンジニアだそうです。志望動機には必ず「父親エンジニア話」を書くようにしていました。マトモな企業の立場に立てば、稼げる人材(=会社に何らかの利益を上げてくれる人)が欲しいわけです。

利益の逆を考えてみましょう。損失です。会社にとっては、短期で辞めてもらうのが一番の損失です。そこまでにかかった教育費や給与だけでなく、面接や教育に使った時間などのリソースも浪費することになるからです。

ということで、エンジニアとは何か?仕事の大変さ・辛さはわかっているのか?を父親を通じて知っているということを具体的に訴求できることは書くしかないな、と。

インターン

20卒は3年の夏頃からインターンに行き始めた人が多かったと思うんですけど、(私の周囲だけかな?)夏休みは実習が4週間あったため何もできませんでした。初めて学部選びを後悔しました。

実習で経験値を積むことは、なーんもしないで遊んでいる文系より全然良いと思うよ。

 

夏休みができなかった代わりに9月から短期のインターンを探し、10月ごろに面接をしました。履歴書も不要で、1時間ほどの雑談の混じった面接でした。合格(?)の知らせを受け、中小企業でのインターンに2度参加しました。一つはIT業界の説明会的なもの、もう一つは3日間にわたるJava体験でした。インターンそのものに行った価値があったのかこの時は不明でしたが、プログラミングが楽しかったこともあり後の志望理由に役立ちました。業界解説のものも、自身で調べるスキルが未熟な私にはありがたいものでした。

このあたり、あまり指導した覚えがないです。自分の興味に合わせて動いたということでしょう。

立派ですね。ここでの体験が後のES・面接での受け答えに説得力を持たせてくるので、ここで動いたことは大正解だったと思います。

就活エージェントの登録

12月中旬ごろ、知人のリサトさんからの案内を受けdodaの新卒エージェントに登録しました。が、事務の手違いなのか説明会は流れてしまいました。

 

その後、みん就エージェント(2019にサービス終了)とキャリタス就活エージェントに登録。双方から来る企業案内の数が少ないため、再び2月頃にdodaの説明会に参加しました。こちらはいただける企業の数が多く、一番利用させていただきました。

企業の紹介に限らず、志望動機の添削や面接対策等でもお世話になりました。(面接に関してはかなり苦戦するところがあったので後述)

 

一方、dodaに登録した友人は、「希望した業界の案内がなく、行きたくないIT系しか来ない」と言っていたので、相性の有無はあると思います。

学校の就活支援

ほぼ利用しませんでした。就活セミナー等に参加はしましたが、 あまりいいものではなかったような...(これは大学によるかもしれません)

学内企業説明会もありましたが、希望業種がほとんどなかったので不参加です。

学内合説のクオリティは大学によります。隙あらば自分語りをしますが、リサトは早稲田卒です。好況だったこともあり、誰もが入りたいような企業ばかり大学に来てくれていました。JRとか。まぁこれは、時期と大学によるでしょう。セミナーは、費用対効果が疑問です。そのへんの就活本を2〜3冊読んで、この記事含めてネットで貪欲に情報収集をしていけば、自ずと自分に合った情報が見つかると思います。

ただの四年制大学の場合、大学が生徒一人をいい企業に入れる動機って薄いんですよね。だからエージェントや別のサービスを使ったほうがいいと思っています。

いいシステムやアドバイザーがいればキャリアセンターを利用してもいいかもしれませんが、普通の大学であれば、そんなに利用価値はないと思います。

 

試験対策

ITに絞っていたため、ほとんどの会社でのテスト内容はCABのような規則性のある問題でした。SPIもCABも対策本を買いましたが、あまりやらなかったように思います。(特にSPI)

理由としては、

  • 他業界を受けなかったのでSPIが出てくることがほとんどなかった
  • SPIに時間を取られる
  • 規則性の問題に苦手意識がなかった

また、CABはスマホで取り組める無料のものがあったので、空き時間に触っていました。

本よりスマホで取り組めるものの方が合っていたようです。(これも個人差だと思います)

 

参考までに、以下は私が取り組んでいたCAB対策サイトです。(CAB 対策 とかで色々出てきます。探してみてください。)

career-world.net

ねこむらさんは、この手の問題がとても得意です。(あまり机に向かって勉強してないくせに……うらやましい。)個人差があると思うので、必要十分を見極めてやってください。僕は苦手でしたが、本当に最低限だけやって、面接力でゴリ押ししてエンジニアの内定を取りました。そういう戦略もありかもしれません。

書類選考対策

選考を検討した会社が殆ど中小だったためか、ESの提出はありませんでした。

一社、ESを求められたところがありましたが前述のインターン参加の特典(?)として免除されていました。

 

履歴書の三大項目であるガクチカ(学生時代に力を入れたこと)・自己PR・志望動機は、リサトさんに全て考えてもらいました。

 

その中で志望動機はテンプレを(リサトさん・エージェントの手を借りて)作り、それを各企業の特色っぽいものを交えて書いて(言って)ました。

 

【リサト式志望動機量産法】

1)まず業界全体の志望動機を書く。

2)次に企業のホームページを見て、同業他社と比較し、強みや自分が活躍できるところを見つける。インターンなどの経験があればそれでいいと思ったところを箇条書きにして見つける。

3)なぜIT系の中でも自分がその会社で活躍できると思ったかを書く。

これ、どの業界でも応用がききます。業界の部分だけ変えてください。70点以上の志望動機は量産できるようになるはずです。

ただ、中小企業だと、少し2)で苦労します。HPなどの情報が少ないからです。だからこそ、中小企業の説明会は熱心に聴いて、ESや履歴書に書くことを見つけるという気持ちで望んでください。ぼーっと講義うけるように聴いてちゃだめです。

説明会で情報が集まらなかったり、志望度の高いところは、人事の人にお願いしてOB訪問や会社訪問の斡旋を受けましょう。(中小企業に限らず)

大抵は快諾してくれます。そこで得たことを2)に書けばクオリティが上がります。

 

実は、この時点で面接練習を並行しています。

リサトさん・エージェントによくある質問事項を出してもらいました。

返答を丸暗記ではなく、要点だけ覚えました。

最初は面接練習が嫌だったので、特にエージェント等にお願いすることはなかったのですが、後述する病み期には流石によくないと思いエージェントに面接練習をお願いしました。(3月頃から利用者が殺到でなかなかエージェントの予約ができないので、もっと早くにやればよかったと後悔しました)

面接は数をこなすしかない、というのは半分嘘で半分本当です。大抵の人は、面接と同時に<恐怖>とも戦っていると思います。だからこそ<本番で慣れる>のが一番なのですが、本番に突撃したら死ぬので、上述のように<よくある質問事項>をリスト化して渡しました。大抵の質問は繰り返しなので、20問程度用意しておけば、8割以上は乗り切れます。

面接対策 (説明会→選考ラッシュ)

1月末から説明会や試験に参加し、2月からは一次面接を受けていました。

面接スタート時期がとにかく早いです。僕がスプラトゥーン2やってねこむらさんにキルをとられるスピードより早いです。(リサトが下手)3月にやっと説明会、という上位大学生も多い中で、ねこむらさんの大学では異例のスピードだったと思います。これも勝因。

ビックサイト等で行われている合同説明会に参加することはなく、基本的には各会社が行うものに参加していました。(既に業界が絞られていて行く価値を感じなかったため)

 

中小企業から大企業まで参加しましたが、大企業は雰囲気が合わないと判断し、説明会のみで切り上げて選考には参加をしていませんでした。

胡散臭さを感じて選考辞退したところは、後日Twitterが炎上して辞退してるにも関わらず面接の案内が2回きました。勘って大事ですね。

最初は説明会を聞いてもよくわからなかったのですが、徐々に他社との比較ができるようになったり、疑問点などが沸くようになってきました。この点からも、一つの業界に絞っていたのは良かったように思います。

◆就活病み期

3月頭頃、試験は抜けるのに一次面接で落とされ続け、メンタルが死にました。

実は、ここがリサトが一番の勝因の一つだと考えています。先程いいかけましたが、書類選考に通過した人しか本番の面接は受けられません。そして本番の面接は最大の練習になります。落とされ続けたことによってメンタルは死んだかもしれませんが、何がいけないかが無意識的に分かってきたのだと思います。

この面接の失敗を通じて、どこをどう直せばいいか自分で理解し、パターンを認識すれば、勝ちだと思っていました。あとは、自分以外にもメンタルを支えてくれる人の存在が必要だと思いました。

 

就活を支えてくれたリサトさんには色々アドバイスや励ましをもらいましたが、

正直内定が出るまで心は安定しませんよね。

この頃から”行くつもりはないけど内定もらうために受かりそうな会社”もピックアップし始めました。

受かりそうな会社というのは、内定までのプロセスが短くてとにかく規模が小さく他の就活生が集まらなさそうなところを見ていました。数撃ちゃ当たるをやり始めました。

これ、文章にすると長いスパンの話に見えますが、2週間(長くて3週間)くらいの話だと思います。内定を貰えば安定をすると思っていたのですが、この2週間はかなりきつそうに見えました。

2週間なんですけどね。

東京しごとセンターの紹介

リサトさんから、「東京しごとセンターのすごく優しいアドバイザーを知っているから紹介する」とのことで、東京しごとセンターにリサトさん経由で面談予約しました。

病み期真っ只中で(当時の検索履歴は自○方法とかありました。)あまり期は進みませんでしたが、面談に向かうと柔らかい雰囲気で優しそうな担当者が待っていました。

面接が嫌な話や就活が嫌な話を打ち明けました。アドバイザーからは昔採用担当をやっていたときの心情を聞きだいぶ気持ちが楽になりました。

「面接は行ければ勝ち」 だそうです。

勝因がここにもありました。アドバイザーさんの手腕は凄まじく、課題だったメンタル面の解決に大きく貢献していただいたのですが、その方を紹介はできないので、もう一つ良かったことを。

ねこむらさんは就活において、信頼できる人のアドバイスをきちんと聴き、不安点をきちんと吐き出し、相談してから実行することができていたのです。

あとは自分の力で誰に頼るか?どこを頼るか?をたどることができれば完璧だったのですが、そのあたりは就活経験者であるリサトに考えてもらうのがよいと判断したのでしょう。

初の内定

3月に初めて一次面接を突破し、3月末にインターンを受けた会社で最終面接がありました。

翌週、その会社から初内定をいただきました。まだ就活を続けたいこちらの意思を組んでくださり、承諾はまだ大丈夫だということで、そのまま就活を続行しました。

一度、面接のフィードバックを兼ねた面談がしたいとのことで予定を組み、後日面談を行いました。承諾するよう強制されるのかなと少し迷いましたが、結果としてはそんなことなく、自身が望む就職先に決めてほしいという言葉と、面談のフィードバックと性格検査の結果を見せていただきました。(内容は全部忘れてしまいましたが...)

一社内定をいただいたことでメンタルも安定し、ここより行きたくないと思う会社の説明会〜選考は全てキャンセルしました。これによってだいぶ数が減り、日程もゆとりが生まれました。

内定を保留してくれるところはホワイトです。初めての内定がそういうところであり、ツキも向いていたのかと思いますが、一方で既にねこむらさんには企業を見る目が備わっていた、と考えることもできます。(実際何個も選考途中で蹴ってますしね)。

ねこむらさんとは就活用スケジュールをgoogleカレンダーで共有していたのですが、この内定を受け、カレンダーの予定がかなりスッキリとしました。この感覚はかなりお互いを安堵させました。

残りの選考に集中です。

 

複数内定〜承諾まで

一社内定をもらい自信が出た&選考を受けたのは決まっているところ以上に行きたいと思う会社だったためか、4月中旬ごろに立て続けに二社内定をいただきました。この時点で最初に決まっていたところには(大変親身になっていただいたのですが)内定を辞退する連絡をし、どちらに行くかを決めることとなりました。

内定を受け、

1)自信がついて面接に望めたこと

2)志望動機がさらにクリアになったこと

3)他社の内定を取れる優秀な人である裏付けがあること

4)内定を持っているのに会社に来てくれているという熱意

これらを主に二つの会社が評価してくれたのだと思います。

これらは間違いなく内定一社目では得られないアドバンテージです。

 

一社は(以下A社)自分でマイナビ経由で応募、もう一社(以下B社)はdodaエージェント経由でした。まずはエージェントに連絡をし、B社の内定者面談を行いたいことを相談しました。事前に聞いておけることを聞き出し、あとは何を聞いた方がいいかのアドバイスをいただきました。その後はA社に個人的に連絡し内定社面談のアポをとり、双方社員の方の話を伺う機会を作ることができました。

面接時の雰囲気が全然違う二社で、最初はA社がいいかなと思っていたのですが、内定社面談後にはB社の方を魅力的に感じ、B社の内定承諾に至りました。私は就活時は未経験だったこともあり、業界以外には特にこの仕事がやりたい!というものがなかったため、待遇面等、仕事とはちょっと違うところを重視で決めました。B社の役員には珍しいねと言われました。(待遇も大事じゃないですか?!)

実はリサトは、ねこむらさんがIT業界に絞ると言っていた段階から、複数内定を想定していました。よって、大まかなよい企業の選び方などを伝えて、あとは本人の感覚を大事にしようということで、ここでも大きな干渉はしませんでした。

思ってみれば、面接練習などはせず、大きな干渉は終始していないんですけどね。ただ僕は行くべき機関を提示したり、読むべき本を教えたり、やるべき課題を出しただけです。(このやり方はねこむらさんの希望もありそうしました)。

そんな感じでサポートしていたので、最後は自律して企業選びをしていたかなと思います。

 

最後は面談などを終えたあとしきりに早く働きたい、とまで言っていました。

 

この成功体験がねこむらさんの人生にとって大きな自信になることを願っています。っていうと意識高いですが、実際本当に頭を使い頑張っていたので、きっと今後思い出すよい経験になるでしょう。

最後に、ねこむらさん、入りたい企業に入れておめでとう。会社の人がびっくりするくらいの働きぶりをするエンジニアとして頑張ってください。ブログも応援してます。

 

 

---

エントリーしたところは38社。説明会参加は30社弱、内定は3社でした。

これ忘れてた。最後に生々しい数字をありがとうございます。

ジェネリクスとは

 研修の復習です

***

 

ジェネリクスとは

List<任意の型>arrayList = new ArrayList<任意の型>*1();

 Listなどのデータ型で見る、型を<>で囲っているものをジェネリクス(総称型)といいます。

Listに入れる型を指定することができます。

(ex.String型が入っているときは文字列 など)

 

メリット

コードのミスが見つけやすい

指定されている型以外のものを入れるとコンパイルエラーとなります。

Listには違う型の値を入れることも可能なため、ジェネリクスがないと同じリストに違う型を入れてしまう可能性があります。

List arrayList = new ArrayList();

arrayList.add("a");

arrayList.add(10);

この場合、arrayListの中身を出力する際にaを出せても10が出力不可能となります。

(ClassCastExceptionという例外にあたります。例外については簡単な内容ですが前記事をどうぞ)

このようなエラーはジェネリクスを用いることで回避することができます。

 

出力する際にキャスト*2する必要がない

List自体には型を決めることができません。

ジェネリクスを用いてString型を入れている場合は型が確定しているので、出力する際にいちいちキャストをせずに行うことができます。

 

 

*1:<>の中を書くのは左辺だけでも動くようです。(Java7以降)

しかし研修では触れていないため、この記事中では左右両方に書いています。

*2:キャストとは型を変換することを言います。

3種類のエラーと例外

研修の復習

 

***

 

 

エラー

プログラミングでは、3種類のエラーがあります。

上記3種類があります。

一つずつ見ていきましょう。

コンパイルエラー

その名の通りコンパイル時に発生するエラーです。

このエラーはプログラムを書き間違えている場合が殆どです。

 

開発環境のツールによっては、コンパイルする前におかしなところは教えてくれるものがあります。(私は今eclipceとAtomを使っていますがとてもわかりやすいです)

mergedoc.osdn.jp

atom.io

論理エラー

コンパイルにも実行時にも異常がないけど、処理結果が意図したものにならないことを言います。

計算結果がおかしい、等があたります。

解決にはコードの原因箇所を特定し、自身で修正する必要があります。

実行時エラー

「例外」とは実行時エラーのことを指します。

上記二つのエラーは開発者のミスによるものですが、実行時エラーは違います。

実行時エラーは開発者がソースコードを書く際に予防することができません。

そのため回避するには、エラーが発生時の対策を事前にコードに記述しておきます。

 

try catch構文

try{

例外が起きるかもしれない処理

} catch(例外クラス e){

例外クラスに対応する処理;

}finally{

例外の有無に関わらず行われる処理

}

「例外をキャッチする」ともいうそうです。

tryの中に、例外が起きる可能性のある処理を入れます。

正しい表示がされるまで繰り返したい

while(true)

try{

例外が起きるかもしれない処理

return;

} catch(例外クラス e){

例外クラスに対応する処理;

}

先ほどのtry catch構文にwhileを加えます。

これによって、trueの処理になるまでtryの中の処理を繰り返します。

もし、無制限でなく回数を指定したい場合はwhileの部分をfor( ... )に変えます。

 

独自の例外クラス

開発者が意図的に例外を発生させることができます。その際にはthrowが使われます。

「例外をスローする」と言ったりします。

throw new 任意のエラー名();

 メソッド内にthrowを用いてエラーを記述します。

try{

例外が起きるかもしれない処理

★throw new UserException("エラーです");

return;

} catch(UserException e){

System.out.println(e.getMessage);

}

★のところで投げたエラーをcatchしています。 

throwsリスト

throwsはthrowと違い、メソッドの定義に使われます。

例外処理を定義しておくことで、メソッドで処理をしないで良くなります。

修飾子 戻り値型 メソッド() throws 例外型{

}