So-net無料ブログ作成
  • ブログをはじめる
  • ログイン
前の10件 | -

通勤電車の書斎化(2) [朝型]

4年前に「通勤電車の書斎化」を書いています。今年の6月から株式会社メルペイでソフトウェアエンジニアとして働き始めてからは、通勤時間が往復で約4時間となっており、今までの人生の中で最も長い通勤時間となっています。

朝は、5時40分ごろに自宅を出て、最寄り駅から始発に乗車しています。始発に乗車して、2駅で1回目の乗り換えをします。乗り換えて各駅停車に乗車することで確実に座れるのですが、その代わり、次の乗り換えまで1時間ほど電車に乗車しています。2回目の乗り換えは青山一丁目で、そこから大江戸線で1駅で六本木駅です。会社に7時30分前後に到着します。以前は、出社前にスターバックスに寄ることがあったのですが、今はそのまま出社します。

過去、何度か腰を痛めたことがあるのが原因かどうか分かりませんが、ちょうどメルペイで働き始める前ぐらいから腰部脊柱管狭窄症になり、座っているのは問題ないのですが、ずっと立っていたり、長く歩くのが困難な状況になっています。そのため、帰りも座って帰るために、六本木駅から逆方向に帰って、清澄白河駅で乗り換えています。その分、帰宅時間は長くなりますが、六本木駅からもほとんど座れて、自宅の最寄り駅まで座れます。帰りは、16時過ぎに退社するのですが、自宅に帰宅するのが18時30分頃になります。

結果として、通勤時間が往復4時間になっています。そのうち、電車の中でMacBookを広げて作業をするのが約2時間です。平日は、自宅の書斎で作業をすることはほとんどありませんが、通勤電車の中で2時間ほど作業することになります。先日までは、『Effective Java 第3版』の翻訳作業をしていました。


スポンサーリンク





コメント(0) 

bytes.Bufferの実装の変更 [golang]

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

  • 作者: Alan A.A. Donovan
  • 出版社/メーカー: 丸善出版
  • 発売日: 2016/06/20
  • メディア: 単行本(ソフトカバー)

『プログラミング言語Go』の「6.6 カプセル化」でbytes.Bufferに関して次のような記述があります(193ページ)。
例として、bytes.Buffer型を考えてみてください。 この型は非常に短い文字列を蓄積するために頻繁に使われます。したがって、そのようによくある場面でのメモリ割り当てを避けるために、そのオブジェクト内に少し余分な領域を確保するのは有益な最適化です。 Bufferは構造体型なので、その領域は大文字で始まっていない名前を持つ[64]byte型の追加のフィールドの形式になります。このフィールドが追加されたとき、それは公開されなかったので、Bufferを使うbytesパッケージの外部のクライアントは、改善された性能を除いたどの変更にも気づきませんでした。
実際に、Go 1.11まではこの記述にあるような実装なのですが、次のGo 1.12ではこの[64]byte型の追加のフィールドは削除されるようです。修正のコミットは、こちらです。


スポンサーリンク





コメント(0) 

『Effective Java 第3版』の翻訳作業が終わりました [本]

昨年の2月から原著『Effective Java Third Edition』の草稿のレビューが始まり、レビューが終わったのが11月で、昨年末には原著が発売されています。翻訳作業は、昨年の12月から始めて、すべての作業が今月初めに終了しました。今回も、翻訳および(索引作りも含めた)組版までLaTeXで行いました。

原著のレビューのときには気付かなかった多くの間違いは、翻訳作業を通してJoshua Bloch氏へ知らせており、原著の4th printing(第4刷)では修正されています(原著の正誤表は、こちらです)。

今回はもっと早く終わるかと思ったのですが、結局、約430時間を翻訳作業に費やしました。翻訳に先立っての原著のレビューは約42時間でした。

Amazon.co.jpでは、以下のように紹介されています。
Javaプログラマーにとって必読の定番書『Effective Java』の改訂第3版。

この第3版では、Java 8で新たに導入されたラムダとストリームに関する章が新規に追加されたほか、 オプショナル、インタフェースでのデフォルトメソッド、try-with-resources文、@SafeVarargsアノテーション、モジュールなどの機能を扱った項目を含み、第2版の78項目から90項目に増加しています。

今日ではJavaは大きく複雑になり、並列実行から、繰り返し、各種データの表現まで、多くの事柄に対して多様な抽象化を持ち合わせています。この大きさと複雑さを考えると、最新のベストプラクティスの指導書はなおさら重要です。

本書は多くのデザインパターンとイデオムを示すコード例を含んでおり、プログラミング言語Javaの正しい理解と、簡潔で明瞭で正確なソフトウェアの設計に役立つでしょう。
発売予定は10月31日です。予約注文は、Amazon.co.jpのこちらのページからできます。


スポンサーリンク





