esm アジャイル事業部 開発者ブログ

永和システムマネジメント アジャイル事業部の開発者ブログです。

開発環境と金の弾丸

昨今の IT エンジニア募集企業では『開発 PC を選べる』というのが一つの潮流にある気がしています。永和システムマネジメント (以下 ESM) でも自分のパフォーマンスが最も出せる PC を選ぶといった制度が古くからあり、今回はそれにまつわるストーリーを書いてみます。

  • Apple の法人購入するときには、キーボードの選択に気をつけよう
  • 法人契約で間違えて購入したとき
  • 16コア、64GBは正義。コアとメモリは積めるだけ積め

以上のショートショート3本立てです。

Apple の法人購入で気をつけること

ESM では定期的に買い替えのタイミングを設けており、これはそんな MacBook Pro を買い換えるときのとある日の出来事です。

ESM で MacBook Pro を購入する際には Apple で法人契約購入するのですが、先日弊社メンバーで立て続けに起きた、ちょっとした注意点を共有しておきます。

舞台は以下のツイートです。

数日後、同僚にもまさかの同じことが起きました。

言い訳じみた原因としては、法人での購入画面への注意力散漫といったものだったと思われます。

MacBook Pro の構成をカスタマイズするときに、デフォルトで『日本語 (JIS) 』キーボードが選択されていたので、US 配列が良い場合は『英語 (米国) 』を選択し直す必要があります。

(注: 以下は US 配列キーボード「選択後」の画面です)

f:id:koic:20210402095901p:plain

CPU やメモリのカスタマイズと異なり、購入金額が変わるわけではないので、会社の予算に気を取られて見落とさないよう気をつけると良いです。

Apple の法人購入で間違えて購入した場合

一定期間の間であれば、交換してもらえます。私も諦めかけていたところ、バックオフィスのメンバーから交換の流れを教えてもらって US キーボードへの転身をとげました。 とりわけ Apple 社に迷惑を掛けてしまったあたり反省しかないのですが、おかげで満足なキーボードで生活できています。

あきらめる前に、お勤めの会社で交換可能か確認をとってみましょう。

16コア、64GBは正義。コアとメモリは積めるだけ積め

「買い替えてどうなったの?」というところで、OSS での開発を例に挙げると、RuboCop のフルビルドにかかる所要時間がおおよそ半分程度になりました。

RuboCop では test-queue を使ったテストの並列化をしているため、コア/ハイパースレッディングとメモリが増えればそれだけビルドの待ち時間が減るという公式です。

github.com

アクティビティモニタでみるとこんな感じで、すべてのコアが働いていることが確認できます。

f:id:koic:20210402095836p:plain

PC スペックとフルビルドの Before / After を並べてみます。

⏳ Before (1:54.53)

  • プロセッサ: 2.7 GHz クアッドコアIntel Core i7
  • メモリ: 16 GB 2133 MHz LPDDR3
% time bundle exec rake
Files:         567
Modules:        88 (   13 undocumented)
Classes:       529 (    2 undocumented)
Constants:     882 (  869 undocumented)
Attributes:     31 (    0 undocumented)
Methods:       990 (  867 undocumented)
 30.52% documented
Starting test-queue master (/tmp/test_queue_1738_17060.sock)

==> Summary (8 workers in 42.8440s)

    [ 1]                         1960 examples, 0 failures, 4 pending        80 suites in 24.9043s      (pid 1774 exit 0 )
    [ 2]                         2626 examples, 0 failures, 6 pending        87 suites in 24.9056s      (pid 1775 exit 0 )
    [ 3]                                     117 examples, 0 failures         1 suites in 42.8359s      (pid 1776 exit 0 )
    [ 4]                                    2309 examples, 0 failures        81 suites in 42.8358s      (pid 1777 exit 0 )
    [ 5]                                    2996 examples, 0 failures        87 suites in 42.8372s      (pid 1778 exit 0 )
    [ 6]                         1436 examples, 0 failures, 1 pending        78 suites in 42.8379s      (pid 1779 exit 0 )
    [ 7]                                     637 examples, 0 failures        53 suites in 42.8379s      (pid 1780 exit 0 )
    [ 8]                                    3490 examples, 0 failures        85 suites in 42.8312s      (pid 1781 exit 0 )

Starting test-queue master (/tmp/test_queue_1738_18680.sock)

==> Summary (8 workers in 41.1013s)

    [ 1]                                     117 examples, 0 failures         1 suites in 41.0932s      (pid 1860 exit 0 )
    [ 2]                                    1518 examples, 0 failures        78 suites in 41.0933s      (pid 1861 exit 0 )
    [ 3]                                    2480 examples, 0 failures        86 suites in 41.0947s      (pid 1862 exit 0 )
    [ 4]                                    2259 examples, 0 failures        86 suites in 41.0952s      (pid 1863 exit 0 )
    [ 5]                         2786 examples, 0 failures, 5 pending        87 suites in 41.0958s      (pid 1864 exit 0 )
    [ 6]                                    2066 examples, 0 failures        79 suites in 41.0960s      (pid 1865 exit 0 )
    [ 7]                                     591 examples, 0 failures        46 suites in 41.0957s      (pid 1866 exit 0 )
    [ 8]                         3754 examples, 0 failures, 6 pending        89 suites in 41.0892s      (pid 1867 exit 0 )

Running RuboCop...
Inspecting 1261 files
.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

1261 files inspected, no offenses detected
bundle exec rake  515.00s user 34.02s system 479% cpu 1:54.53 total

⏳ After (1:11.55)

  • プロセッサ: 2.4 GHz 8コアIntel Core i9
  • メモリ: 64 GB 2667 MHz DDR4
