import/exportとmodule.exports/require

概要

Node.js、ES6、Typescriptを一気に調べていたせいで、いろいろなパターンのモジュール読み込み方法に出くわして、ちょっと混乱したので、整理しました。

Node.jsのモジュール読み込み

Node.jsのモジュール読み込みは以下のような形になります。

// node/myModule.js

class myModule {
    constructor() {
        console.log('Hello, I am a module');
    }

    hello() {
        console.log('hello!');
    }

    goodbye() {
        console.log('goodbye!');
    }
}

function test() {
    console.log("hoge");
};

//// test関数とmyModuleクラスをエクスポート
module.exports.test = test;
module.exports.myModule = myModule;
// node/main.js

//// モジュール読み込み
var mod = require('./myModule');

mod.test();
var m = new mod.myModule();
m.hello();

Node.jsは module.exportsでエクスポートを行い、 requireで読み込みを行います。

Node.jsの形式なので、そのままNode.jsで実行できます。

$ node node/main.js
hoge
Hello, I am a module
hello!

ES6(ECMAScript2015)のモジュール読み込み

ES6のモジュール読み込みは以下のような形になります。

// es6/myModule.js

export class myModule {
    constructor() {
        console.log('Hello, I am a module');
    }

    hello() {
        console.log('hello!');
    }

    goodbye() {
        console.log('goodbye"');
    }
}

export function test() {
    console.log('hoge');
}
// es6/main.js

import {myModule,test} from './myModule';

test();
var m = new myModule();
m.hello();

ES6では、exportをクラス定義や関数定義の前に付けてエクスポートを行い、importで読み込みを行います。

このままでは、Node.jsで実行することができません。

