なになれ

IT系のことを記録していきます

社内コミュニティのすゝめ

レガシーな環境でも社内コミュニティを作るとなかなか良いよって話です。

f:id:hi1280:20161230151047p:plain

自分の環境について

そこそこ大規模なSIerのSEです。
SIerというとブラックなイメージがつきまとうはず。
ITエンジニアなのにほとんど触っているのはExcelであったり、GitHubといったITエンジニアならば既に常識になりつつあるようなクラウドサービスが利用できないなど、ネットでネタにされるような労働環境がリアルにあったりする場所だったりします。

そんな労働環境に置かれながらも、もがいていたりします。
そんな一つのもがきとして、社内コミュニティの活動を行なっています。

社内コミュニティとは

社内コミュニティとはなんでしょう?

まずIT界隈でコミュニティと呼ばれるものを定義すると以下の定義になります。

「同じ興味・関心・利害を共にし、情報の共有・問題の解決などを行う共同体」

会社内でこのようなコミュニティを作るのが社内コミュニティです。
同じ興味・関心・利害を共にするというところがいわゆる官僚主義的な会社組織と異なる部分になり、社内コミュニティの面白いところです。

当方の行動指針の一つになっているFearless Changeでは勉強会をするのが新しいアイデアを広める際の仲間を集める良いパターンとして紹介されています。
興味や関心を共にすることができるということから、社内で行う勉強会というのが一つの社内コミュニティではないかと思います。

仕事に役立つような勉強を業務活動として行う場合にはどうなるでしょう?
おそらく義務感が発生してしまい、興味や関心、利害を共にすることはできずにポジティブな雰囲気にはならないはずです。
自分の興味がないことを勉強したとしてもすぐに忘れてしまうでしょう。

社内コミュニティの中で勉強するとどうでしょう?
コミュニティの参加者は学びたいという意思が明確です。
興味や関心がないと自らの時間を費やしてまで勉強会に参加しようなどと思わないはずです。
この場所に集まった人たちは同じ会社にいながら、官僚主義的な利害関係がない仲間となる人たちでしょう。

得られたもの

こういった仲間が得られるとどうなるでしょうか?
勉強会内では積極的な意見交換が行われます。これにより、興味深い気づきが得られます。

例えば、私のコミュニティでは、アジャイル開発の勉強を行なっています。
ある回では、プランニングポーカーをテーマに扱いました。
プランニングポーカーにはカードの種類がいくつかあり、カードによっては説明しないと意味が分からないようなカードも存在します。
カードの意味が分からないというのは想定外の状況でしたが、参加者の中の有識者がフォローしてくれました。お互いに手助けする雰囲気があるというのがコミュニティの良い点であると感じました。

参加者の意見を聞くと楽しかったといったポジティブな意見を聞くことが多く、これもコミュニティとして行うことのメリットであると感じています。
仕事の中では楽しかったという意見を聞いたことがありませんでした。
この楽しい感情から生まれるポジティブな意見というのは貴重です。

会社という組織にいながら互いを認め合う雰囲気を感じることができます。
社内コミュニティを作ることで、良い仲間を得ることができたと思います。

モチベーション、コミュニケーションといった点で、ここは居心地が良い場所だなと実感しています。

今後に向けて

コミュニティを介することで、したいからするという前提のもとで活動が行われます。
モチベーションを高く保てるため理想的な環境です。
コミュニティのように利害関係なしに楽しみながら活動することがビジネスでも必要になります。
Googleが良い例です。

特にSIerのような利害関係にまみれている場所にとって、このような文化を取り入れることは良い変化につながると思っています。
今後はこのような社内コミュニティのエネルギーを会社にアピールしていければと思っています。

組織として常に学習する文化が根付くことが理想だと感じる、今日この頃です。
来年はそんな理想に近づけるように活動していきます。

参考

Fearless Change アジャイルに効く アイデアを組織に広めるための48のパターン

Fearless Change アジャイルに効く アイデアを組織に広めるための48のパターン

https://blog.sixapart.jp/2015-10/what-is-community.html

Java SE 8のパフォーマンスを簡単に測定してみた

Java SE 8が最近リリースされました。
Java SE 8でJVMに対してパフォーマンスチューニングがされたということを聞き、簡単にパフォーマンスを測定してみました。

・測定方法
100万個のBeanをListに格納する時間を計測

・実行環境
JRE
 Java SE 6U45
 Java SE 7u51
 Java SE 8
IDE
 NetBeans IDE 8.0

