talosのプログラミング教室

令和2年度10月の情報処理技術者試験は返金されないってマジ?

こんにちは。talosです。

いまTwitterではこのような噂が流れています。

『次回の情報処理技術者試験は中止になっても返金されない』

マジ?

いやいやいや、まさかそんなわけ、、、

とりあえず情報処理技術者試験のページを見てみることにしました。

そこにはこのような一文が、、、

『受理した受験手数料は、理由のいかんにかかわらず返還できません』
がーん

これはつらいですね、、、

でも待ってください。

この一文、結構前から書いてありました。

それを読んでいなかった一部の人が勝手に騒いでいるのでは?

と思い、よくよく読んでみるとこのようなことが書いてありました。

 (1)~(3)をご承知おきの上、受験申込みいただきますようお願いいたします。
 受理した受験手数料は、理由のいかんにかかわらず返還できませんので、ご注意ください。なお、(1) のように経済産業省及び当機構の判断で試験実施を中止した場合などには、代替措置等を講じる場合もあります。
 また、新型コロナウイルス感染症拡大防止の観点から、早期の受験を迫られていない方につきましては、なるべく今回の受験申込みを自粛していただきますよう、ご協力をお願いします。

(1) 試験の中止について
新型コロナウイルス感染症の感染状況によっては、受験申込みを受け付けた後でも、試験を中止する場合があります。


IPA 独立行政法人 情報処理推進機構:情報処理技術者試験:代替試験、秋期試験、一部免除延長について

Q.「受理した受験手数料は、理由のいかんにかかわらず返還できません」とのことですが、試験実施が中止になった場合はどうなるのでしょうか。
A.地震、台風などのやむを得ない事情や、新型コロナウイルス感染症の感染状況によっては、受験申込みを受け付けた後でも、経済産業省及びIPAの判断で試験実施を中止することがあります。その場合、代替措置等を講じる場合もあります。
この「代替措置等」は、状況により、別日程での試験実施(振替)または受験手数料の返還の措置を行います。


IPA 独立行政法人 情報処理推進機構:情報処理技術者試験・情報処理安全確保支援士試験

一見するとどっちつかずに聞こえますが、私はこういうことだと思います。

『中止の場合は返金するけど、あなたが新型コロナにかかって試験受けられなくても返金しないよ』

もちろん『代替措置等を講じる場合もあります。』とあるので返金されない可能性も無きにしも非ずですが、今までの対応を見るとその可能性は低いでしょう。

ということで、そこらへんは心配ないと思います。

あとは自分は絶対新型コロナにかからないという自信がある人だけ申し込みましょう。

JavaServer FacesでWebアプリ開発 ~基本編~

今回はJSFを使って簡単なWebアプリを作ります。

環境構築がまだの方はこちらの記事から読んでみてください。

talosta.hatenablog.com

テーブルの作成

まず、MySQLコマンドラインを開きます。

f:id:talosta:20200608213041p:plain

開いたら前回設定したパスワードを入力します。

f:id:talosta:20200608213231p:plain

プロンプトが表示されたら

create database sample;
use sample;
create table user (id integer primary key, name varchar(30) not null);
insert into user values (1, "Ito");
insert into user values (2, "Sato");
insert into user values (3, "Muto");
select * from user;

と打ち込んでください。

f:id:talosta:20200608214908p:plain

このような出力があるはずです。

今回はSQLの意味については触れません。

IDと名前のカラムを持つテーブルを作ったことだけは覚えておいてください。

プロジェクトの作成

Eclipseを開き、ファイル→新規→動的Webプロジェクトを選択してください。

今回のプロジェクト名は「JsfSample」とします。

次にターゲット・ランタイムをWildFly 11.0にします。

f:id:talosta:20200608215732p:plain

最後に構成の欄の変更ボタンを押し、JavaServer Facesにチェックを付けます。

f:id:talosta:20200608215915p:plain

OKと完了を押します。

JDBCドライバを入れる

C:\Program Files(x86)\MySQL\Connector J 8.0にあるmysql-connector-java-8.0.20.jarをWebContent/WEB-INF/libに入れます。

f:id:talosta:20200608221925p:plain
f:id:talosta:20200608221942p:plain

JavaBeansを作成

まず、Javaリソースのsrc上で右クリックし、新規→クラスと進みます。

