SSブログ

『プログラマー現役続行』から12年 [プログラマー現役続行]

雑誌に執筆した記事をまとめて書籍にした『プログラマー現役続行』から12年が過ぎ(改訂版である『プログラマー”まだまだ”現役続行』からは9年)、60歳になりました。

プログラマー現役続行 (技評SE新書)

プログラマー現役続行 (技評SE新書)

  • 作者: 柴田 芳樹
  • 出版社/メーカー: 技術評論社
  • 発売日: 2007/09
  • メディア: 新書

この本で現役続行に必要な7つの力として、「論理思考力」、「読みやすいコードを書く力」、「継続学習力」、「コンピュータサイエンスの基礎」、「朝型力」、「コミュニケーション力」、「英語力」を説明しています。それらに関して、この12年間私自身がどうであったかを簡単に振り返ってみたいと思います。

論理思考力

現在、メルペイでbackendのソフトウェアエンジニアとしてソフトウェア開発を行っていますが、何か問題が発生した場合に、仮説によって推定された原因から、発生している問題が論理的に説明できるかという問いは常に行っています。一方で、間違った仮説を立ててしまい、問題が説明できずに、さらなる調査にさらに時間を要してしまうこともあります。

ソフトウェア開発では、デバッグや問題調査は避けて通れないため、論理的に説明できなければ納得しないという態度は常に必要です。

読みやすいコードを書く力

長年ソフトウェアを開発していても、他人が読んだときに読みやすいかと振り返りながらコードを書くのは簡単ではないです。自分ではよいと思っても、レビューで指摘されることもあり、まだまだなと思うことがあります。

継続学習力

継続的に学習することに関しては、この12年間でさまざまな社内外の勉強会を開催したり、技術書を翻訳したり(この12年間で12冊)、技術書の英語の原著の草稿をレビューしたりとやってきました。ただ、それ以外の一人で学習するというのが少なかったと思います。現在は、私にとって18冊目となる技術書の翻訳(2020年春の出版予定)を通して、Java 10以降のJavaの概要を学んでいます。

コンピュータサイエンスの基礎

この12年間では、リコーに勤務している頃に『Linux Kernel Development』の社内読書会をやったり、『プログラミング作法』の第1章「スタイル」と第2章「アルゴリズムとデータ構造」の指導を新卒新入社員に行ったりしました。

現在も行っているGo言語研修やJava言語研修では、必ずと言ってよいぐらいハッシュテーブルを説明することが多いです。逆にきちんと説明できる受講生はほとんどいないです。

最近では、復習を兼ねて、『Introduction to Computing Systems: From Bits & Gates to C & Beyond』を読んでいますが、忘れていることも多いです。P型トランジスタとN型トランジスタから始まりますが、コンピュータがどのように構築されているかを知るにはお勧めの本です。

朝型力

早朝に何らかの活動を行うことは、ずっと続いています。特に、技術書の翻訳作業は基本は朝です。出社前のスターバックスだったり、通勤電車内だったりします。メルペイで働き始めてからは、出社前にスターバックスへ行くとことはなく、もっぱら通勤電車内で翻訳作業をしています。

コミュニケーション力

相手に分かるように説明することに関して、自分自身が向上しているかについては、何とも言えないかなと思っています。ただ、Java言語研修やGo言語研修では、できるだけ受講生の理解レベルに合わせて質問に回答するように努めてはいますが、なかなか難しいです。

英語力

英語に関しては、ほとんど進歩していないと思います(「英語とTOEIC」)。普段は、ポッドキャストでBBC、NBC、CBSといったニュースを聞いてはいますが、日本語のニュースを何かしながらながらで聞いていても理解できるように、何かしながらながらでも英語のニュースを聞いて理解できるレベルには到達しそうにないです。おそらく、多くの英語を速く読む努力が足りないのだと思います。話す方に関しても、普段英語で話す機会もこの12年間はほとんどないので、後退しているのではないかと思います。

まとめ

何歳までソフトウェア開発を仕事として続けられるかは分かりませんが、スマフォ決済の始まりの時代にそのシステム開発に従事でき、一方でGo言語研修やJava言語研修を通して言語の知識だけでなく、私自身の経験を伝えていくことができるのは、幸運なのかもしれません。
コメント(0) 

ソフトウェアエンジニアとして転機(3) [ソフトウェアエンジニアとして転機]