コメント(0) 

「ソフトウェアエンジニアの心得」教育 [「ソフトウェアエンジニアの心得」講演]

かなり前(たぶん2000年の頃?)から行っている「ソフトウェアエンジニアの心得」の教育を日本総合システム社の新卒新人向けに行いました。リコーに勤務していた2009年から2017年までは、毎年ソフトウェア開発系の新卒新人向けに行っていた研修です。

IMG_0379.JPG
日本総合システム社近くの「小石川後楽園」


コメント(0) 

API仕様を書く(2) [API仕様を書く]

2003年からリコーに転職する2009年まで従事したデジタル複合機のコントローラソフトウェア開発プロジェクト(ピーク時は約100名のソフトウェアエンジニアが従事)では、私が提唱したある方式に基づいて完全なテスト駆動開発を行っていました。そのソフトウェア開発もレイヤ構成のソフトウェアであり、多くはプロセスとして実装され、プロセス間通信をCORBAで行っていました。

今日で言えば、マイクロサービス化してサービス間で通信してシステムを実現しているようなものです。各プロセスは下位層のハードウェアからのイベントと上位層のUIからユーザ指示のイベントの両方を処理する必要があるため、個々のプロセス内ではマルチスレッドプログラミングが行われているというものでした。品質を担保するために、当時としては複写機業界ではトップクラスのテスト駆動開発を行っていました(「マルチスレッドプログラミングにおける重要な4要件」)。

各サービス(プロセス)が提供するAPI仕様は、プロジェクト全体でかなりきちんと書かれていました。このプロジェクトでは、私も中核となる最も複雑な処理を行うサービスを担当して、API仕様を書いて、実装して、テストを書いて、そしてマルチスレッドのデッドロックやrace conditionをひたすらデバッグしていました(さらに付け加えると、開発部門の部長もしていました)。

このプロジェクトでは、API仕様を書く書かないの選択肢は個々のサービス担当者に委ねられることはなく、プロジェクト全体で書くことが強制されてたような気がします(あるいは、ある程度私が強制させていたのかもしれませんが、もうあまり覚えていません)。

振り返ってみると、1984年から2009年までその多くを富士ゼロックスグループで過ごし
、自分自身も多くのAPI仕様を書いてきたので、自分が担当するモジュール、ライブラリ、サービスのAPI仕様を、「利用者の視点を意識して」書いてから実装を行うことが、ソフトウェアエンジニアとして当たり前だと思っていました。そして、一緒に仕事をした多くのソフトウェアエンジニアが同じだったと思います。

2009年8月に富士ゼロックス情報システムを退職して、リコーに転職したのですが、そこは同じ複写機業界でありながら、ソフトウェア開発に関しては全く違う世界がありました。

(続く予定)

コメント(0) 

API仕様を書く(1) [API仕様を書く]

株式会社メルペイに入社して、3か月が過ぎました。1984年に社会人となってからさまざまなソフトウェア開発に従事してきましたが、今日でいうところの「Backend Engineer」というのは前職のソラミツ社で少しかじった程度でした。現在は、あるマイクロサービスの開発を担当しており、この3か月間の半分以上は、そのマイクロサービスのAPI仕様を書くことに費やしていました。マイクロサービスの通信は、gRPCで行いますので、API仕様はその.protoファイルにコメントの形式で書いています。

実装をほとんどせずにAPI仕様を書くということをいつ頃からやった経験があるのかと振り返って見ると、1993年から開発に従事したFuji Xerox DocuStation IM 200です。レイヤ構成のアーキテクチャで、最下位層はハードウェアを抽象化したAPIを提供するMCA(Machine Control Architecture)と呼ぶものでした。その層では、IIT(Image Input Terminal:スキャナー)、IOT(Image Output Terminal:プリンター)、Fax、操作パネルといったデバイスに対してハードウェアに依存しない抽象的なAPIを提供するのがMCAの目標でした。その中で、全体の共通仕様とIITとIOTの制御ソフトウェアのAPI仕様を英語で書きました(Xerox社へ提供予定のAPIだったので)。当初、私はAPI仕様だけを書いていたのですが、実装担当者によるAPI仕様の実装が徐々に難しくなっていったため、代わりに私が実装することになって二か月で全部を再実装しました。

その後、MCAの上でコピーサービスとFaxサービスを、私を含めて4人のエンジニアで4週間でプロトタイプして動作させることができたので、そのプロトタイプを捨てて、すべてをきちんと設計することになりました。私は、MCAの上でMAE(Multifunction Application Environment)と呼ぶ層を担当することになり、そのAPI仕様のドラフトを書き上げました。それから実装を始めたのですが、API仕様があるのでテストコードは他の若いエンジニアに書いてもらいながら、彼女と二人でMAEの開発を進めました。

