Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

生粋のRubyistがJavaを好きになった理由

2,986 views

Published on

2016/4/28に行われた「Java開発最前線 - UZABASE Meetup#2」の発表資料です。
http://uzabase-meetup.connpass.com/event/29952/

Published in: Software
  • Be the first to comment

生粋のRubyistがJavaを好きになった理由

  1. 1. 生粋のRubyistが Javaを好きになった理由 2016/4/28 株式会社ユーザベース SPEEDA Techチーム 北内 啓 1 Java開発最前線 - UZABASE Meetup#2
  2. 2. ● 株式会社ユーザベース SPEEDAエンジニア ○ 2014年11月入社 ● アルゴリズム関連の開発を主に担当 ○ SPEEDAの各種データの検索 ○ 企業の業界推定 ○ 企業どうしのマッチング(名寄せ) など 自己紹介 2
  3. 3. 経験したプログラミング言語とエディタ プログラミング言語 エディタ、開発環境 1982 BASIC BASIC 1986 Z80アセンブリ言語 ZEDA (Z80開発環境) 1990 C MicroEmacs 1990 dBASE VZ Editor 1993 Perl Nemacs, Mule 1999 C++ Mule 2005 Ruby Emacs 2009 JavaScript Emacs 2014 Java Eclipse 少しだけ: Python, PHP, R, Emacs Lisp, Bourne Shell, AWK 3
  4. 4. Rubyの好きなところ 4 1. 短く書ける ● 動的型付き言語なので型の記述が不要 ● 便利なメソッドがたくさん用意されている user_names = [ { name: "Akira", age: 24 }, { name: "Bob", age: 30 }, { name: "Chris", age: 28 }, ] IO.foreach("hoge.txt") do |line| ... end last_users = users.last(2)
  5. 5. 2. 美しく書ける ● メソッドチェインなど Rubyの好きなところ 5 users.select {|age| age < 30 }.sort_by(&:age).map(&:name) File.open("hoge.txt", "w") do |f| records.each do |columns| f.puts columns * "t" end end
  6. 6. 3. 柔軟性が高い ● モンキーパッチ Rubyの好きなところ 6 class Array def average self.inject(&:+).to_f / self.size end end > [3, 1, 5].average => 3
  7. 7. ● 「Java言語で学ぶデザインパターン入門」を読んでJavaの ソースコードを見た ● 「Effective Java」をざっと読んだ ● SI企業で事業部がJavaで開発するのを横目で見ていた ユーザベース入社前のJavaの知識 7
  8. 8. 1. 色んな意味で固い ● 主に大規模SIで使われている ● 習得がわりと簡単(Cライクでポインタがない) ● 誰でもわりと高品質なコードを書ける ユーザベース入社前のJavaの印象 8
  9. 9. 2. コードが長い、冗長 ユーザベース入社前のJavaの印象 言語 標準出力への書き込み main関数/メソッド Ruby puts "Hello" 無し。または if $0 == __FILE__ ... end C puts("Hellon"); void main(int argc, char **argv) { ... } Java System.out.println ("Hellon"); public static void main (String args[]) { ... } 9 [その他] getter, setter, 大量のimport...
  10. 10. 3. いろいろ面倒 ● 1クラス1ファイル。しかもクラスの数が多い ● ディレクトリがすごいことになっている src/main/java/com/uzabase/speeda/web/industry/Industr yPanel.java ● Strutsは様々な設定をXMLで書くので面倒らしい ユーザベース入社前のJavaの印象 10
  11. 11. 2014年11月 ユーザベース入社 JDK, Eclipse, Maven, Tomcatなどをインストール、設定 ユーザベースに入社して… 11
  12. 12. 1週間後… ユーザベースに入社して… 12
  13. 13. Javaけっこういいじゃん! ユーザベースに入社して… 13
  14. 14. 1. いくつか誤解していた 2. 周辺ツールでカバーできる問題点が多い 3. Rubyにはないよさがある 分かったこと 14
  15. 15. ● 主に大規模SIで使われている? ベンチャーやOSSなどでも多数使われている ● 習得がわりと簡単(Cライクでポインタがない)? 基本的な文法は簡単だが、スレッド処理、機能が豊富なライブラリや ウェブフレームワークなど覚えるものも多い ● 誰でもわりと高品質なコードを書ける? クラス設計に問題があると読みにくい、バグが発生しやすい、拡張しにく いコードになる。 DRY、命名、メソッドの単位などプログラミング言語共通の問題がたくさ んある いくつか誤解していた 15
  16. 16. ● コードが長い Eclipseテンプレート機能を使うと簡単に入力できる sysout → [Ctrl+Space] → System.out.println(); ● クラスやファイルの数が多い、ディレクトリ階層が深い Eclipseでクラス名を指定して簡単にファイルを開ける、メニューから簡 単にクラスを作成できる ● getter, setterを書くのが面倒 Lombokを使えば楽 (@Getter, @Setter, @Value, @Dataなど) ● 大量のimport Eclipseが自動的に挿入してくれる 周辺ツールでカバーできる問題点が多い 16
  17. 17. ● コンパイラ言語で静的型付きなのでバグに気づきやすい ○ しかも入力時にEclipseが指摘してくれる ● 安定している ○ Javaやライブラリにバグが少ない ○ 下位互換性が高い(Javaのバージョン更新時にライブラリが使えな くなることがほとんどない) ● ライブラリ、周辺ツールが豊富 ● EclipseなどのIDEの入力機能、リファクタリング機能が強力 Rubyにはないよさがある 17
  18. 18. ● クラス名、メソッド名、変数名などの補完、リネーム ● メソッドの抽出、シグネチャの変更(引数の順番など) ● ローカル変数への割り当て、抽出、インライン化 Eclipseの入力機能、リファクタリング機能 18 Arrays.asList("Taro", "Akira");        ↓⌘2 L List<String> asList = Arrays.asList( "Taro", "Akira");        ↓⌘1 [Extract to local variable] String string = "Taro"; List<String> asList = Arrays.asList( string, "Akira");
  19. 19. 気になることも多い… とはいえ 19
  20. 20. 1. やっぱりコードが長くなる 例: nullかもしれないリストをmapするコード <Ruby> <Java> やっぱり気になること 20 List<String> encodedIds = Optional .ofNullable(ids) .orElse(Collections.emptyList()) .stream() .map(id -> IdEncoder.encode(id)) .collect(toList()); (ids || []).map {|id| IdEncoder.encode(id) }
  21. 21. 3. 文字列処理が面倒(ex. 正規表現) やっぱり気になること 21 Ruby Java マッチするか? s =~ /<.*?>/ s.matches(".*<.*?>.*"); 最初にマッチした 箇所の取得 s[/<.*?>/] Pattern p = Pattern.compile("<.*? >"); Matcher m = p.matcher(s); if (m.find()) { String tag = m.group(); } マッチする箇所を 全部取得 s.scan(/<.*? >/) 上記のコードで while(m.find()) を使う
  22. 22. 3. クラス名が衝突すると面倒 やっぱり気になること 22 /** 検索APIの開発 */ // Elasticsearch で検索 org.elasticsearch.action.search.SearchResponse esRes = execute(req); org.elasticsearch.search.SearchHits esHits = esRes.getHits(); ... // 検索結果を返す SearchHits hits = convertSearchHits(esHits); SearchResponse res = new SearchResponse(esHits, ...);
  23. 23. ● Javaを知って以前よりも好きになった ○ ユーザベース入社前はJavaのことをあまり知らなかった ○ 今はJavaを書いていてわりと楽しい ● ただし、不満もある ○ 今後のさらなるJavaの進化に期待 ○ Scala, Kotlinなど他のJVM言語にも期待 まとめ 23

×