f:id:talosta:20200609215257p:plain

パッケージ名を「javabeans」、クラス名を「User」とし、インターフェースに「java.io.Serializable」を持ちます。

f:id:talosta:20200609223137p:plain

package javabeans;

import java.io.Serializable;

public class User implements Serializable {

	private int id;
	private String name;

	public User() {
	}

	public User(int id, String name) {
		this.id = id;
		this.name = name;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

DAOを作成

DAOはData Access Objectの略です。

基本的にはデータベース操作を行うクラスを指します。

JavaBeansと同様にクラスを作成します。

パッケージ名を「dao」、クラス名を「UserDao」とします。

package dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import javabeans.User;


public class UserDao {

	private final String URL ="jdbc:mysql://localhost:3306/sample?serverTimezone=JST";
	private final String USER = "root";
	private final String PASSWORD = "root";

	// 全件取得
	public ArrayList<User> getAllUsers() {

		Connection con = null;
		PreparedStatement ps = null;
		ResultSet rs = null;

		ArrayList<User> users = new ArrayList<>();

		try {
			con = DriverManager.getConnection(URL, USER, PASSWORD);
			String sql = "select * from user";
			ps = con.prepareStatement(sql);
			rs = ps.executeQuery();

			while (rs.next()) {
				User user = new User();
				user.setId(rs.getInt("id"));
				user.setName(rs.getString("name"));
				users.add(user);
			}
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (ps != null) {
					ps.close();
				}
				if (con != null) {
					con.close();
				}
			}
			catch (SQLException se) {
				se.printStackTrace();
			}
		}

		return users;
	}
}

バッキングビーンを作成

バッキングビーンとはJSFで作られたページとやりとりをできるJavaプログラムです。

アノテーションを付けることでJSFページとやりとりができます。

アノテーションについては後ほど説明します。

また、バッキングビーンはJavaBeansと同じくカプセル化されています。

それでは作ってみましょう。

パッケージ名は「backingbeans」、クラス名は「UsersBean」とします。

package backingbeans;

import java.io.Serializable;
import java.util.ArrayList;

import javax.enterprise.context.RequestScoped;
import javax.inject.Named;

import dao.UserDao;
import javabeans.User;

@Named
@RequestScoped
public class UsersBean implements Serializable {

	private ArrayList<User> users;
	
	public UsersBean() {
		UserDao userDao = new UserDao();
		users = userDao.getAllUsers();
	}

	public ArrayList<User> getUsers() {
		return users;
	}