ここまでの経験は、最初にAPI仕様を書いてから、それを実装していくというものです。実装しながら不都合があれば、API仕様はもちろん修正されていきます。

API仕様を書いて、自分では一行も実装を書かない経験をしたのは、現在の富士ゼロックス社のデジタル複合機のコントローラソフトウェアで使われているC++用のライブラリ(こちら)です。2000年のことです。そのライブラリのAPI仕様(日本語)は、本来の動作仕様に加えてかなり防御的に書きました。つまり、不正なパラメータ値を渡した場合の挙動をデバッグ版とリリース版に関して細かく書きました(参考:「API設計の基礎」)。このライブラリの実装は全く行いませんでしたが、実装のコードは全部レビューしました。そして、そのライブラリに関する「Programmer's Guide」(A4で約100ページ)も後に書いています。
※ Webster, NYに住んでいた2002年の暮れにXerox社との共同プロジェクトが中止になって、とても暇になってしまったので書きました。

(続く予定)

コメント(0) 

言語仕様とメモリモデル [プログラマー現役続行]

『Effective Java 第3版』の第11章「並行性」(あるいは、第2版の第10章「並行性」)を内容を理解するためには、Javaのメモリモデル(memory model)を理解する必要があります。『Effective Java 第3版』の翻訳原稿による補講でも「メモリモデルとは何か」という質問がありました。

マルチコアやマルチプロセッサを前提としてマルチスレッドプログラミングを言語仕様として提供する言語では、メモリモデルは言語仕様の一部とも言えます。Javaであれば、『The Java Language Specification』の17.4節の「Memory Model」、あるいは、『プログラミング言語Java第4版』の14.10節 「メモリモデル:同期とvolatile」に書かれています。それぞれ、22ページと5ページを費やして解説しています。

今日、マルチコアやマルチプロセッサを前提とした言語は、Javaだけではありません。たとえば、Go言語ではゴルーチン(goroutine)に関してのメモリモデルが、言語仕様であるThe Go Programming Language Specificationとは独立したThe Go Memory Modelとして定義されています。私自身は、C++でのプログラミングから離れてから久しいのですが、C++でもマルチスレッドプログラミングのサポートに伴いメモリモデルが定義されています。
※ 残念ながら『プログラミング言語Go』には「メモリモデル」の解説が含まれていません。

以前の記事「マルチスレッドプログラミングにおける重要な4要件」で述べた一番目の要件「きちんとしたレビュー」では、「マルチコアやマルチスレッドプログラミングのきちんとした経験および知識を持つ人が設計やコードをレビューしていること」と述べてします。ここでの「知識」には当然「メモリモデル」も含まれます。

JaSST Tokyo 2018の招待講演では、デジタル複合機のコントローラソフトウェア開発を4回行った経験に基づいて話をしたのですが、振り返ってみると、そのような開発に従事したからこそ、マルチスレッドプログラミングでの開発を経験できたと言えます。それらの開発は、C++もしくはGoによる開発でしたが、マルチスレッドプログラミングに関わる様々な問題(もしくは、ゴルーチンにとチャネルによる様々な問題)に直面し、デバッグを経験することで多くの知識と経験を得ることができました。

株式会社メルペイでbackend engineerとして働き始めて3か月が経過しましたが、(私のバックエンドの開発経験がまだ少ないからかもしれませんが)ウェブシステムでのバックエンド開発では、上記の一番目の要件を満足できるような開発経験を積むのは困難なのかなと感じ始めています。Go言語で開発していますが、メモリモデルを理解しないといけないようなプログラミングはほとんどしないので・・・私がいまから経験する必要はないのですが、今の若い人達はいつ経験して知識を得るのだろうかと。

コメント(0) 

『Effective Java 第3版』による第25期Java研修の補講が終了 [プログラミング言語Java教育]

ちょうど一年前に株式会社リコーを退職したことにより、第25期のJava研修は、Java 8でのラムダとストリームの基本を学んで、『Effective Java』を学ぶことなく終了しました。

そもそもJava研修の最終目標は、『Effective Java』を通してよりよいAPI設計について学ぶことでした。初心者本ではない『Effective Java』を読みこなすための基礎知識として『プログラミング言語Java第4版』や『Java SE 8実践プログラミング』を学んでもらっていました。しかし、リコーを退職したため『Effective Java』を学ぶことなく第25期は終了となっていました。

リコー退職後は週4日(週休3日)で働いていたので、今年の4月から『Effective Java 第3版』の翻訳原稿を使った補講を行うことにして、学んでもらいました。研修はひと月に1日(金曜日)だけで、6か月で終了です。残念がらすべての項目の学習は終わらず、第11章「並行性」の最後の項目84「スレッドスケジューラに依存しない」までで終了となりました。
ej3e.png
修了生と私


コメント(0) 

リコー時代の研修コース名 [プログラミング言語Java教育]