% time bundle exec rake
Files:         567
Modules:        88 (   13 undocumented)
Classes:       529 (    2 undocumented)
Constants:     882 (  869 undocumented)
Attributes:     31 (    0 undocumented)
Methods:       990 (  867 undocumented)
 30.52% documented
Starting test-queue master (/tmp/test_queue_27867_17060.sock)

==> Summary (16 workers in 26.9534s)

    [ 1]                                     111 examples, 0 failures         1 suites in 12.8340s      (pid 27900 exit 0 )
    [ 2]                                    1527 examples, 0 failures        43 suites in 12.8344s      (pid 27901 exit 0 )
    [ 3]                                     117 examples, 0 failures         1 suites in 26.9430s      (pid 27902 exit 0 )
    [ 4]                         1029 examples, 0 failures, 4 pending        47 suites in 26.9427s      (pid 27903 exit 0 )
    [ 5]                                    1529 examples, 0 failures        51 suites in 26.9428s      (pid 27904 exit 0 )
    [ 6]                                    1699 examples, 0 failures        48 suites in 26.9439s      (pid 27905 exit 0 )
    [ 7]                                     959 examples, 0 failures        46 suites in 26.9438s      (pid 27906 exit 0 )
    [ 8]                                      68 examples, 0 failures         1 suites in 26.9437s      (pid 27907 exit 0 )
    [ 9]                                    1470 examples, 0 failures        50 suites in 26.9435s      (pid 27908 exit 0 )
    [10]                                     269 examples, 0 failures        21 suites in 26.9434s      (pid 27909 exit 0 )
    [11]                                      34 examples, 0 failures         1 suites in 26.9432s      (pid 27910 exit 0 )
    [12]                                     920 examples, 0 failures        45 suites in 26.9430s      (pid 27911 exit 0 )
    [13]                                    1473 examples, 0 failures        49 suites in 26.9428s      (pid 27912 exit 0 )
    [14]                         1171 examples, 0 failures, 1 pending        50 suites in 26.9431s      (pid 27913 exit 0 )
    [15]                         1630 examples, 0 failures, 1 pending        49 suites in 26.9428s      (pid 27914 exit 0 )
    [16]                         1565 examples, 0 failures, 5 pending        49 suites in 26.9414s      (pid 27915 exit 0 )

Starting test-queue master (/tmp/test_queue_27867_18680.sock)


==> Summary (16 workers in 28.2100s)

    [ 1]                                     111 examples, 0 failures         1 suites in 13.5583s      (pid 27954 exit 0 )
    [ 2]                                    1590 examples, 0 failures        48 suites in 13.5583s      (pid 27955 exit 0 )
    [ 3]                                    1316 examples, 0 failures        46 suites in 13.5583s      (pid 27956 exit 0 )
    [ 4]                         1231 examples, 0 failures, 5 pending        50 suites in 13.5582s      (pid 27957 exit 0 )
    [ 5]                                      68 examples, 0 failures         1 suites in 13.5581s      (pid 27958 exit 0 )
    [ 6]                                     256 examples, 0 failures        21 suites in 13.5578s      (pid 27959 exit 0 )
    [ 7]                                     895 examples, 0 failures        47 suites in 13.5578s      (pid 27960 exit 0 )
    [ 8]                                     931 examples, 0 failures        44 suites in 13.5579s      (pid 27961 exit 0 )
    [ 9]                                    1565 examples, 0 failures        48 suites in 13.5578s      (pid 27962 exit 0 )
    [10]                         1595 examples, 0 failures, 4 pending        45 suites in 13.5578s      (pid 27963 exit 0 )
    [11]                                     117 examples, 0 failures         1 suites in 28.2005s      (pid 27964 exit 0 )
    [12]                                      34 examples, 0 failures         1 suites in 28.2004s      (pid 27965 exit 0 )
    [13]                         1153 examples, 0 failures, 1 pending        49 suites in 28.2002s      (pid 27966 exit 0 )
    [14]                                    1596 examples, 0 failures        50 suites in 28.2003s      (pid 27967 exit 0 )
    [15]                                    1613 examples, 0 failures        50 suites in 28.2000s      (pid 27968 exit 0 )
    [16]                         1500 examples, 0 failures, 1 pending        50 suites in 28.2001s      (pid 27969 exit 0 )

Running RuboCop...
Inspecting 1261 files
.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

1261 files inspected, no offenses detected
bundle exec rake  447.86s user 30.88s system 669% cpu 1:11.55 total

16 コア、64GB の開発環境は正義。金の弾丸が効いたことがわかります。

余談ですが、会社としては (業務がまわれば) Linux や WSL という選択肢もある中、私が MacBook を選んでいる理由は、Rails アプリケーション開発が仕事のベースにあるため、Rails の作者である DHH が選択している MacBook を使うことにしています。

これは『開発 PC を選べる』の根底にある「自分のパフォーマンスが最も出せる PC を選ぶ」への観点として、開発環境の構築にハマらないように、もしハマった時は The Rails Doctrine にある「数は安全性を生む」による解決が働きやすいことへの期待があるためです。

qiita.com

以上、金の弾丸によって開発効率を上げた一例の紹介でした。

もっとコアがあれば開発効率の向上に活かせるのに予算が足りないよ、、、ということであれば組織の予算をハックすることを検討できるかもしれません。PC の必要経費は年々上がっているので、時代背景とあっているか上長と掛け合ってみましょう。人件費に比べれば PC は安いもので、何より開発者にとって快適な開発環境はすこぶる良いものです (健闘を祈る!) 。

最後にいつものです。

agile.esm.co.jp