Fuji Xerox 6060ワークステーション


Fuji Xerox 6060 ワークステーション
http://www.fujixerox.co.jp/company/profile/history/product.html

1984年に就職して夏に配属されたのは、独自のワークステーションを開発するグループでした。当時、富士ゼロックスはBTronにも取り組んでおり、プロトタイプもあったのですが、独自にJ-Starに似たワークステーションの開発に着手しました。J-Starのソフトウェアを移植するのではなく、OS(Idris: Unixクローン)を除き、CPUボードからすべてを一から開発するプロジェクトでした。

この開発で私が初めて学んだ主な技術は、以下の通りです。
  • Unixの基本知識
  • Unixのコマンド
  • vi
  • C言語
  • Ethernetプロトコルを含むXNS(Xerox Network Systems)のプロトコル体系

Unixの基本知識、コマンド、vi

大学院の終わりの頃に、どこかの研究室にUnixワークステーションが導入されたのですが、ほとんど触ったことはありませんでした。6060ワークステーションでは、UnixクローンであるIdrisと呼ばれるOSを採用していましたし、開発にはVAXを使って、その上でBSD 4.2(?)が動作していました。当時のUnixは、今日のLinuxやmacOSなどと比べると非常にシンプルでした。
  • スレッドはなく、プロセスのみ
  • プロセス間通信は、fork/execしてパイプでの通信のみであり、共有メモリもない。
私はXNSプロトコルの設計・実装を担当したのですが、上記の単純なプロセス間通信では複雑なネットワープロトコルを実装するのは非常に困難だと判断しました。そして、OSチームにIdrisを改造して以下の機能を提供することをお願いしました。
  • 任意のプロセス間で通信するためのメッセージング機構
  • プロセス間でメモリを共有する共有メモリ機構
今日のUnix/Linuxでは当たり前の機能ですが、当時は「こんな改造したらUnixではなくなるな」と思っていました。OSチームは、共有メモリ機構をさらに発展させて共有ライブラリ機構も追加しました。今では当たり前ですが、メモリが少ない当時としては、かなり画期的だと思っていました(そして、1993年頃にSunOSでmmapが使えるようになったときも画期的だと思いました)。

今日でも使っている基本的なUnixのコマンドはこの頃に学びましたし、エディタとしてのviも学びました。しかし、今から振り返ると非常に貧弱なエディタ環境でした。80桁×24行のキャラクタ端末を使ってソースコードを編集していたので、ソースコード全体の見通しが悪かったのです。そのため、ソースコードはいつも印刷していました。印刷するといっても、当時はドットインパクト式プリンタでしたので、音がしてうるさかったです。

この6060ワークステーションの開発環境をはるかに飛躍させたのは、4.3BSDが登場して、4.3BSDにXNSプロトコルが提供され、J-Starワークステーション開発用のXDE(Xerox Development Environment)から4.3BSDが使えるようになったことです。4.3BSDに提供されたXDE用のコマンド(確かREdit)のネットワークプロトコルをリバースエンジニアリングして、同じコマンドをIdris環境にC言語で実装してからは、エディタとしてXDEが使えるようになり、マルチウィンドウやウィンドウ分割、それに、XDEからのターミナル接続などができて快適になりました。

開発ツールの整備

6060ワークステーションの開発は、ユーザに提供するアプリケーションの開発のみならず、すべての開発用ツールを独自に開発するものでした。XNSプロトコルの設計・実装を担当していましたので、英語の仕様書しかなったXNSプロトコルを理解して、Idris上で動作する以下の開発用ツールを開発しました。
  • Ethernet上のパケットをキャプチャーしたり、TCPに相当するXNSプロトコルのSPP(Sequence Packet Protocol)レベルでファイルにダンプしたりするツール。
  • Printingプロトコルを実装して、ソースコードをInterpress形式(Xerox社のPDL:Page Description Language)へ変換して、レーザープリンターへ送って印刷するツール(ドットインパクト式プリンタと違い、オフィスが静かになりました)。Interpressへの変換は他のエンジニアが実装しました。
  • Filingプロトコルを実装して、J-Starのフィルサーバを使えるようにするツール。これで、離れた開発拠点へファイルを電子的に送ることができるようになりました(これ以前は、フロッピーディスクに保存したファイルを物理的に運ぶためにバイク便を使っていました)。
  • Mailingプロトコルを実装して、Idrisからも社内の電子メールを読んだり送信できたりするようにしました。
  • リモートログイン機能。Idris間でリモートログインできるようにするためのデーモンとrlogin相当の機能。これは、私ではなく他のエンジニアが作成しました。SPPを使って実装してあり、Unix 4.3BSDに搭載されたデーモンと同じプロトコルを採用していたと思います。