	public void setUsers(ArrayList<User> users) {
		this.users = users;
	}

}

@Namedと@RequestScopedがアノテーションと呼ばれるものです。

@Namedはクラスに任意の名前を付けるものですが、指定しなければクラス名の1文字目を小文字にした名前が付けられます。

UserBeanクラスの場合はuserBeanとなります。

これがないとJSFページからアクセスできないので必ず付ける必要があります。

また、バッキングビーンはnewすることができません。

その代わり、オブジェクトの生成と廃棄をJavaEEシステムが自動で行ってくれます。

そのタイミングを指定しているのが@RequestScopedです。

@RequestScopedはリクエストが発生した時にオブジェクトが自動生成され、レスポンスが完了すると破棄されます。

他にも@SessionScopedや@ApplicationScopedなどがあり、@SessionScopedはユーザーがログインしてからログアウトするまでの過程に相当し、@ApplicationScopedはアプリケーションが起動してから停止するまでの過程に相当します。

xhtmlファイルの作成

WebContentフォルダ上で右クリックし、新規→XHTMLページへと進みます。

f:id:talosta:20200608220405p:plain

ファイル名は「index.xhtml」とします。

f:id:talosta:20200608220432p:plain

次へを押し、Blank JSF Pageを選択して完了を押します。

f:id:talosta:20200608220447p:plain

できたらこのように書いてみましょう。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html">

<h:head>
	<title>ユーザー一覧</title>
</h:head>
<body>
	<h1>ユーザー一覧</h1>
	<h:dataTable value="#{usersBean.users}" var="user" border="1">
		<h:column>
			<f:facet name="header">ID</f:facet>
			#{user.id}
		</h:column>
		<h:column>
			<f:facet name="header">名前</f:facet>
			#{user.name}
		</h:column>
	</h:dataTable>
</body>
</html>

#{usersBean.users}はEL式と呼ばれます。

これはUserBeanクラスをのusersフィールドを表しています。

また、dataTableタグは拡張for文のように使い、表を作ることができます。

userという変数はusersリストの各行を表し、繰返し出力します。

実行する

index.xhtml上で右クリックし、実行→サーバーで実行を選択します。

ウィンドウが開いたら完了を押します。

すると以下のようなページが開くはずです。

f:id:talosta:20200613171946p:plain

なお、コードを変更したときは一度サーバーを停止してから実行してください。

f:id:talosta:20200613172203p:plain

おわりに

今回はJSFで簡単なWebアプリケーションを作りました。

次はもう少し難しいものを作ってみます。

JavaServer FacesでWebアプリ開発 ~環境構築編~

f:id:talosta:20200505143241p:plain


最近、JSF(JavaServer Faces)をやっているのですが、参考になるWebサイトが少ないので書いていこうと思います。

今回は環境構築をしていきます。

7-Zipをインストール

https://sevenzip.osdn.jp/

上記ページから自分の環境にあったものをダウンロードし、その後インストールしてください。

Eclipseをダウンロード

https://mergedoc.osdn.jp/

上記ページから「Java Full Edition」をダウンロードしてください。

Eclipseをダウンロード

ダウンロードしたら解凍するのですが、先程インストールした7-Zipを使ってください。

Zipファイルを展開

パスが長いと失敗するので展開先は「C:\」にするのが無難です。

展開先の指定

インストールが完了したらEclipseを開いてみましょう。

初めに以下のようなウィンドウがでできます。

workspaceの設定

デフォルトでは「../workspace」となっていますが、展開先が「C:\」の場合はこれだとまずいので、適当な場所に設定してください。

MySQLインストールの準備

https://support.microsoft.com/ja-jp/help/2977003/the-latest-supported-visual-c-downloads

上記ページからMicrosoft Visual C++ 2019 Redistributable Packageをダウンロードします。

Microsoft Visual C++ 2019 Redistributable Packageのダウンロード

ダウンロードしたら実行してインストールしてください。

MySQLのインストール

https://dev.mysql.com/downloads/windows/installer/8.0.html

上記ページからインストーラをダウンロードします。

MySQLインストーラのダウンロード

ダウンロードできたら実行しましょう。

最初にこのウィンドウが出るのでデフォルトのままNextを押します。

MySQLのインストール1

次にこのウィンドウが出るのでNextを押します。

MySQLのインストール2

ダイアログが出るのでYesを押します。

MySQLのインストール3

このウィンドウが出るのでExecuteを押します。

MySQLのインストール4

以降初期設定が始まりますが、基本的にはデフォルトで大丈夫なのでNextを押し続けます。

ここまできたらパスワードを設定します。

MySQLの初期設定1

パスワードを打ち込んだらまたNextを押し続けます。

MySQLの初期設定2

このウィンドウに到達したらExecuteを押しましょう。

終わったらFinishを押し、その後Nextを押し続けます。

このウィンドウが出たら、先程設定したパスワードを入力し、Check→Nextを押します。

MySQLの接続1

次のウィンドウでExecuteを押し、終わったらFinishを押します。

MySQLの接続2

その後のウィンドウではNextを押し、このウィンドウに到達したらFinishを押します。

MySQLのインストール完了

ユーザー環境変数のPathに以下をjdkのパスとMySQLのパスを追加します。

下記は例です。

C:\pleiades-2020-03-java-win-64bit-jre_20200322\pleiades\java\11\bin

C:\Program Files\MySQL\MySQL Server 8.0\bin

それぞれ、

java -version
mysql --version

でバージョンが表示されればOKです。

サーバの準備

Eclipseを開き、ヘルプ→Eclipseマーケットプレースへと進みます。

JBoss」で検索し、「JBossツール 4.15.0.Final」をインストールします。

JBossをインストール

警告が出たらインストールを選択します。

ソフトウェア更新が表示されたら、今すぐ再起動を押しましょう。

再起動したらウィンドウ→ビューの表示→その他と進み、サーバーを選択します。

サーバービューの表示

サーバービューが表示されたら、「使用可能なサーバーがありません。・・・」というところをクリックします。

サーバーの選択

ウィンドウが表示されたら「WildFly11」を選択します。

その後、次へを押し続け、以下のウィンドウが表示されたら「ダウンロードしてランタイムをインストール」を押します。

ランタイムをインストール1

WildFly 11.0.0 Finalを選択し、完了を押します。

ランタイムをインストール2

インストールが終わったら完了を押します。

おわりに

今回はJSFを使うための環境構築を行いました。

次回は実際にWebアプリケーションを作ってみようと思います。

とうとうWindows Terminalが登場!インストール方法と使い方を解説

f:id:talosta:20200330151413p:plain


先日「Window Terminal」が正式リリースされました。

Window Terminalはタブ機能を持っているので、コマンドプロンプトPowerShell、WSLなどのコマンドラインツールを複数開くことができます。

WSLなどを使って開発している人はぜひインストールしてみてください。

Windows Terminalをインストール

まず、Microsoft Storeを開きましょう。

開いたら検索窓で「Windows Terminal」と打ち込みます。

Preview版ではない方をインストールしましょう。

MicroSoft Storeを開く


GitHubからもインストールできますが、自動で更新されないためMicrosoft Storeからのインストールをおすすめします。

使い方

早速Window Terminalを開いてみましょう。

デフォルトではPowerShellになっています。

新しいタブを開く

+を押すと新しいタブを開けます。

新しいタブを開く

「Ctrl+Shift+t」でも開けます。


他のコマンドラインツールを開くには、+の右隣にあるvを押します。

他のコマンドラインツールを開く

WSLなどがインストールされている場合、ここから開けます。

新しいペインを開く

「Alt+Shift++」(AltとShiftと+を同時押し)で垂直方向に分割できます。

垂直方向に分割

また、「Alt+Shift+-」で水平方向に分割できます。

水平方向に分割

おわりに

今回はWindows Terminalのインストール方法と使い方を解説しました。

Windowsでの開発が捗りそうで楽しみです。

はじめてのC++ ~クラス編~

f:id:talosta:20200505143241p:plain


今回はC++クラスについて説明します。

このあたりから急に難しくなり、挫折する人も多いのでしっかり学びましょう。

オブジェクト指向についてまだ勉強していない人は、先にこちらを読んでみてください。

talosta.hatenablog.com

クラスの宣言

「myclass.h」というファイルを作り、以下のようなコードを書いてみてください。

class myclass {
    int age;

public:
    void set_age(int n);
    int get_age();
};

まず、

class myclass{ 
}

でクラス名を指定します。


次に

int age;

メンバ変数の宣言です。

アクセス指定子が書いていない場合はprivateです。

つまり、変数ageは他のクラスからは見えません。

アクセスの範囲を変えたい場合は

public:

のように書きます。

"public:"と書かれた場所以降のすべてのメンバは、他のクラスからアクセス可能になります。

void set_age(int n);
int get_age();

は関数のプロトタイプ宣言と呼ばれます。

戻り値 関数名(仮引数);

というように書きます。

ヘッダファイルの概要

C++ではクラスの定義やメンバ関数のプロトタイプ宣言、メンバ変数の宣言をヘッダファイルに書き、メンバ関数の定義はソースファイルに書くのが一般的です。

ヘッダファイルには「.h」拡張子を付けます。

また、対応するソースファイルと拡張子以前のファイル名を同じにします。

(ソースファイルがfile.cppならヘッダファイルはfile.hとする)

関数の定義

今のままでは関数の中身が定義されていません。

「myclass.cpp」ファイルに以下のコードを記述してください。

#include "myclass.h"

void myclass::set_age(int n) {
    age = n;
}

int myclass::get_age() {
    return age;
}

ヘッダファイルをインクルードするのを忘れないようにしましょう。

「::」はクラスの型名と関数名をリンクするためのスコープ解決演算子と呼ばれます。

main関数

main関数は一番最初に実行される関数です。

「main.cpp」というファイルに以下のコードを記述してください。

#include <iostream>
#include "myclass.h"

int main() {
    myclass yamada;

    yamada.set_age(20);

    int age = yamada.get_age();

    std::cout << age << "\n";
}

まず、

myclass yamada;

でmyclass型のyamadaオブジェクトを宣言します。


次に、メンバ関数を呼び出す際は、「オブジェクト名.関数名」で行います。

yamada.set_age(20);

int age = yamada.get_age();

上のコードはそれぞれメンバ関数を呼び出しています。


コンパイルは以下のように行います。

g++ main.cpp myclass.cpp -o main

実行すると「20」と表示されるはずです。

おわりに

今回はクラスについて説明しました。

次回はオーバーロードについて説明します。

はじめてのC++ ~制御文編~

f:id:talosta:20200330151413p:plain


今回はC++制御文の説明をします。

アルゴリズムを実装するために非常に重要なところなのでしっかり覚えましょう。

if文

条件分岐をする制御文です。

#include <iostream>

int main() {
    int a = 0;

    if (a == 0) {
        std::cout << "true\n";
    }

    return 0;
}
true

if文は( )の中がtrue(真)のときはその後の{ }の中を実行し、false(偽)のときは実行しません。

{ }がない場合は直後の1文だけが実行されます。

「a == 0」というのは「aが0に等しい」ということを表しています。

C++の場合、「a = 0」と書くとaに0を代入するという意味なので注意しましょう。

関係演算子の一覧を以下に示します。


関係演算子 意味
== 左項と右項が等しい
!= 左項と右項が等しくない
> 左項が右項より大きい
< 左項が右項より小さい
>= 左項が右項以上
<= 左項が右項以下

if-else文

ifの後にelseを追加することで、if( )の中が偽の場合の処理を指定できます。

#include <iostream>

int main() {
    int a = 1;

    if (a == 0) {
        std::cout << "true\n";
    }
    else {
        std::cout << "false\n";
    }

    return 0;
}
false

また、elseとifを組み合わせることで3つ以上に条件分岐させることもできます。

#include <iostream>

int main() {
    int a = 2;

    if (a == 0) {
        std::cout << "0\n";
    }
    else if (a == 1){
        std::cout << "1\n";
    }
    else {
        std::cout << "a is neither 0 nor 1.\n";
    }

    return 0;
}
a is neither 0 nor 1.

for文

for文は繰返しを行う制御文です。

#include <iostream>

int main() {
    for (int i = 0; i < 5; i++) {
        std::cout << i << "\n";
    }

    return 0;
}
0
1
2
3
4

( )の中にセミコロン区切りで3つの文を書きます。

1つ目は初期化です。

上の例ではiを0で初期化しています。

2つ目は繰返しを続ける条件です。

上の例ではiが5以上になるまで繰返しを続けるように指定しています。

5以上になったら繰返しは終わるので5は出力されていません。

3つ目は増減幅です。

上の例では繰返しが1回終わるごとに、iを+1しています。

while文

while文も繰返しを行う制御文です。

#include <iostream>

int main() {
    int i = 0;

    while(i < 5) {
        std::cout << i << "\n";
        i++;
    }

    return 0;
}
0
1
2
3
4

for文の例と同じことをしたプログラムです。

これだけ見るとfor文のほうがすっきりしていますが、while文のほうが適している状況もあります。

それは繰返しの条件が数値ではないときです。

例えば、キーボードで入力を受け付け、ある文字が入力されるまでは処理を続けるという場合。

// whileを用いた場合

#include <iostream>

int main() {
    std::string str;

    // endと入力されるまでループ
    while (str != "end") {
        // 標準入力
        std::cin >> str;
    }

    return 0;
}
// forを用いた場合

#include <iostream>

int main() {
    std::string str;

    // endと入力されるまでループ
    for ( ; ; ) {
        // 標準入力
        std::cin >> str;

        if (str == "end") {
            break;
        }
    }

    return 0;
}

whileを用いたほうがすっきりしていますよね。

このように上手く使い分けることで見やすいコードを書くことができます。

do-while文

whileでは条件によっては1回も{ }内の処理を行わず終了することがありますが、do-whileでは必ず1回は{ }内の処理を行います。

例えば、

#include <iostream>

int main() {
    int i = 10;

    while (i < 5) {
        std::cout << i << "\n";
        i++;
    }

    return 0;
}

上記のコードでは、iは最初から10でwhileの条件が i < 5 なので、{ }の中の処理は一度も行われずに終了します。

これをdo-whileにすると、

#include <iostream>

int main() {
    int i = 5;

    do {
        std::cout << i << "\n";
        i++;
    } while (i < 5);

    return 0;
}
5

と一度だけ{ }の中の処理が行われていることがわかります。

break文

break文はループを強制終了させることができます。

#include <iostream>

int main() {
    for (int i = 0; i < 10; i++) {
        std::cout << i << "\n";
        if (i == 5) {
            break;
        }
    }

    return 0;
}
0
1
2
3
4
5

iが5に等しいときに強制終了したため、それ以降は出力されません。

continue文

continue文はそれ以降の処理をスキップし、次の繰返しに移ります。

言葉ではわかりにくいと思うので、コードをしっかり読んで理解してください。

#include <iostream>

int main() {
    for (int i = 0; i < 10; i++) {
        if (i == 5) {
            continue;
        }
        std::cout << i << "\n";
    }
    
    return 0;
}
0
1
2
3
4
6
7
8
9

iが5に等しいときはcontinue以降の処理をスキップするため、5だけ表示されていません。

switch文

switch文はif文の複数バージョンです。

if文でもelseを使えば複数に条件分岐できますが、見栄えがよくありません。

3つ以上に分岐するときはswitch文を使うとよいでしょう。

switch文は以下のように使います。

#include <iostream>

int main() {
    int i = 3;

    switch(i) {
        case 1:
            std::cout << "one\n";
            break;
        case 2:
            std::cout << "two\n";
            break;
        case 3:
            std::cout << "three\n";
            break;
    }

    return 0;
}
three

breakがないとそれ以降の処理をすべて実行してしまいますので、忘れないようにしましょう。

おわりに

今回はC++制御文について説明しました。

次回はクラスについて説明します。

SE日記 ~新入社員研修を1か月終えて~

f:id:talosta:20200404182056p:plain


こんにちは。talosです。

新卒でSEになりました。

新型コロナウイルスの影響で、リモート研修をしています。

研修を1か月やってみて感じたことを綴っていきます。


意外と技術力が高い人が多い

SIerと言えば技術力よりもコミュニケーション力と言われ、技術力がある人はWeb系に行くイメージですが、技術力を持っている人も割といます。

特に研究で機械学習を使っていた人が多いです。


修士卒が多い

今まではそんなことはなかったみたいですが、今年の新卒は修士卒がほとんどでした。

修士卒の母数が増えているからでしょうか?


情報系は半分くらい

情報系はそこまで多くないみたいです。

しかし、情報系ではないけどプログラミングはしたことある人は結構います。

プログラミングをまったくしたことない人はほとんどいませんでした。


文系卒は少ない

説明会で行った企業は理:文が7:3くらいが多かったですが、うちは9:1くらいでした。


研修は技術研修が多い

うれしいことに、ほとんどが技術研修です。


でもコミュニケーションを重視している

とにかくグループワークが多いです。

プログラミングなども得意な人がやったことない人に教える場面が多いです。


リモート研修は意外とやりやすい

始まるまでは「リモートでグループワークはやめてくれ」と思っていましたが、意外と話しやすかったりします。

質問なども例年より多いらしいです。


リモートでもコミュニケーションはとれる

私は人とコミュニケーションを取るのが苦手です。

さらにリモートになってしまったら、もっと取れないのではないかと心配していました。

しかし、なんとかうまくやっています。

最初はリモート飲み会なんてやりたくないなぁと思っていましたが、参加してよかったと思います。


プログラミングはオブジェクト指向が絡むと急に難しくなる

プログラミングをしたことがあるという人でもオブジェクト指向に入った瞬間悩み始めました。

ここは予習しておくと良いでしょう。


集合研修はとにかくスピードが速い

学生時代に授業で習った立場からすると、非常にあっさりしています。

私の会社は集合研修が3か月と長めに設定されていますが、それでもなかなかのスピードです。

プログラミングをやったことない人はついていけなくても当然だと思います。

おわりに

よく人事の方は研修でしっかりやるからプログラミングの事前知識はいらないと言いますが、正直プログラミングをやったことない人は新人研修だけでできるようにならないと思います。

余裕があれば予習しておきましょう。

下の本は非常に易しく説明しているので、初心者におすすめです。

RPGゲームを題材としているのでとっつきやすさも◎です。