$ node es6/main.js
es6/main.js:1
(function (exports, require, module, __filename, __dirname) { import {myModule,test} from './myModule';
                                                              ^^^^^^

SyntaxError: Unexpected token import
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:139:10)
    at Module._compile (module.js:599:28)
    at Object.Module._extensions..js (module.js:646:10)
    at Module.load (module.js:554:32)
    at tryModuleLoad (module.js:497:12)
    at Function.Module._load (module.js:489:3)
    at Function.Module.runMain (module.js:676:10)
    at startup (bootstrap_node.js:187:16)
    at bootstrap_node.js:608:3

ES6からES5に変換してくれるBabelを使うと以下のようなソースコードになります。

$ babel es6/myModule.js
'use strict';

Object.defineProperty(exports, "__esModule", {
    value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

exports.test = test;

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var myModule = exports.myModule = function () {
    function myModule() {
        _classCallCheck(this, myModule);

        console.log('Hello, I am a module');
    }

    _createClass(myModule, [{
        key: 'hello',
        value: function hello() {
            console.log('hello!');
        }
    }, {
        key: 'goodbye',
        value: function goodbye() {
            console.log('goodbye"');
        }
    }]);

    return myModule;
}();

function test() {
    console.log('hoge');
}
$ babel es6/main.js
'use strict';

var _myModule = require('./myModule');

(0, _myModule.test)();
var m = new _myModule.myModule();
m.hello();

Node.jsのmodule.exports/require形式に変換されていますね。

Typescriptのモジュール読み込み

Typescriptでは3パターンの方法が用意されています。

ES6と同じexport/import

Typescriptでは、ES6と同じ形式でモジュールの読み込みをサポートしています。 ほぼ同じなのでソースは省略します。

export =import = require()

また、以下のような形式もサポートしています。

// ts/myModule.ts

class myModule {
    constructor() {
        console.log('Hello, I am a module');
    }

    hello() {
        console.log('hello!');
    }

    goodbye() {
        console.log('goodbye!');
    }
}

function test() {
    console.log('hoge');
}

export = {myModule, test};
// ts/main.ts

import mod = require("./myModule");

mod.test();
var m = new mod.myModule();
m.hello();

/// reference path

読み込むソース(例ではmain.ts)で、/// <reference path="{ファイルパス}" />を記述する方法です。 この方法を使っていると、読み込まれる側(例ではmyModule.ts)では、exportなどの記述は不要になります。

// ts/myModule.ts

class myModule {
    constructor() {
        console.log('Hello, I am a module');
    }

    hello() {
        console.log('hello!');
    }

    goodbye() {
        console.log('goodbye!');
    }
}

function test() {
    console.log('hoge');
}
// ts/main.ts

/// <reference path="./myModule.ts" />

//import mod = require("./myModule");

test();
var m = new myModule();
m.hello();

まとめ

Node.js、ES6、Typescriptでそれぞれモジュールの読み込みの方式が定義されていて、ややこしかったので、まとめてみました。特にES6の方式で記述しているソースをNode.jsで実行しようとしてエラーが出てしまって、よく分かってませんでした。

まだまだいろいろな書き方はあると思いますが、今回は基本的なことだけにとどめました。

RESTful API設計をする際に考慮する点

認証API

一覧取得API

以下のパラメータをリクエストパラメータとして指定できるようにしておく。

  • ページネーション系パラメータ
    • per_page (1ページごとの件数)
    • page (何ページ目のリストを取得するか)
  • フィルタ系パラメータ
    • enum系(status/typeなど)
    • フリーワード検索
  • ソート系パラメータ
    • order_by(どのカラムでソートするか)
    • desc/asc(降順/昇順)

一括更新

  • 一覧ページで一括更新
  • CSVで更新

ステータスコード(レスポンス)

以下のページで紹介されているダイアグラムを参考にすると良さそう。

www.agilegroup.co.jp

Ruby on Rails チュートリアルを完走した

memememomo.hatenablog.com

1日2時間くらいで17日間かかりました。長かった。
演習も全てやりましたが、読み飛ばした文章も割とあっても結構時間がかかりましたね。
内容のクオリティはすごく高くて、初心者が何周かすれば、一通りの基礎知識は身につけられるのではないでしょうか(経験者のサポートは必要かもしれませんが)。
他のフレームワークでもこのレベルのチュートリアルが欲しいですね。
以下、良いと思った点です。

  • gitでバージョン管理して進めていく
  • minitestでテストを書きながら、アプリを開発していく
  • Heroku上にデプロイするので、自分が作ったアプリが公開されている状態になっている
  • ユーザー認証/パスワードリマインダー/画像アップロード/ページネーションなど、実際の開発で必要になってくる機能を一通り実装する

あとは最近発売された以下の書籍もやれば、Rubyistとして必要な基礎知識がかなりつきそうですね。

qiita.com

Rubyは、学習するための手厚いサポートが用意されているのが、とても良いですね。

2017年の振り返り

概要

今更ながら2017年の振り返り、というか気づきや思ったことをまとめておきます。

ビジョンを持つ必要性

自分や周りの人たちのモチベーションの持ち方を見ていて、
熱意を持って幸せに働くためにはビジョンが必要だということに気がつきました。
ビジョンがないと「なんのためにこんなに一生懸命働いているんだろう。。。」といったことに陥りがち。

個人にもビジョンが必要ですし、会社にも(形骸化していない)ビジョンが必要です。
その上で、この二つの方向性が一致する必要もあります。

ここができていれば、各個人が自律的に熱意を持って仕事をすることができます。
できていないと、マネージメントで人の管理が必要になったり、締め切りを設定して圧力をかける必要が出たりします(締め切りは大事ですが)。

企画書を作る必要性

クオリティの高いプログラムやデザインを作れる優秀なクリエイターがいても、そもそもの企画の目的が曖昧だったり共有不足だったりすると、うまくいかないことを痛感しました。

当初は「企画書なんて不要で動いているプロトタイプがあれば大丈夫なんや」と思っていましたが、チームのメンバーが増えてくるごとにそれでは済まない状況になりました。そもそも動いているプロトタイプがバグっていて、それが正しいのかどうか分からない状態になっていたり...

企画の意図や目的などは、きちんと言語化されている状態になっている状態が望ましいです。
そもそも言語化できるところまで考え抜いていることができていなかったというのもありますね。

「言語化されてチームメンバーに共有できる状態を作る」「言語化できるまで企画の目的を考え抜く」ということをするための意味で、企画書は作るべきだと感じました。

人間力の必要性

いくら能力が高い人でも、たいていの仕事は一人で達成することは不可能です。 なのでチームとして働くわけですが、そこで必要になってくるのが人間力です。 チームメンバー全員がある程度持っている必要がありますが、リーダー的なポジションにいる人は顕著に必要になってきますね。人間力が高くないと、能力が高い人でもあまりうまくいっていないケースが見られるような気がしています。

人間力が高い人というのは「謙虚」「尊敬」「信頼」を持っている人と個人的に定義してます(「Team Geek」のHRT)。自分もこれまでにきちんとできていたかというと、まだまだ怪しいので精進していきます。。。

個人的な変化

自分の向き不向き、やりたいことやりたくないことがハッキリして良かったです。
これによって自分の今後の方向性がより明確になりました。

何事も試しにやってみることは大事だなと実感。
うまくいくかいかないかが大事ではなく、自分の特性をハッキリとさせていくことが大事。好きなことや注力したいことが分かってきます。

まとめ

なんだか反省が多くなってしまいましたが、2017年も楽しく過ごせました。
2018年以降もより良く楽しく過ごしていきたいです。

Ruby on Rails チュートリアル 第4版 メモ

railstutorial.jp

第1章

railstutorial.jp

チュートリアルでは、helloアプリ(1.3)、toyアプリ(第2章)、sampleアプリ(第3章から第14章まで)を作る。

Railsをインストールする

https://railstutorial.jp/chapters/beginning?version=5.1#sec-installing_rails

$ gem install rails -v 5.1.2

最初のアプリケーション

https://railstutorial.jp/chapters/beginning?version=5.1#sec-the_hello_application

$ cd
$ mkdir environment
$ cd environment
$ cd ~/environment
$ rails _5.1.2_ new hello_app

Bundler

https://railstutorial.jp/chapters/beginning?version=5.1#sec-bundler

Gemfileでgemのバージョンを指定できる。

bundle installを実行してgemをインストールする。

$ cd hello_app
$ bundle install

rails server

rails serverでRailsサーバを実行する。

$ cd ~/environment/hello_app/
$ rails server

演習 https://railstutorial.jp/chapters/beginning?version=5.1#sec-exercises_rails_server

Model-View-Controller (MVC)

https://railstutorial.jp/chapters/beginning?version=5.1#sec-mvc

MVCの解説。

Hello, world!

https://railstutorial.jp/chapters/beginning?version=5.1#sec-hello_world

演習 https://railstutorial.jp/chapters/beginning?version=5.1#sec-exercises_hello_world

Gitによるバージョン管理

https://railstutorial.jp/chapters/beginning?version=5.1#sec-version_control

Bitbucketにあげる。

デプロイする

Herokuにデプロイする。

Herokuコマンドのインストール。

$ brew install heroku/brew/heroku

演習 https://railstutorial.jp/chapters/beginning?version=5.1#sec-exercises_heroku_step_two

Herokuコマンド

https://railstutorial.jp/chapters/beginning?version=5.1#sec-exercises_heroku_commands

演習 https://railstutorial.jp/chapters/beginning?version=5.1#sec-exercises_heroku_commands

第2章

railstutorial.jp

Toyアプリの設定
https://railstutorial.jp/chapters/toy_app?version=5.1#sec-planning_the_application

UsersのScaffold生成
https://railstutorial.jp/chapters/toy_app?version=5.1#sec-demo_users_resource

MicropostsのScaffold生成
https://railstutorial.jp/chapters/toy_app?version=5.1#sec-a_micropost_microtour

バリデーションの追加
https://railstutorial.jp/chapters/toy_app?version=5.1#sec-putting_the_micro_in_microposts

リレーションの設定
https://railstutorial.jp/chapters/toy_app?version=5.1#sec-demo_user_has_many_microposts

第3章

railstutorial.jp

セットアップ
https://railstutorial.jp/chapters/static_pages?version=5.1#sec-sample_app_setup

Controllerの生成
https://railstutorial.jp/chapters/static_pages?version=5.1#sec-generated_static_pages

テスト
https://railstutorial.jp/chapters/static_pages?version=5.1#sec-red
https://railstutorial.jp/chapters/static_pages?version=5.1#sec-testing_titles

レイアウト
https://railstutorial.jp/chapters/static_pages?version=5.1#sec-layouts_and_embedded_ruby

minitest reporters
https://railstutorial.jp/chapters/static_pages?version=5.1#sec-minitest_reporters

Guardによるテストの自動化
https://railstutorial.jp/chapters/static_pages?version=5.1#sec-guard

第4章

railstutorial.jp

カスタムヘルパー
https://railstutorial.jp/chapters/rails_flavored_ruby?version=5.1#sec-custom_helpers

第5章

railstutorial.jp

ナビゲーション
https://railstutorial.jp/chapters/filling_in_the_layout?version=5.1#sec-adding_to_the_layout

Bootstrap
https://railstutorial.jp/chapters/filling_in_the_layout?version=5.1#sec-custom_css

パーシャル(partial)
https://railstutorial.jp/chapters/filling_in_the_layout?version=5.1#sec-partials

アセットパイプラインのディレクト
https://railstutorial.jp/chapters/filling_in_the_layout?version=5.1#uid584

Sassの構文
https://railstutorial.jp/chapters/filling_in_the_layout?version=5.1#sec-sass

リンクの記述
https://railstutorial.jp/chapters/filling_in_the_layout?version=5.1#sec-layout_links

ルートの設定
https://railstutorial.jp/chapters/filling_in_the_layout?version=5.1#sec-rails_routes

インテグレーションテスト(リンクのテスト)
https://railstutorial.jp/chapters/filling_in_the_layout?version=5.1#sec-layout_link_tests

テストでもApplicationヘルパーを使えるようにする
https://railstutorial.jp/chapters/filling_in_the_layout?version=5.1#sec-exercises_layout_link_tests

ユーザー登録
https://railstutorial.jp/chapters/filling_in_the_layout?version=5.1#sec-user_signup

第6章

railstutorial.jp

モデルを作成するコマンド
https://railstutorial.jp/chapters/modeling_users?version=5.1#code-generate_user_model

サンドボックスモードでUserを作成する
https://railstutorial.jp/chapters/modeling_users?version=5.1#sec-creating_user_objects

Modelのテスト
https://railstutorial.jp/chapters/modeling_users?version=5.1#code-valid_user_test

存在性を検証する
https://railstutorial.jp/chapters/modeling_users?version=5.1#sec-presence_validation

長さを検証する
https://railstutorial.jp/chapters/modeling_users?version=5.1#sec-length_validation

フォーマットを検証する
https://railstutorial.jp/chapters/modeling_users?version=5.1#sec-format_validation

一意性を検証する
https://railstutorial.jp/chapters/modeling_users?version=5.1#sec-uniqueness_validation

一意性のマイグレーション
https://railstutorial.jp/chapters/modeling_users?version=5.1#code-email_uniqueness_index

email属性を小文字に変換してメールアドレスの一意性を保証する
https://railstutorial.jp/chapters/modeling_users?version=5.1#code-email_downcase

セキュアなパスワードを追加する
https://railstutorial.jp/chapters/modeling_users?version=5.1#sec-a_hashed_password

ユーザーの作成と認証
https://railstutorial.jp/chapters/modeling_users?version=5.1#sec-creating_and_authenticating_a_user

第7章

railstutorial.jp

デバッグ用の表示を設定
https://railstutorial.jp/chapters/sign_up?version=5.1#sec-rails_environments

Usersリソースをroutesファイルに追加する
https://railstutorial.jp/chapters/sign_up?version=5.1#code-users_resource

byebugによるデバッガメソッド
https://railstutorial.jp/chapters/sign_up?version=5.1#sec-debugger

Gravatarの導入
https://railstutorial.jp/chapters/sign_up?version=5.1#sec-a_gravatar_image

form_forを使用する
https://railstutorial.jp/chapters/sign_up?version=5.1#sec-using_form_for

ユーザー登録
https://railstutorial.jp/chapters/sign_up?version=5.1#sec-unsuccessful_signups

Strong Parameters
https://railstutorial.jp/chapters/sign_up?version=5.1#sec-strong_parameters

エラーメッセージ表示
https://railstutorial.jp/chapters/sign_up?version=5.1#sec-signup_error_messages

失敗時のテスト
https://railstutorial.jp/chapters/sign_up?version=5.1#sec-a_test_for_invalid_submission

ユーザー登録成功
https://railstutorial.jp/chapters/sign_up?version=5.1#sec-successful_signups

flash
https://railstutorial.jp/chapters/sign_up?version=5.1#sec-the_flash

データベースのリセット
https://railstutorial.jp/chapters/sign_up?version=5.1#sec-the_first_signup

成功時のテスト
https://railstutorial.jp/chapters/sign_up?version=5.1#sec-a_test_for_valid_submission

本番環境でのSSL
https://railstutorial.jp/chapters/sign_up?version=5.1#sec-ssl_in_production

本番環境用のWebサーバー
https://railstutorial.jp/chapters/sign_up?version=5.1#sec-production_webserver

第8章

railstutorial.jp

Sessionsコントローラを作成
https://railstutorial.jp/chapters/basic_login?version=5.1#sec-sessions_controller

ログインフォーム作成
https://railstutorial.jp/chapters/basic_login?version=5.1#code-login_form

ユーザーの検索と検証
https://railstutorial.jp/chapters/basic_login?version=5.1#sec-finding_and_authenticating_a_user

ログイン
https://railstutorial.jp/chapters/basic_login?version=5.1#sec-logging_in

レイアウトの変更をテストする、has_secure_password準拠のdigestメソッドを定義する
https://railstutorial.jp/chapters/basic_login?version=5.1#sec-testing_layout_changes

第9章

railstutorial.jp

記憶トークンと暗号化
https://railstutorial.jp/chapters/advanced_login?version=5.1#sec-remember_token

  • 記憶トークン(remember token)を生成
  • cookiesメソッドによる永続cookiesの作成
  • 記憶ダイジェスト(remember digest)によるトークン認証

ログイン状態の保持
https://railstutorial.jp/chapters/advanced_login?version=5.1#sec-login_with_remembering

個別のcookiesは1つの「value(値)」と、オプションの「expires(有効期限)」からできている。

ログアウト
https://railstutorial.jp/chapters/advanced_login?version=5.1#sec-forgetting_users

インテグレーションテストのヘルパー
https://railstutorial.jp/chapters/advanced_login?version=5.1#sec-testing_the_remember_me_box

永続ログインをテストする
https://railstutorial.jp/chapters/advanced_login?version=5.1#sec-testing_the_remember_branch

Herokuでメンテナンスモード
https://railstutorial.jp/chapters/advanced_login?version=5.1#sec-advanced_login_conclusion

第10章

railstutorial.jp

編集フォーム
https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#sec-edit_form

新規と編集のフォームの共通化
https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#sec-exercises_edit_form

編集の失敗
Ruby on Rails チュートリアル:実例を使って Rails を学ぼう

TDD
https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#sec-successful_edits

_form.html.erbで、signupのurlの設定が外れるので、テストが失敗していた。演習でやった部分なので、チュートリアルでは言及されていないっぽい。

ログインを要求する
https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#sec-requiring_logged_in_users

正しいユーザーを要求する
https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#sec-requiring_the_right_user

フレンドリーフォワーディング
https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#sec-friendly_forwarding

未ログイン状態で、ログインが必要なページにアクセスしたら、ログインページにリダイレクトする。その際にURLを保存しておき、ログイン後にリダイレクトするようにする。

fakerを使ってサンプルユーザーを作成
Ruby on Rails チュートリアル:実例を使って Rails を学ぼう

ページネーション
https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#sec-pagination

ユーザー一覧のテスト
https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#sec-users_index_test

管理ユーザー
https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#sec-administrative_users

ユーザー削除テスト
https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#sec-user_destroy_tests

第11章

railstutorial.jp

AccountActivationsリソース
https://railstutorial.jp/chapters/account_activation?version=5.1#sec-account_activations_resource

送信メールテンプレート
https://railstutorial.jp/chapters/account_activation?version=5.1#sec-account_activation_emails

Railsのメールプレビュー機能
https://railstutorial.jp/chapters/account_activation?version=5.1#sec-email_previews

メール送信テスト
https://railstutorial.jp/chapters/account_activation?version=5.1#sec-email_tests

メタプログラミングでメソッド名で変数を使って呼び出す
https://railstutorial.jp/chapters/account_activation?version=5.1#sec-generalizing_the_authenticated_method

有効化のテスト
https://railstutorial.jp/chapters/account_activation?version=5.1#sec-activation_test_and_refactoring

Herokuでメール送信
https://railstutorial.jp/chapters/account_activation?version=5.1#sec-activation_email_in_production

PostgreSQLでdatetime型が使えないようなので、Herokuでのmigrateでエラーが起こる。ひとまずtimestampに変更したら、エラーを回避できた。

第12章

railstutorial.jp

パスワード再設定テスト
https://railstutorial.jp/chapters/password_reset?version=5.1#sec-password_reset_test

期間切れのテスト
https://railstutorial.jp/chapters/password_reset?version=5.1#code-password_reset_expire_test

第13章

railstutorial.jp

has_manyのmodelを生成
https://railstutorial.jp/chapters/user_microposts?version=5.1#code-generate_micropost_model

belongs_to/has_manyを設定すると使える機能
https://railstutorial.jp/chapters/user_microposts?version=5.1#table-association_methods

マイクロポストを時間順に取得できるようにする
https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-ordering_and_dependency

ユーザーを削除したときにマイクロソフトも削除されるようにする
https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-dependent_destroy

マイクロポストを表示する
https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-showing_microposts

マイクロポストのサンプル
https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-sample_microposts

マイクロポストのテスト
https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-profile_micropost_tests

マイクロポストを作成する
https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-creating_microposts

フィードを作成
https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-a_proto_feed

redirect_back(fallback_location: root_url)
https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-exercises_destroying_microposts

フィード画面のマイクロソフトをテスト
https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-micropost_tests

画像投稿
https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-micropost_images

画像の検証
https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-image_validation

画像のリサイズ
https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-image_resizing

テスト時のみリサイズ機能をオフにする設定
https://railstutorial.jp/chapters/user_microposts?version=5.1#code-skip_resize_initializer

S3に画像をアップロード(本番環境)
https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-image_upload_in_production

本番デプロイ時に LoadError: cannot load such file -- fog というエラーが出た。Gemfileに

gem 'fog'

を追加したら直った。

第14章

railstutorial.jp

Ajax
https://railstutorial.jp/chapters/following_users?version=5.1#sec-a_working_follow_button_with_ajax

ステータスフィード
https://railstutorial.jp/chapters/following_users?version=5.1#sec-the_status_feed

各種プログラミング言語に対する個人的雑感2017

C#

Unityで使えるし、サーバサイドも書けるし、XamarinでiOSAndroidのアプリが作れるし、Windowsアプリが作れるし、コスパが良い。
変な文法がない。
柔軟なこともできる。

Javascript

Chrome拡張かけたり、サーバサイド書けたり、Googleスプレッドシートのマクロかけたり、Electronでアプリが作れたりするから、結構コスパが良い。
生のJavascriptを書きたくない感。
でもAltJSを使い始めるとそれはそれでだいぶ面倒臭い。
ツールチェーン周りのトレンドが変化しすぎてて、ちょっと目を離すとベストプラクティスがなんなのか分からなくなる。

Scala

なんかかっこいい。 関数型しすぎているライブラリをみるとげんなりする。
ちょっと読みづらい。
情報が少ない。
敷居が高い。
ほぼPlayFramework一択なのが良さげ。

Ruby

Ruby on Rails一択なのが良い。
柔軟に書けるのが良い。
気持ちよく書ける。
便利なライブラリがたくさんある。
コミュニティ楽しそう。

Python

インデントで見やすくなるのが良い。
__name__ == '__main__':好き。
ちょっとしたバッチスクリプト書くのに使うと便利。

Go言語

シンプルで良さげ。
シンプルすぎて面倒なところがある。テストとかジェネリクスとか。
継承とか純粋にはできないので、頭の切り替えが難しい。
並列処理を書く時にgoroutineは便利かも。

C/C++

もっと書けるようになると便利だろうけど、ゴリゴリ書くことは今後もなさそう。
Cocos2dを使う可能性はあるので、C++は触りそう?
STLにあるライブラリは勉強したい。

Rust

Genericsあるみたいだし、Go言語より便利そう?
あんま流行っていない気がする。

Haskell

使えるとカッコよさそうだけど、今後ゴリゴリ書くことはなさそう。

PHP

Laravelとかよさそう。
なんだかんだで良い言語。
今後も仕事で書いたりしても良いかも。
Hackはどうなったんだろう。

Java

好きでも嫌いでもない。
今後書くことはあるのかなぁ。
ScalaとKotlinがあるので、自主的に勉強することは今後はなさそう。
UnityのPluginで書くことがあるかもしれない。

Kotlin

守備範囲が広がってきたら、使い始めるかも。
JetBrains社の製品はIntelliJとRider使っているから期待。
シンプルにかけて良さそう。

Swift

iOSアプリしか作れないからコスパ悪そう。
言語自体は楽しそう。
サーバサイドの環境はまだまだそう(あまり話を聞かないから)。
ググるとSwiftとObjective-Cの情報が入り混じるので不便。

Lua

ゲームの作成の効率化で、使うことになりそう。
シンプルで良さげ。

Perl

もう書かなくなったけど、とてもお世話になった言語なので、リスペクトを忘れない。

仕事で必要な技術力を高めるための活動

概要

仕事で必要になってくる技術力は、本を読んだりするだけでは高まらないものです。
どのようなことをすれば 実践的な技術力を高めていけるのかを考えてみました。

仕事で必要な技術力とは

仕事で必要な技術力とは以下のようなものです。

  1. 作るべきモノ(ゴール)から逆算する力
  2. プログラムを読んで理解する力

作るものから逆算する力

仕事では「こういうシステムを作ってください」「こういう機能を追加してください」といった形で依頼されます。
行き当たりばったりでプログラムをすぐに書いてしまうと、うまくいかないことが多いです。
プログラムを書く前に、依頼された「システム」や「機能」から、どのようなプログラムを書く必要があるかを整理する必要があります。
つまり、作るもの(ゴール)から逆算するということです。

システム単位で考えるなら、要件定義や機能一覧を作るところから始まります。
機能単位で考えるなら、クラス設計やDB設計をするところから始まります。

つまり、作るものを決めて、実装する練習をすれば良いわけです。
具体的には、以下のような活動をすると良いでしょう。

  1. 自分が作りたいものを作る
  2. 既存のサービスやソフトウェアのクローンを作る

1.がある場合は問題ないですね。

2.は作るべきものがはっきりしているので取り組みやすいですね。
自分が作りたいものが特にない場合はこの方法をとると良いでしょう。
既存のものを触ってみて、どのような動きをするのかを確認して、同じ動きになるように実装しましょう。

プログラムを読んで理解する力

仕事では、すでにあるシステムの改修をすることが多いです。
改修をするためには、すでにあるプログラムがどのような仕組みになっているか理解する必要があります。
この時に必要になってくるのが「コードを読んで理解する力」です。

すでにあるプログラムをきちんと理解しないと思わぬバグを入れ込んでしまう可能性があります。
また読むためにはちょっとしたコツや慣れが必要だったりします。

この力を高めるために必要なのが以下のような活動です。

普段自分が使っているライブラリやソフトウェアがオープンソースであるなら、そのプログラムを読んでみることです。
コツとしては普段自分が使っている機能やメソッドなどから調べることです。
すでに動作が分かっている状態なので、理解できる可能性が高まります。
ちょっとしたバグを発見できたら、プルリクを送ってみると良いでしょう。

その他に必要な能力

仕事では技術力の他に以下のような能力も必要になりますが、今回は触れていません。