6060開発の後半ではクロスコンパイル用に4.3BSDも開発環境として使っていましたので、4.3BSDでも動作するようにツールの多くを移植しました。

6060ワークステーションの開発は、私にとってUnix関連の基礎となる多くの経験を積むことができたプロジェクトでした。最初に述べた事柄に加えて、「不便なことを解決するために自分達でツールを開発して、配布する」ことを行うようになったプロジェクトでもありました。

6060ワークステーションの当時のテレビCM

こちらです。
コメント(0) 

ソフトウェアエンジニアとして転機(2) [ソフトウェアエンジニアとして転機]

富士ゼロックスへの就職

就職先として選んだのは、富士ゼロックス株式会社でした。当時は、推薦状をもらって1社受けるだけで、落ちない限り次の会社を選ぶことはなかったのと、修士課程を出て不合格になることはまれだったこともあり、富士ゼロックスに就職することになりました。情報工学科の先輩で就職した人はいなかったのですが、当時としては、福利厚生(特に住宅補助)が非常に良かったという不純な理由で選びました。

入社後の塚原研修所での3か月の新人研修期間は、ほとんどがコピー機に関連する研修ばかりで、就職する会社を間違えたと思いました。

J-Starワークステーション

配属された開発部門は、当時のJ-Starを開発している部署でした。しかし、私は、J-Starではなく、独自のワークステーションを開発する開発グループに配属されました。J-Star関連の開発に従事するようになったのは、2年後の1988年からですが、J-Starおよびその開発環境であるXDE(Xerox Development Environment)は、時代の先端を行っているソフトウェアでした。就職した1984年(Windows 95もMacintoshも登場していない)で、すでに以下の機能を備えていました。
  • ビットマップディスプレイとマウス
  • マルチウィンドウ(J-Starはタイリングのウィンドウシステムでしたが、XDEは普通にオーバーラップするウィンドウシステムでした)
  • Ethernetと各種ネットワークプロトコル
  • レーザープリンター
  • リモートデバッグ機能(別のワークステーションからデバッグできる)
  • 依存モジュールを世界中のゼロックスグループ内のファイルサーバーから自動でフェッチする機能
これらすべては大学時代は全く想像もでできませんでしたし、見たことも触ったこともありませんでした。マウスを初めて操作し、マルチウィンドウシステムでドキュメントを作成しレーザープリンターで綺麗に印刷し、ファイルサーバーにドキュメントを格納したり、電子メールを使うという体験をしたのが1984年でした。そして、Starだけでなく、ゼロックスにはすでにSmalltalk-80やInterLisp-Dの統合開発環境も存在していました。

私は、J-Starの開発グループではなく、独自のワークステーションを開発するグループに配属されたので、上記の機能の多くを独自に開発することになります。

コメント(0) 

ソフトウェアエンジニアとして転機(1) [ソフトウェアエンジニアとして転機]

60歳を前に、これまでの人生でソフトウェアエンジニアとして転機となった出来事をまとめていきたいと思います。

九州工業大学情報工学科への進学

中学3年生になったときに、父の転勤で佐賀県の嬉野から山口県の下関に引っ越しました。高校は、下関西高等学校の理数科へ進学しました。当時、理数科は普通科と異なりクラスが一つしかなかったので、三年間、クラス替えなく過ごしました。

当時、家に電卓もない時代で、そもそもコンピュータを触ったことも見たこともありませんでした。それでも、コンピュータについて学んでみたいと思い情報工学科に進学することにしました。その頃、九州で情報工学科を持っている大学は、九州大学と九州工業大学の二校だけでした。自分の成績から判断して、九州工業大学の情報工学科へ進学することにして、幸い合格できて進学しました。

当時、九州工業大学は単科大学(学部はなく、さまざまな学科から構成され、現在の工学部がある戸畑キャンパスのみ)だったためか、一般教養の教科に加えて、一年生から専門教科も教えられていました。つまり、一年生のときから、プログラミングやコンピュータの動作原理などの基礎知識の教科がありました。