2000年からJava言語研修を始め、2016年からGo言語研修を始めています。株式会社リコーに勤務した8年間での研修では、コース名に意図的に「基本技術習得」と付けていました。
  • 「プログラミング言語Java基本技術習得」コース
  • 「プログラミング言語Go基本技術習得」コース
この研修コース名から、「初心者向け」コースと勘違いして受ける人が最初の頃はいました。しかし、初心者コースではありません。

「基本技術習得」と命名した意図は、次の通りでした。
業務でその言語を使ってソフトウェアを開発しているのであれば、コースの内容を最低限の基礎知識として学習して、ソフトウェアを開発してもらいたい
その最低限のレベルというのが、Java言語であれば、以下の4冊を読んで、練習問題のプログラミングも行い、さらにいくつかのGUI課題をこなすというものでした。

プログラミング言語 Java 第4版

プログラミング言語 Java 第4版

  • 作者: ケン アーノルド
  • 出版社/メーカー: 東京電機大学出版局
  • 発売日: 2014/05/10
  • メディア: 単行本

Java 2 Standard Edition 5.0 Tiger―拡張された言語仕様について

Java 2 Standard Edition 5.0 Tiger―拡張された言語仕様について

  • 作者: 柴田 芳樹
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2005/04
  • メディア: 単行本

Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング

Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング

  • 出版社/メーカー: インプレス
  • 発売日: 2014/09/22
  • メディア: Kindle版

EFFECTIVE JAVA 第2版 (The Java Series)

EFFECTIVE JAVA 第2版 (The Java Series)

  • 作者: Joshua Bloch
  • 出版社/メーカー: 丸善出版
  • 発売日: 2014/03/11
  • メディア: 単行本(ソフトカバー)

Java研修の最後の25期は、『Effective Java 第2版』を学習しなかったので、現在『Effective Java 第3版』(未発売)で補講を行っています。補講以外のJava研修は現在行っていませんが、今では一年半を要するコースとなっています。

Go言語研修については、テキストは『プログラミング言語Go』で、半年のコースです。

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

  • 作者: Alan A.A. Donovan
  • 出版社/メーカー: 丸善出版
  • 発売日: 2016/06/20
  • メディア: 単行本(ソフトカバー)

研修を通してそれぞれの言語に関する技術を学びますが、研修だからできる体験として、次の事柄が挙げられます。
  • きちんとした技術書を全部学習するという経験。一人で学習するのとは異なり、一緒に受講している仲間がいるため、最後まで読み通せる。
  • 練習問題のプログラミングを全部行うという経験。一人で技術書を読んでいると、練習問題があっても、頭の中でちょっと考える程度であり、実際にプログラミングして解く経験をする人は少ないと思います。これも、上記と同じ理由で、一緒に受講している仲間がいるために、全部解いたりします。
練習問題があるのは、『プログラミング言語Java第4版』、『Java SE 8実践プログラミング』、『プログラミング言語Go』なのですが、それぞれの本で100問以上の練習問題があり、全部解くと400問以上になります。両方のコースを修了したソフトウェアエンジニアもいます。
※ 最近は提出がすべてGithubなので、Github上には(私自身の解答例も含めて)受講生の解答例が多く存在しています。

これらのコースで学習する内容は、それぞれの言語で開発する上での「基礎知識」であり、その基礎に基づいて、実際のソフトウェア開発で応用を経験してくわけです。その意味で「基本技術習得」コースと命名していました。

コメント(0) 

第5回Java・Go研修OB・OG懇親会を開催しました [研修OB・OG懇親会]

6月30日(土)に第5回Java・Go研修OB・OG懇親会を、freee株式会社の場所をお借りして開催しました。今回からは、Java研修もしくはGo研修の修了生を参加資格として開催しています。

IMG_0327.JPG

第4回と同様に2部構成にしました。私も入れて39名が参加しました。

  第1部 14:30〜17:00 技術セッション
  第2部 17:00〜19:30 懇親会

今回の技術セッションは、研修修了生から以下の発表を行ってもらいました。
  • リザストを支えるサーバー技術
  • ぐるなび紹介
  • Revisit: Groove X
  • Node.jsの最新動向
  • freee紹介

今回は、前回よりも転職しました(します)という報告する人が多く、時代の流れを感じました。技術セッションの内容は説明しませんが、Node.jsの古川陽介さんは、スライドを公開しています(こちらです)。

技術セッション後に、そのまま会場で懇親会を開催しました。

IMG_0340.JPG

IMG_0341.JPG

最後に全員で写真を撮って、懇親会は終了しました。二次会は、そのまま同じ場所で開催し、freee社を後にしたのは21時30分頃でした。

IMG_0344.JPG

IMG_0346.JPG

来年の第6回では、新たなGo研修の修了生を迎えての開催となります。

コメント(0) 
前の10件 | -