・結果
Java SE 6U45 :平均113ms
Java SE 7U51 :平均174ms
Java SE 8 :平均346ms

SE 7から倍くらい遅いという結果になりました。なぜに!?
IDEでやるのがまずいのかと思って、コンソールでも試してみましたが変わらずでした。

測定プログラムは以下のとおり。

package sample;
import java.util.ArrayList;

public class Benchmark1 {

     public static void main(String[] args) {
          for(int j=0;j<10;j++){
              long currentTimeMillis = System.currentTimeMillis();
              ArrayList<User> list = new ArrayList<User>();
              Benchmark1 benchmark1 = new Benchmark1();
              for(int i = 0; i < 1000000; i++){
                  list.add(benchmark1.new User("テスト", "テスト県テスト市", "123456"));
              }
              System.out.println(list.size());
              System.out.println(System.currentTimeMillis() - currentTimeMillis);
          }
     }

     public class User{
          private String name;
          private String address;
          private String id;

          public User(String name, String address, String id) {
               super();
               this.name = name;
               this.address = address;
               this.id = id;
          }
          public String getName() {
               return name;
          }
          public void setName(String name) {
               this.name = name;
          }
          public String getAddress() {
               return address;
          }
          public void setAddress(String address) {
               this.address = address;
          }
          public String getId() {
               return id;
          }
          public void setId(String id) {
               this.id = id;
          }
     }

}


Java SE 8ということで、StreamAPIを使う方法でもやりました。結果は変わりませんでした。
mainメソッドを以下のように書き換え。

for(int j=0;j<10;j++){
      long currentTimeMillis = System.currentTimeMillis();
      Benchmark2 benchmark2 = new Benchmark2();
            Stream<User> generate = Stream.generate(() ->; benchmark2.new User("テスト","テスト県テスト市","123456"));
            List<User> list = generate.limit(1000000).collect(Collectors.toList());
            System.out.println(list.size());
      System.out.println(System.currentTimeMillis() - currentTimeMillis);
}

ただ、一概に今回の結果を捉えてはいけないかなと思います。
Java SE 8からJVMのメモリの利用効率を改善したということで、もっと複雑にJVMが動作するプログラムに対してパフォーマンス計測を行った場合にはどうなるかを計測しないといけないと思います。
例えば、Webアプリケーションとか。

時間があれば、別の形でパフォーマンス計測したいと思います。
Javaのバージョンを上げれば、パフォーマンスが上がりますと言えれば、Java8が業務で使える日も近づくかもしれませんので。

Spring MVC Validationを適用する

Spring MVCでValidationを適用する手順を記します。
 
pom.xml
Hibernate Validatiorを使用するためにライブラリをインポートします。
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.0.3.Final</version>
</dependency>
 
Controllerクラス
画面からの値を受け取るエンティティクラスに@Validアノテーションを適用します。
BindingResultクラスの変数にValidationを行った結果が入ります。
bindingResult.hasErrors()で入力チェックエラーが存在するかを判断しています。エラーが存在する場合、上記メソッドの結果がtrueになります。
@RequestMapping(value="/user/create", method=RequestMethod.POST)
public String create(@Valid @ModelAttribute("userModel") UserModel userModel,BindingResult bindingResult , Model model) {

    if(bindingResult.hasErrors()){

        model.addAttribute("userModel", userModel);
        model.addAttribute("status", NEW);
        return "user";
    }
    userService.createUser(userModel);
    model.addAttribute("userModel",userModel);
    model.addAttribute("status", EDIT);
    return "user";
}

 

画面の入力値を扱うエンティティクラスにValidation用のアノテーションを指定します。
下記では@NotEmpty(必須入力用アノテーション)を使用しています。

public class UserModel {
    @NotEmpty
    private String username;
    private String mailaddress;

    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getMailaddress() {
        return mailaddress;
    }
    public void setMailaddress(String mailaddress) {
        this.mailaddress = mailaddress;
    }
}

 

ValidationMessages.properties
エラーメッセージの内容を日本語にするために編集します。
Hibernate Validatiorのjarファイル内にValidationMessages.propertiesが存在します。
デフォルトではこの内容が表示されます。

@NotEmptyは以下のように定義されています。

org.hibernate.validator.constraints.NotEmpty.message = may not be empty
 
デフォルトを上書きする形で、ValidationMessages.propertiesを新たに定義し、プロジェクトのクラスパス内に配置します。
org.hibernate.validator.constraints.NotEmpty.message = 必須入力です。
 
form:errorsタグでエラーメッセージを表示します。
<form:input path="username"/><form:errors path="username"/>