初めて学んだプログラミング言語は、Fortranでした。大学では、プログラミング言語だけでなく、コンピュータの動作原理、データ構造とアルゴリズム、コンパイラの動作原理とコンパイラの作成演習といったさまざなことを学びました。振り返ってみると、社会人になってから学ぶ機会がないような知識だったと言えます。

大学時代使ったコンピュータシステムで、今日では見かけることがない以下のようなものがありました。
  • 80桁×24行の「キャラクタ端末」
  • パンチカード、マークカード、紙テープ
  • コアメモリのコンピュータ(実験で使いました)
  • APL端末(APL言語に特化した端末。ALUを含むCPUの原理をAPL言語で記述した本で学ぶ講座がありました)
  • 8インチフロッピーディスク
  • 音響カプラー
  • ラインプリンタ
  • etc
ハードウェアは進歩していきますが、ソフトウェアに関する基礎知識を学んだがの大学でした。

HOLENETの開発

大学4年生になったときに、当時の安在教授の研究室に入り、重松保弘助手の下で、HOLENET(HDLC Oriented Local Area Network)というローカルネットワークの構築に行うことになりました。大学4年と修士の2年の合計3年間は、このHOLENETのハードウェア開発、ソフトウェア開発、そして、HOLENETを使った学生実験の指導を行いました。この3年間は、九州工業大学での6年間の中でも、最も楽しく多くのことを学んだ3年間でした。

HOLENETは、通信コントローラボード作りからでした。最初は、回路図の読み方から始まり、DMAコントローラとCPUとの間でどのようなタイミングシーケンスでDMA転送が行われるのか、割り込みとCPUの動きといったことを座学で学びました。また、HDLC/SDLC用の通信LSIを使うので、ネットワークプロトコルも当時はかなり勉強しました。ネットワークプロトコル関連では、当時の電電公社の横須賀通信研究所のデータ通信網研究室には、2回もインターンとして行きました。

実際の通信コントローラボードは、2枚の基板から構成され、1枚は1層のプリント基板であり、もう1枚はラッピングで作るというものです。その2枚1組の通信コントローラボードの5セットをほぼ一人で組み上げて、プローブが1つしかないオシロスコープだけで5セットをデバッグしました。5セットがある程度安定するまで何か月を要したか覚えていませんが、長い期間ハードウェアをデバッグしていました。ハードウェアが安定してきたら、その上で動作する通信ソフトウェアをZ80アセンブリ言語でひたすら書いてはデバッグしていました。

九州工業大学での最後の3年間は、ハードウェアのデバッグから、Z80アセンブリ言語でのプログラミング、ネットワークプロトコルと広範囲な経験をすることができました。

まとめ

九州工業大学への入学は、ソフトウェアエンジニアとしてのキャリアの始まりであり、その後のキャリアにとっての基礎を学ぶことができました。「コンピュータの基礎はいつ学ぶのか」でも書いていますが、今日では学んだり経験したりすることが難しいことの多くを大学で経験したと思います。
コメント(0) 

技術研修の予習 [プログラマー現役続行]

長年、いわゆるバイブル本を使った技術教育を行っていますが、昨年から始めた『Effective Java 第3版』研修では、事前予習での質問数がかなり少ないです。本来、さまざまな基礎知識を学んだ後に読まないと理解するのが難しいのが『Effective Java 第3版』なのです。そのため、通常のJava研修では、一年以上の研修の最後に学習してもらいます。

私のJava研修やGo研修の事前予習では、「読んで理解できていない箇所」を質問表に記入して欲しいのですが、そもそも、きちんと「理解できているか」という自問自答をせずに、流し読みしている人が多い印象を受けます。なぜなら、質問がない部分の記述に関して、「○○○○の部分はどのような意味か説明してください」と逆に私から質問すると、答えられない人がほとんどです。

感覚的なものに過ぎませんが、真剣に理解できているかと自問しなが予習する人ほど質問数が多くなります。逆に、質問が全くない人は、「完全に理解している」のではなく、「ほとんど理解していない」ことが多いです。

最近の例として、Go言語研修で多くの質問をされたのは@yosuke_furukawaさんですし、『Effective Java第3版』研修では、@orisanoさんです。
コメント(0)